【问题标题】:How to decrypt message with CryptoJS AES? I have a working node crypto example如何使用 CryptoJS AES 解密消息?我有一个工作节点加密示例
【发布时间】:2019-07-09 18:38:06
【问题描述】:

我可以使用 Node 的加密库解密 AES 加密消息,如下所示

const crypto = require('crypto');
const encryptedData = 'b6ab428efbcb93c2f483178114ac0608530e54428f1378c6d3be108531b730d1888e562044cd3acb8844a04d9d7602d83b96f0a758248ffd07cd9c530b76c91c';

const decryptResponse2 = (data) => {
  const key = 'F5:A4:F4:AB:BF:68:CF:86:51:B4:AA';
  const iv = Buffer.from(data.substring(0, 32), 'hex');
  const payload = data.substring(32);
  const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv).setAutoPadding(false);
  const decipherFinal = decipher.update(payload, 'hex', 'utf8') +   decipher.final('utf8');

  console.log(decipherFinal);
};

decryptResponse2(encryptedData);

我使用crypto-js 库创建了一个脚本,因为它可以在浏览器中使用。我试过的代码如下:

const crypto = require('crypto-js');
const encryptedData = 'b6ab428efbcb93c2f483178114ac0608530e54428f1378c6d3be108531b730d1888e562044cd3acb8844a04d9d7602d83b96f0a758248ffd07cd9c530b76c91c';

const decryptResponse = (data) => {
  const key = 'F5:A4:F4:AB:BF:68:CF:86:51:B4:AA';
  const iv = Buffer.from(data.substring(0, 32), 'hex');
  const payload = data.substring(32);
  let decryptedData = crypto.AES.decrypt(
    payload,
    key,
    {
      iv: iv,
      mode: crypto.mode.CBC,
      padding: crypto.pad.NoPadding
    });
  console.log(decryptedData.toString());
}

decryptResponse(encryptedData);

然而,它不仅生成错误的解密数据,而且解密的消息甚至不一致。我不知道我做错了什么,因为我对加密和解密不太了解。

任何帮助都将不胜感激。

【问题讨论】:

  • 请看一下github上的这个答案:github.com/brix/crypto-js/issues/195#issuecomment-470200681
  • @GrafiCode 谢谢。这有很大帮助。解析 utf8 中的密钥,十六进制中的 iv,并将格式作为十六进制传递解决了我的问题并生成了正确的解密数据。
  • 很高兴听到您解决了 :) 请自行回答您的问题,并记得尽可能接受。

标签: javascript encryption cryptojs


【解决方案1】:

感谢@GrafiCode 将我指向right place,我能够使用配置对象的format 属性解决它。

以下是代码:

const crypto = require('crypto-js');
const encryptedData = 'b6ab428efbcb93c2f483178114ac0608530e54428f1378c6d3be108531b730d1888e562044cd3acb8844a04d9d7602d83b96f0a758248ffd07cd9c530b76c91c';

const decryptResponse = (data) => {
  const key = crypto.enc.Utf8.parse('F5:A4:F4:AB:BF:68:CF:86:51:B4:AA');
  const iv = crypto.enc.Hex.parse(data.substring(0, 32));
  const payload = data.substring(32);
  let decryptedData = crypto.AES.decrypt(
    payload,
    key,
    {
      iv: iv,
      mode: crypto.mode.CBC,
      // padding: crypto.pad.NoPadding,
      format: crypto.format.Hex
    });
  console.log(crypto.enc.Utf8.stringify(decryptedData));
}

decryptResponse(encryptedData);

我注释掉了 padding: crypto.pad.NoPadding,因为启用后,decryptedData 末尾有不可打印的字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 2017-01-11
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多