我正在尝试学习javascript并且正在学习教程,我认为我正确地输入了所有内容但由于某种原因我使用cypto-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
有人可以帮忙吗?
谢谢, 格雷格
答案 0 :(得分:1)
您的代码存在一些问题,主要是您需要提供正确长度的密钥,并且还需要将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。