openssl blowfish解密的Java等价物

openssl blowfish解密的Java等价物,java,encryption,Java,Encryption,我有一个由另一个系统提供的base64编码的二进制数据文件,我可以使用下面的openssl命令行成功地解密该文件 openssl enc -d -blowfish -a -in base64d_encrypted_content.txt (不幸的是,我所知道的关于正在应用的加密的一切) 在Java中,如何执行相同的解密 目前我有 BufferedReader reader = new BufferedReader(new InputStreamReader(content.getInputSt

我有一个由另一个系统提供的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*..)

你有缺点。什么填充模式用于加密原始密码文本?您需要设置Java代码以期望这种形式的填充

如果你不知道,那么依次尝试每种允许的填充物。从PKCS5/PKCS7开始,因为它可能是最常见的

埃塔

你的问题可能不仅仅是填充。您需要确保两侧的所有元素都是相同的

  • 密钥必须是逐字节相同的
  • 模式必须相同:CBC、CTR或ECB(ugh)
  • IV必须是相同的,一个字节接一个字节
  • 填充必须相同

不要依赖默认值,显式设置所有默认值。使用key和IV,不检查字符,检查字节。

经过大量搜索,我发现这似乎提供了一种在Java中复制openssl命令行的方法

byte[] decrypted = OpenSSL.decrypt("blowfish", password.toCharArray(), base64EncryptedBytes);

当我有时间的时候,我会深入研究他们的代码,找出到底在做什么。同时,它看起来是开始的地方。

这很有意义-你知道openssl命令将假定填充什么,或者我将如何找到它吗?刚刚在Cipher.getInstance(“Blowfish/ECB/NoPadding”)找到可用选项列表;他是获胜者。不幸的是,输出是乱码的,但希望我能找到原因——至少乱码的输出似乎是从一个异常向前迈出的一步。怎么乱码?第一个街区乱码了?第二个和随后的块是否混乱?最后一个街区的尽头有一些垃圾?NoPadding意味着它不检查填充,所以你可能仍然有填充,只是没有检查。它似乎是完全随机的输出。我已经设法掌握了实际进行加密的代码(似乎只是调用了
openssl enc-blowfish-a-salt-in original.txt-out encrypted.txt-pass-pass:secret
),所以我正在进一步挖掘,希望能告诉我发生了什么。