【问题标题】:How to generate the same AES encrypted message in crypto-js?如何在 crypto-js 中生成相同的 AES 加密消息?
【发布时间】:2023-03-31 20:43:01
【问题描述】:

我尝试设置 iv 或不设置 iv,但加密的消息总是不同。

import CryptoJS from "crypto-js";
const iv = CryptoJS.lib.WordArray.create([0x20212223, 0x24252627, 0x28292a2b, 0x2c2d2e2f]);
const a = CryptoJS.AES.encrypt("my message", "my secret", {iv: iv}).toString();
console.log(a);

一些输出是 U2FsdGVkX1/7vfxMQ5nTdcBqjLjirF5LutKPUpPKkxI=, U2FsdGVkX18+075efZU5tMZyIziirm0e6O6u4ZPXVcA=

【问题讨论】:

  • 可能包含一些随机化器(即时间戳或类似的)来解释您的体验。我不熟悉crypto-js,但是,你能用“我的秘密”解密这两条消息吗?

标签: encryption cryptography javascript aes node.js


【解决方案1】:

“我的秘密”是密码,而不是密钥。 CryptoJS.AES.encrypt 正在执行密钥派生功能(内部)以从密码中派生密钥。密钥派生函数的输入之一是随机生成的盐。因此,每次运行 CryptoJS.AES.encrypt 时派生的密钥都是不同的,即使使用相同的输入也是如此,这就是为什么每次运行它都会得到不同的结果。

请参阅CryptoJS and key/IV length,了解如何将密钥而不是密码传递给CryptoJS.AES.encrypt 的示例。这消除了对密钥派生函数的需要,并且您每次都会得到相同的结果。

【讨论】:

    【解决方案2】:
    var algorithm = 'aes256';
    
     // Encrypt
    
    function Encrypt(word, key) { 
    var cipher = crypto.createCipher(algorithm, key);
    var encrypted = cipher.update(word, 'utf8', 'hex') + cipher.final('hex');
    return encrypted;
    }
    
     //Decrypt
    
    function Decrypt(word, key) {
    var decipher = crypto.createDecipher(algorithm, key);
    var decrypted = decipher.update(word, 'hex', 'utf8') + 
    decipher.final('utf8');  
    return decrypted;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-09-12
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 2010-10-13
      • 2014-02-06
      • 2023-03-17
      • 1970-01-01
      • 2022-11-20
      相关资源
      最近更新 更多