JavaScript 加密库无法在简单示例程序中加密和解密字符串

JavaScript crypto library can't encrypt and decrypt a string in a simple example program

我正在尝试学习 JavaScript 并且正在学习教程,我认为我输入的所有内容都是正确的,但由于某种原因,我使用 crypto-js 库加密的字符串无法正确解密。我没有收到错误,但未加密的字符串不正确。我正在使用 macintosh 和“crypto-js”:“^3.1.5”。

这是我的示例代码:

var crypto = require('crypto-js');

var secretMessage = 'I hid the chips under the couch.';
var secretKey = '123abc';

var encryptedMessage = crypto.AES.encrypt(secretMessage, secretKey);
console.log('encryptedMessage: ' + encryptedMessage);

var bytes = crypto.AES.decrypt(encryptedMessage, secretKey);
var decryptedMessage = bytes.toString(crypto.enc.utf8);
console.log('decrpt2: ' + decryptedMessage);

这是我得到的结果

   $ node example-encryption.js
    encryptedMessage: U2FsdGVkX180KTEpMiLEjZDSAkhNkmbBuRa9RXFwCgx6gA/PUFr+KOIv6Gr6TgIYrkfUu3F+OM/kRJ3sTTgsfg==
    decrpt2: 49206869642074686520636869707320756e6465722074686520636f7563682e

接下来我可以尝试什么?

您的代码存在一些问题,主要问题是您需要提供长度正确的密钥,并且还需要将 cipherParams 对象而不是密文本身传递给 decrypt() 方法。

这里有一些有效的代码,并且通常与大多数系统上的 OpenSSL 二进制文件和 PHP 库兼容,而且为了获得奖励积分:

var CryptoJS = require( 'crypto-js' );

var secretMessage = 'I hid the chips under the couch.';
var secretKey = 'b52b4f45b6e9337b57869d7cb718c693';

var encryptedMessage = CryptoJS.AES.encrypt(secretMessage, CryptoJS.enc.Hex.parse(secretKey),
                       { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding });

console.log('encryptedMessage: ' + encryptedMessage.ciphertext);

cipherParams = CryptoJS.lib.CipherParams.create(
               {ciphertext: CryptoJS.enc.Hex.parse(encryptedMessage.ciphertext.toString())});

var bytes = CryptoJS.AES.decrypt(cipherParams,CryptoJS.enc.Hex.parse(secretKey),
            { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding });

console.log( 'Decrypted:' + bytes.toString(CryptoJS.enc.Utf8));

没有初始化向量,因为我们使用的是 ECB 而不是 CBC。如果您想要安全的东西,请为每条消息使用带有随机 IV 的 CBC。