Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -----BEGIN RSA PRIVATE KEY-----
- Proc-Type: 4,ENCRYPTED
- DEK-Info: DES-EDE3-CBC,56F3A98D9CFFA77A
- X5h7SUDStF1tL16lRM+AfZb1UBDQ0D1YbQ6vmIlXiK....
- .....
- /KK5CZmIGw==
- -----END RSA PRIVATE KEY-----
- import java.security.Key;
- import java.security.KeyFactory;
- import java.security.PrivateKey;
- import java.security.spec.PKCS8EncodedKeySpec;
- import javax.crypto.EncryptedPrivateKeyInfo;
- import javax.crypto.SecretKeyFactory;
- import javax.crypto.spec.PBEKeySpec;
- public String decrypt(String keyDataStr, String passwordStr){
- // This key data start from "X5... to =="
- char [] password=passwordStr.toCharArray();
- byte [] keyDataBytes=com.sun.jersey.core.util.Base64.decode(keyDataStr);
- PBEKeySpec pbeSpec = new PBEKeySpec(password);
- EncryptedPrivateKeyInfo pkinfo = new EncryptedPrivateKeyInfo(keyDataBytes);
- SecretKeyFactory skf = SecretKeyFactory.getInstance(pkinfo.getAlgName());
- Key secret = skf.generateSecret(pbeSpec);
- PKCS8EncodedKeySpec keySpec = pkinfo.getKeySpec(secret);
- KeyFactory kf = KeyFactory.getInstance("RSA");
- PrivateKey pk=kf.generatePrivate(keySpec);
- return pk.toString();
- }
- java.io.IOException: DerInputStream.getLength(): lengthTag=50, too big.
- at sun.security.util.DerInputStream.getLength(DerInputStream.java:561)
- at sun.security.util.DerValue.init(DerValue.java:365)
- at sun.security.util.DerValue.<init>(DerValue.java:294)
- at javax.crypto.EncryptedPrivateKeyInfo.<init> (EncryptedPrivateKeyInfo.java:84)
- static RSAPrivateKey decrypt(String keyDataStr, String ivHex, String password)
- throws GeneralSecurityException
- {
- byte[] pw = password.getBytes(StandardCharsets.UTF_8);
- byte[] iv = h2b(ivHex);
- SecretKey secret = opensslKDF(pw, iv);
- Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
- cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
- byte[] pkcs1 = cipher.doFinal(Base64.getMimeDecoder().decode(keyDataStr));
- /* See note for definition of "decodeRSAPrivatePKCS1" */
- RSAPrivateCrtKeySpec spec = decodeRSAPrivatePKCS1(pkcs1);
- KeyFactory rsa = KeyFactory.getInstance("RSA");
- return (RSAPrivateKey) rsa.generatePrivate(spec);
- }
- private static SecretKey opensslKDF(byte[] pw, byte[] iv)
- throws NoSuchAlgorithmException
- {
- MessageDigest md5 = MessageDigest.getInstance("MD5");
- md5.update(pw);
- md5.update(iv);
- byte[] d0 = md5.digest();
- md5.update(d0);
- md5.update(pw);
- md5.update(iv);
- byte[] d1 = md5.digest();
- byte[] key = new byte[24];
- System.arraycopy(d0, 0, key, 0, 16);
- System.arraycopy(d1, 0, key, 16, 8);
- return new SecretKeySpec(key, "DESede");
- }
- private static byte[] h2b(CharSequence s)
- {
- int len = s.length();
- byte[] b = new byte[len / 2];
- for (int src = 0, dst = 0; src < len; ++dst) {
- int hi = Character.digit(s.charAt(src++), 16);
- int lo = Character.digit(s.charAt(src++), 16);
- b[dst] = (byte) (hi << 4 | lo);
- }
- return b;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement