我有一个远程系统使用河豚加密向我发送经过openssl命令行程序加密的数据。
具体来说,正在运行的命令是:
openssl enc -blowfish -a -salt -in original.txt -out encrypted.txt -pass pass:secret
对于产生
This is a test.
的输入U2FsdGVkX19bSsC3dXTOYssoOK5L3THkhXgiB7X1Trv6SaVO2TGz0g==
我正在尝试使用以下代码在Java的另一端解密此内容。
// requires commons-io and commons-codec
public void testDecryption() throws Exception {
File encryptedFile = new File("encrypted.txt");
String password = "secret";
byte[] base64EncryptedBytes = FileUtils.readFileToByteArray(encryptedFile);
byte[] encryptedBytes = new Base64().decode(base64EncryptedBytes);
SecretKeySpec blowfishKey = new SecretKeySpec(password.getBytes("ASCII"), "Blowfish");
Cipher blowfishCipher = Cipher.getInstance("Blowfish/ECB/NoPadding");
blowfishCipher.init(Cipher.DECRYPT_MODE, blowfishKey);
byte[] decryptedContent = blowfishCipher.doFinal(encryptedBytes);
System.out.println(new String(decryptedContent));
}
而不是当前产生的原始消息...
êõïÖ¶M≥ O]¢∞;Z<HVÖ_’˚h‘:O›c=w◊®zÉ9˘
我究竟做错了什么?
一些可能的理论
openssl enc -d -blowfish -a -in encrypted.txt
从命令行解密文件,则密码提示标记为'bf-cbc',这表示使用Blowfish / CBC而不是Blowfish / ECB,但是,如果我使用该命令,则会得到java.security.InvalidKeyException: Parameters missing
异常,但我不确定我可以添加什么参数。 getBytes("ASCII")
不正确。 最佳答案
经过大量搜索后,我遇到了not-yet-commons-ssl,它似乎提供了执行此操作的方法...
byte[] decrypted = OpenSSL.decrypt("blowfish", password.toCharArray(), base64EncryptedBytes);
当我有时间的时候,我将深入研究他们的代码,并确切地了解正在做什么。同时,看起来OpenSSL.java是开始的地方。