我有一个由另一个系统提供的base64编码二进制数据文件,我可以使用以下openssl命令行成功解密。
openssl enc -d -blowfish -a -in base64d_encrypted_content.txt
(不幸的是,我所知道的关于正在应用的加密的所有内容)
在Java中,我该如何执行相同的解密?
目前我有......
BufferedReader reader = new BufferedReader(new InputStreamReader(content.getInputStream()));
StringBuffer buffer = new StringBuffer();
String line = reader.readLine();
while (line != null) {
buffer.append(line + "\n");
line = reader.readLine();
}
reader.close();
BASE64Decoder decoder = new BASE64Decoder();
byte[] decodedBytes = decoder.decodeBuffer(buffer.toString());
SecretKeySpec blowfishKey = new SecretKeySpec(password, "Blowfish");
Cipher blowfishCipher = Cipher.getInstance("Blowfish");
blowfishCipher.init(Cipher.DECRYPT_MODE, blowfishKey);
byte[] decryptedBytes = blowfishCipher.doFinal(decodedBytes);
但我得到以下例外......
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
at com.sun.crypto.provider.BlowfishCipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
答案 0 :(得分:2)
经过大量搜索后,我遇到了not-yet-commons-ssl,这似乎提供了一种在Java中复制openssl命令行的方法......
byte[] decrypted = OpenSSL.decrypt("blowfish", password.toCharArray(), base64EncryptedBytes);
当我抽出一些时间时,我会深入研究他们的代码并找出究竟正在做什么。与此同时,OpenSSL.java似乎是开始的地方。
答案 1 :(得分:1)
你有填充错误。填充模式用于加密原始密文?您需要将Java代码设置为期望填充形式。
如果您不知道,请依次尝试每个允许的填充。从PKCS5 / PKCS7开始,因为它可能是最常见的。
ETA
您的问题可能不仅仅是填充。您需要确定两边的所有元素都相同。
不要依赖默认值,明确设置所有默认值。使用密钥和IV,不要检查字符,检查字节。