【问题标题】:How Encrypt with AES CBC Zero Padding in Javascript and decrypt with Java如何在 Javascript 中使用 AES CBC 零填充进行加密并使用 Java 进行解密
【发布时间】:2019-04-22 14:12:05
【问题描述】:

我需要在 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));

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

【问题讨论】:

  • 你在 Java 中获得了什么价值?
  • 在 Javascript 中是:U2FsdGVkX1/3H3/VO8b5gjCk3XZfXkSK9JpgmPGYjtk=
  • 在 Java 中是:sEAtASy0J3+Ya3g+Afcj3Q==
  • 消息是:3258
  • 相同算法 = 相同输入的相同结果。请显示您的更多Java代码,它缺少必须相关的方法。

标签: javascript java


【解决方案1】:

在 JavaScript 代码中,密钥和 iv 必须作为 WordArrays 传递。为此CryptoJS提供了转换函数:

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

如果密钥作为字符串传递(就像发布的代码中的情况一样),它会被视为密码并用于派生密钥和 IV(请参阅here密码输入部分)。

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

那么 JavaScript 代码的加密对应于 Java 代码的加密(sEAtASy0J3+Ya3g+Afcj3Q== 用于使用的消息、密钥和 IV)。

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

【讨论】:

  • 非常感谢托帕科
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 2014-01-14
  • 2011-01-31
  • 2021-02-15
相关资源
最近更新 更多