如何使用Javascript中的AES CBC零填充进行加密并使用Java进行解密
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Javascript中的AES CBC零填充进行加密并使用Java进行解密相关的知识,希望对你有一定的参考价值。
我需要在javascript和Decrypt中加密Java,但是当我在Java中加密时,文本是不同的,我使用了不同的脚本但相同的算法,AES-128 CBC零填充。
这适用于Intellij IDEA中的Javascript和Java 7
使用Javascript:
var message = "3258";
var key = "CLAVE00000000000";
var iv = "VECTOR0000000000";
var ciphertext = CryptoJS.AES.encrypt(message, key, {iv: iv, padding: CryptoJS.pad.ZeroPadding, mode: CryptoJS.mode.CBC});
alert(ciphertext.toString());
var decrypt = CryptoJS.AES.decrypt(ciphertext, key, {iv: iv, padding: CryptoJS.pad.ZeroPadding, mode: CryptoJS.mode.CBC});
alert(CryptoJS.enc.Utf8.stringify(decrypt).toString());
Java的:
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
keyGenerator.init(AES_128);
String key = "CLAVE00000000000";
String IV = "VECTOR0000000000";
System.out.println("1. Message to Encrypt: " + new String(message, StandardCharsets.UTF_8));
byte[] cipherText = encrypt(key, IV, message);
System.out.println("2. Encrypted Text: " + Base64.getEncoder().encodeToString(cipherText));
byte[] decryptedString = decrypt(key, IV, cipherText);
System.out.println("3. Decrypted Message : " + new String(decryptedString));
我希望密码文本在Javascript或Java中相同,但值不同
在JavaScript代码密钥和iv必须作为WordArrays
传递。为此,CryptoJS
提供转换功能:
var key = CryptoJS.enc.Latin1.parse("CLAVE00000000000");
var iv = CryptoJS.enc.Latin1.parse("VECTOR0000000000");
如果密钥作为字符串传递(就像在发布的代码中那样),则将其视为密码并用于派生密钥和IV(请参阅here,密码输入部分)。
此外,在JavaScript代码中,零字节填充必须由padding: CryptoJS.pad.Pkcs7
-和padding: CryptoJS.pad.ZeroPadding
-call中的Pkcs7-Padding(encrypt
而不是decrypt
)替换。
然后,JavaScript代码的加密对应于Java代码的加密(sEAtASy0J3+Ya3g+Afcj3Q==
用于所使用的消息,密钥和IV)。
替换填充是一种猜测,因为Java代码的encrypt
-和decrypt
方法尚未发布,因此无法直接检查。但是,关于切换到Pkcs7时的相同加密,这应该是真的。
以上是关于如何使用Javascript中的AES CBC零填充进行加密并使用Java进行解密的主要内容,如果未能解决你的问题,请参考以下文章
如何让 Ruby AES-256-CBC 和 PHP MCRYPT_RIJNDAEL_128 一起玩得很好
如何使用java解码用openssl aes-128-cbc编码的字符串?
AES (aes-cbc-128, aes-cbc-192, aes-cbc-256) 使用 openssl C 加密/解密