首先,我使用OpenSSL生成一个私有RSA密钥文件,然后将其转换为加密的“ der”文件:
$ openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der
接下来,我尝试使用以下代码从Java解密此文件(在此阶段,我已经byte[] key
使用本文底部的代码将文件读入数组):
public static byte[] decryptPrivateKey(byte[] key) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
PBEKeySpec passKeySpec = new PBEKeySpec("p".toCharArray()); //my password
EncryptedPrivateKeyInfo encryptedKey = new EncryptedPrivateKeyInfo(key);
System.out.println(encryptedKey.getAlgName());
//PBEWithMD5AndDES
System.out.println("key length: " + key.length);
//key length: 677
SecretKeyFactory keyFac = SecretKeyFactory.getInstance(encryptedKey.getAlgName());
SecretKey passKey = keyFac.generateSecret(passKeySpec);
// Create PBE Cipher
Cipher pbeCipher = Cipher.getInstance(encryptedKey.getAlgName());
// Initialize PBE Cipher with key and parameters
pbeCipher.init(Cipher.DECRYPT_MODE, passKey, encryptedKey.getAlgParameters());
// Decrypt the private key(throws the exception)
return pbeCipher.doFinal(key);
}
我在上面的return语句上获得了以下堆栈跟踪:
Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.PBECipherCore.doFinal(PBECipherCore.java:422)
at com.sun.crypto.provider.PBEWithMD5AndDESCipher.engineDoFinal(PBEWithMD5AndDESCipher.java:316)
at javax.crypto.Cipher.doFinal(Cipher.java:2087)
at roland.test.crypto.Test.decryptPrivateKey(Test.java:96)
at roland.test.crypto.Test.getPrivateKey(Test.java:74)
at roland.test.crypto.Test.test(Test.java:58)
at roland.test.crypto.Test.main(Test.java:30)
从“ der”文件中读取密钥作为字节数组:
public static PrivateKey getPrivateKey() throws Exception {
byte[] key = null;
try(final InputStream resourceStream = getMyClass().getResourceAsStream("private_key.der")) { //$NON-NLS-1$\r
key = ByteStreams.toByteArray(resourceStream);
} catch (IOException e) {
e.printStackTrace();
}
key = decryptPrivateKey(key);
}
解决方案是:
return pbeCipher.doFinal(encryptedKey.getEncryptedData());
我有一个安全课程的项目,但我有一个问题。 基本上,我试图加密然后解密一个密码,但我得到这个解密错误。 我这样做对吗。我在关注2012年的一篇文章。还安全吗? 我还尝试替换算法,但似乎没有任何效果: “AES”、“RSA/ECB/PKCS1Padding”、“PbeWithHMACSHA256andDesede”..以及更多
虽然对于调试来说,当我试图解密(使用相同的代码)app1上的加密url时,它工作得很好。但不知道是什么原因导致了APP2的异常? 这是代码
运行以下代码时,如何解决此错误? 产出:
我在java类中发现了一个解密错误: 我能做些什么来解决这个问题? 更新: 我忘了提到它工作了一次,当第二次我试图再次执行它时,它抛出了上面提到的错误。
所有人。我基本上是试图加密和解密一个字符串类型的密码。我得到的错误是javax . crypto . illegalblocksizeexception:使用填充密码解密时,输入长度必须是8的倍数。 我尝试用指定的填充做其他算法,例如AES/CBC/NoPadding。但得到不同的错误是Java . security . invalidkeyexception:无效的AES密钥长度:5个字节。
使用密钥加密和解密的新值(value1)。 两个示例加密值(enctypedValue1,enctypedValue2)正在使用相同的密钥进行解密。encryptedValue2在使用相同密钥解密时出现问题。 使用密钥加密和解密的新值(value4)。 在解密encryptedValue2时,我得到以下异常: 以下是我到目前为止得出的结论。 如果这个问题发生了,它应该发生在所有的值上。 这是一个特