簡體   English   中英

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

[英]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代碼的encryptdecrypt方法尚未發布,因此無法直接檢查。 但是,關於切換到Pkcs7時的相同加密,這應該是真的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM