我已经尝试了几天在java中解密用openssl加密的消息。邮件使用以下命令加密:
openssl enc -e -aes-256-cbc -kfile $ file.key -in toto -out toto.enc。
文件file.key包含256位的对称密钥。在命令中没有指定salt,但文件以Salted__开头。这是我编写的用于尝试解密文件的类,但即使删除文件的16个字符即可获取任何内容,即:Salted__ + salt加密。我明白openssl默认做了。当我尝试解密时,会抛出与加密文本相关的异常。
有人可以帮助我吗?轨道 ?一个想法?
非常感谢。
代码:
public class Java {
private static SecretKey key = null;
private static Cipher cipher = null;
public static void main(String[] args) throws Exception
{
String filename = RESOURCES_DIR + "toto.enc";
byte[] key = Base64.decode("2AxIw+/AzDBj83OILV9GDpOs+izDFJEhD6pve/IPsN9=");
SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] test = Base64.decode(readFile(filename));
byte[] decryptedBytes = cipher.doFinal(test);
String decryptedText = new String(decryptedBytes, "UTF8");
System.out.println("After decryption: " + decryptedText);
}
public final static String RESOURCES_DIR = "C:/Users/toto/Desktop/";
static String readFile(String filename) throws FileNotFoundException, IOException {
FileReader fr;
BufferedReader br;
fr = new FileReader(new File(filename));
br = new BufferedReader(fr);
String str;
String res = "";
while ((str = br.readLine()) != null) {
res += str;
}
return res;
}
}
错误:
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:313)
at javax.crypto.Cipher.doFinal(Cipher.java:2131)
at deciphertodeploytest6.Java.main(Java.java:52)
答案 0 :(得分:1)
不,file.key不包含密钥。 openssl enc -kfile
读取密码,它不是密钥,但用于派生密钥以及IV(如果适用,它就在这里);请参见手册页。此密钥派生默认使用随机盐,并且自2016-08起,默认哈希取决于您未声明的OpenSSL版本。
此外,Java中的Cipher.getInstance("AES")
默认为ECB而不是您需要的CBC。 (它也默认为'PKCS5'填充,它与OpenSSL匹配,即使在技术上它应该被称为PKCS7而不是PKCS5。)
要在Java中匹配openssl enc
使用的PBKDF(以及密钥和IV),您可以使用BouncyCastle或代码等同于OpenSSL的EVP_BytesToKey
;看到dupe或near-dupe Qs:
Java equivalent of an OpenSSL AES CBC encryption
How to decode a string encoded with openssl aes-128-cbc using java?
How to decrypt AES encrypted file with '-nosalt' param
How to decrypt file in Java encrypted with openssl command using AES?
以及我对规范https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption/#35614