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。
我正在尝试学习 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。