我得到异常,而按照下面的逻辑进行解密。请建议我在下面的代码片段的任何问题。加密是罚款和能够加密。
public String encryptDataSymmetric(String dataTobeEncrypted) {
String encryptedData = null;
try {
Charset CHARSET = Charset.forName("UTF8");
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
SecureRandom securerandom = new SecureRandom();
KeyGenerator keygenerator = KeyGenerator.getInstance("AES");
keygenerator.init(192, securerandom);
SecretKey key = keygenerator.generateKey();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
// cipher.init(Cipher.ENCRYPT_MODE, key, ivspec);
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(new byte[cipher.getBlockSize()]));
encryptedData = DatatypeConverter.printBase64Binary(cipher.doFinal(dataTobeEncrypted.getBytes(CHARSET)))
.trim();
System.out.println("---encryptedData-----" + encryptedData);
} catch (Exception ex) {
ex.printStackTrace();
}
return encryptedData;
}
public String decryptDataSymmetric(String dataTobeDecrypted) {
String decryptedData = null;
try {
Charset CHARSET = Charset.forName("UTF8");
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
SecureRandom securerandom = new SecureRandom();
KeyGenerator keygenerator = KeyGenerator.getInstance("AES");
keygenerator.init(192, securerandom);
SecretKey key = keygenerator.generateKey();
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(new byte[cipher.getBlockSize()]));
decryptedData = new String(
DatatypeConverter.parseBase64Binary(new String(cipher.doFinal(dataTobeDecrypted.getBytes()))));
System.out.println("---decryptedData----" + decryptedData);
} catch (Exception ex) {
ex.printStackTrace();
}
return decryptedData;
}
javax.crypto.BadPaddingException:填充块在org.bouncycastle.jce.provider.JCEBlockCipher.engineDoFinal(未知源)处损坏
2条答案
按热度按时间qyswt5oh1#
不是一个Java爱好者,但是你需要从Base64解码到字节数组,在你解密它的时候,在把它传递给密码之前,而不是在你试图解密它之后。
Base64编码是将字节流编码为ascii字符,以便于传输。在传输的接收端,需要先将base64编码转换为字节流。
解密之后,你必须把解密后的字节数组转换成字符串。
总之,解密必须撤消加密方法的步骤。
加密方法:
解密方法:
话虽如此,你的代码还是有一些问题。我能够把这个Java示例代码放在一起,只演示我在这里要说明的几点。
*首先,不要将AES与CBC单独使用!!!它容易受到Padding Oracle攻击。无需详细说明,这意味着如果您的系统给出加密消息是否正确填充的哪怕是最轻微的提示(甚至是时间差),就可以非常有效地解密您的加密值。出于同样的原因,不要使用我在下面编写的代码。
jaql4c8m2#
我同意PhazorP上面的评论。
我鼓励你使用一个经过认证的加密算法,这是我不久前写的一个简短的博客article,可能会有帮助。
如果你想看一下,这里也有一些AES-GCM的java代码。