大家好我在openssl_encrypt
使用算法' aes-256-cbc'
键:C4E30455853D4949A8E91B2C366BE9DE
矢量:5686044872102713
加密字符串:ak9YSTd6RXU5TENocUxQUGxieVhpZ3VqSlFiQUdndGZrbVJvbEliTGZjZz0=
这是我用于解密的Java函数:
public static String Decrypt_AES_FromBase64(String AEncryptedText, String AKey32Bytes, String AVectorNum16Bytes) {
try {
byte[] vEncryptedBytes = Base64.getDecoder().decode(AEncryptedText);
Key SecretKey = new SecretKeySpec(AKey32Bytes.getBytes(), "AES");
IvParameterSpec vSpec = new IvParameterSpec(AVectorNum16Bytes.getBytes());
Cipher vCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
vCipher.init(Cipher.DECRYPT_MODE, SecretKey, vSpec);
return new String(vCipher.doFinal(vEncryptedBytes));
} catch (Exception e) {
Common.mContext.getLogger().log(e.toString());
return "";
}
}
当我尝试解密时,我有错误:
javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
有人可以说出错了吗?
答案 0 :(得分:2)
加密字符串AKey32Bytes
是双Base64编码。
而不是AKey32Bytes.getBytes()
,您需要将Base64的两倍加密解码为二进制。
加密字符串:
ak9YSTd6RXU5TENocUxQUGxieVhpZ3VqSlFiQUdndGZrbVJvbEliTGZjZz0=
一次Base64解码后:
jOXI7zEu9LChqLPPlbyXigujJQbAGgtfkmRolIbLfcg=
经过第二次Base64解码(以十六进制显示,因为它不是二进制):
8CE5C8EF312EF4B0A1A8B3CF95BC978A0BA32506C01A0B5F9264689486CB7DC8
这就是需要提供给解密功能的东西。
解密结果是:
(十六进制)257531362A2179704B40577255516272
(ASCII格式):"%u16 *!ypK @ WrUQbr" (所有有效的ASCII字符)
注意:有一整套PKCS#7填充(十六进制):10101010101010101010101010101010
尽管说到这一点很痛苦,但从正确的填充中我可以认为解密是成功的。
请参阅Cryptomathic AES CALCULATOR