我需要用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中的密文相同,但值不同
答案 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.Pkcs7
和padding: CryptoJS.pad.ZeroPadding
中的零字节填充必须替换为Pkcs7填充(encrypt
而不是decrypt
) -打电话。
然后,JavaScript代码的加密与Java代码的加密(所用消息,密钥和IV的加密sEAtASy0J3+Ya3g+Afcj3Q==
)
替换填充是一个猜测,因为尚未发布Java代码的encrypt
-和decrypt
方法,因此无法直接检查。但是,关于切换到Pkcs7时的相同加密,这应该是正确的。