如何在Javascript中使用AES CBC零填充加密和在Java中解密

时间:2019-04-22 14:12:06

标签: javascript java

我需要用Javascript加密和用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));

我希望Java或Java中的密文相同,但值不同

1 个答案:

答案 0 :(得分:0)

在JavaScript代码键和iv中必须以WordArrays的形式传递。为此,CryptoJS提供了转换功能:

var key = CryptoJS.enc.Latin1.parse("CLAVE00000000000");
var iv = CryptoJS.enc.Latin1.parse("VECTOR0000000000");

如果密钥作为字符串传递(在已发布的代码中就是这种情况),则将其视为密码短语并用于派生密钥和IV(请参阅here,第部分密码输入)。

此外,在JavaScript代码中,padding: CryptoJS.pad.Pkcs7padding: CryptoJS.pad.ZeroPadding中的零字节填充必须替换为Pkcs7填充(encrypt而不是decrypt) -打电话。

然后,JavaScript代码的加密与Java代码的加密(所用消息,密钥和IV的加密sEAtASy0J3+Ya3g+Afcj3Q==

替换填充是一个猜测,因为尚未发布Java代码的encrypt-和decrypt方法,因此无法直接检查。但是,关于切换到Pkcs7时的相同加密,这应该是正确的。