【问题标题】:Crypto js not decrypting properly when given wrong AES 256 key给定错误的 AES 256 密钥时,Crypto js 无法正确解密
【发布时间】:2020-12-08 17:42:07
【问题描述】:

我的部分应用程序使用 AES 256 来解密加密字符串,然后将其传递给检查解密字符串是否正确的函数。

当我提供正确的密钥时,一切正常 - 我得到了 81 sigBytes 的 wordArray 对象。然后我将对象更改为十六进制,我很高兴。但是,当密钥不正确时,返回的 wordArray 具有奇怪的 sigBytes 负值,在尝试将其更改为十六进制代码后,我得到空字符串,而实际上我应该得到 81 个字节的错误解密文本。

请注意,我的应用程序的其余部分的编码方式是 hexKey 始终为 32 字节,iv 始终为 16 字节,因此此问题与密钥长度错误无关。

export function decryptAES(enc, hexKey, iv) {
  var key = CryptoJS.enc.Hex.parse(hexKey);
  var iv = CryptoJS.enc.Hex.parse(iv);
  var dec = CryptoJS.AES.decrypt(
    enc,
    key,
    { iv: iv },
    { mode: CryptoJS.mode.CBC }
  );

  console.log("++++");
  console.log(dec);
  console.log(dec.toString());
  console.log("++++");
  return dec.toString();
}

给出正确的 32 字节密钥时的示例输出:

    ++++
Object {
  "sigBytes": 81,
  "words": Array [
    1752134516,
    778401904,
    776304752,
    1869505902,
    1949643824,
    909129059,
    808662581,
    909653861,
    1717724773,
    912536165,
    1701012016,
    845308723,
    1667446839,
    825385784,
    1697855799,
    909391927,
    1630822707,
    959669046,
    1664365625,
    962670905,
    856624911,
    252645135,
    252645135,
    252645135,
  ],
}
686f73742e6578702e4578706f6e656e7435343036303563303336353638376566626665366432656563623032626333636338373132633865333937363438376134613339336336633434393961313933
++++

32字节密钥不正确时的输出

++++
Object {
  "sigBytes": -106,
  "words": Array [
    -1250329685,
    718732109,
    2110917137,
    138597379,
    457610406,
    -1386250595,
    98533977,
    1688834468,
    1693475717,
    -1223868012,
    779204504,
    -893340479,
    1667438189,
    2014283040,
    -1303465345,
    -2113084121,
    1618406295,
    -965279870,
    1579488178,
    -1274259478,
    1900642657,
    340456508,
    -1297174274,
    1109264330,
  ],
}
++++

【问题讨论】:

  • 这是在浏览器还是在nodejs环境中执行?如果您在节点环境中,我建议您使用内置的 crypto 库。
  • 我使用 react native 和 expo

标签: javascript react-native cryptography aes cryptojs


【解决方案1】:

问题解决了。

要获得适当数量的 sigBytes,无论密钥是否良好,只需添加 NoPadding。需要使用 NoPadding CFB、CTR 或 OFB 模式。

示例实现:

  var dec = CryptoJS.AES.decrypt(enc, key, {
    iv: iv,
    mode: CryptoJS.mode.CFB,
    padding: CryptoJS.pad.NoPadding,
  });

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 2014-02-06
    • 1970-01-01
    • 2018-12-27
    • 2023-03-17
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多