![](/img/trans.png)
[英]AES CBC: JavaScript/CryptoJS Encrypt -> Golang Decrypt
[英]How Encrypt with AES CBC Zero Padding in Javascript and decrypt with 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(請參見此處 , 密碼輸入部分)。
此外,在JavaScript代碼中,Zero-Byte-Padding必須由encrypt
- decrypt
調用中的Pkcs7-Padding( padding: CryptoJS.pad.Pkcs7
而不是padding: CryptoJS.pad.ZeroPadding
)替換。
然后JavaScript代碼的加密對應於Java代碼的加密(對於使用的消息,密鑰和IV, sEAtASy0J3+Ya3g+Afcj3Q==
)。
替換填充是一種猜測,因為Java代碼的encrypt
和decrypt
方法尚未發布,因此無法直接檢查。 但是,關於切換到Pkcs7時的相同加密,這應該是真的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.