【发布时间】:2018-08-24 16:42:48
【问题描述】:
我正在使用 java 加密文本并尝试在 Linux 上使用 Openssl 对其进行解密。我正在使用 AES-128 和 CBC。
当我使用 Openssl 解密 Java 生成的 64 个字符的加密字符串时,我从 Openssl 收到“解密错误”错误。但是如果字符串是 16 个字符,Openssl 可以正确解密。
我在 Linux 上运行它:
echo ${encryptedText} | ./openssl aes-128-cbc -d -a -K $( echo -n ${KEY} | hexdump -v -e '/1 "%02X"') -iv $(echo -n ${IV} | hexdump -v -e '/1 "%02X"')
注意:$encryptedText、$KEY、$IV 作为字符串而不是十六进制传递。此命令将其转换为十六进制: $( echo -n ${KEY} | hexdump -v -e '/1 "%02X"')
并收到此错误:
358048944:error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length:evp_enc.c:460:
我的Java加密代码,基本上是:
import javax.crypto.*;
Cipher cipher;
SecretKey key;
String IV;
IvParameterSpec params;
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
String randomString = GENERATE_RANDOM_TYPEABLE_ASCII(16_LENGTH);
key = new SecretKeySpec(randomString.getBytes("UTF-8"), "AES");
IV = GENERATE_RANDOM_TYPEABLE_ASCII(16_LENGTH);
params = new IvParameterSpec(IV.getBytes("UTF-8"));
cipher.init(Cipher.ENCRYPT_MODE, key, params);
byte[] encryptedTextBytes = cipher.doFinal((decryptedString).getBytes("UTF-8")); // decryptedString is passed as a parameter
String encryptedText = new Base64().encodeAsString(encryptedTextBytes);
return encryptedText;
我不明白为什么我的加密适用于 16 个字符串,但对 64 个字符串无效。
另一件需要注意的重要事情是,如果我使用http://aes.online-domain-tools.com/ 等在线工具解密文本,则字符串将完美解密。所以我认为我的加密工作正常,但由于某种原因,OpenSSL 出现了问题。
【问题讨论】:
-
在使用openssl解密密文之前,它肯定无法工作。
-
@James 这就是为什么我在上面的 openssl 命令中有 -a 标志。我错过了什么吗?感谢您的回复
-
哦,是的,我忘记了那个标志。
-
我看不出它对于 16 字节和 64 字节有何不同,但是 PKCS5 填充对于 AES 的定义并不明确。也许尝试 PKCS7 以防 Java 用它做一些奇怪的事情?
标签: java encryption openssl aes