如何使用Javascript中的AES CBC零填充进行加密并使用Java进行解密

问题描述 投票:0回答:1

我需要在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 java
1个回答
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.Pkcs7-和padding: CryptoJS.pad.ZeroPadding-call中的Pkcs7-Padding(encrypt而不是decrypt)替换。

然后,JavaScript代码的加密对应于Java代码的加密(sEAtASy0J3+Ya3g+Afcj3Q==用于所使用的消息,密钥和IV)。

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

© www.soinside.com 2019 - 2024. All rights reserved.