我有使用 Node.js 原生
encrypt()
lib 的工作 decrypt()
/crypto
函数,它们工作得很好
const crypto = require('crypto');
const ENC_KEY = "bf37b0999c7717c17b2c1d90470cb41e";
function encrypt(data, key, ivLength = 16) {
const iv = crypto.randomBytes(ivLength);
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encrypted = cipher.update(data, 'utf8', 'base64');
encrypted += cipher.final('base64');
const resultData = {
'iv': iv.toString('base64'),
'data': encrypted
}
const response = btoa(JSON.stringify(resultData))
return response;
};
function decrypt(data, key) {
const jsonData = JSON.parse(Buffer.from(data, 'base64').toString('ascii'));
const iv = Buffer.from(jsonData['iv'], 'base64')
let decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
let decrypted = decipher.update(jsonData['data'], 'base64', 'utf8');
const result = (decrypted + decipher.final('utf8'));
return result;
};
const phrase = "ORIGINAL PHRASE";
const encryptedCrypto = encrypt(phrase, ENC_KEY);
const decryptedCrypto = decrypt(encryptedCrypto, ENC_KEY);
console.log(`Decoded string: ${decryptedCrypto}`);
我需要用
encrypt()
lib 重写
crypto-js
函数,以便原始 decrypt()
函数可以使用它。除了 encrypt()
功能之外,我无法修改任何内容。
我尝试过,但没有成功。有人可以帮我吗?
function encrypt(data, key, ivLength = 16) {
const iv = CryptoJS.lib.WordArray.random(ivLength);
const encrypted = CryptoJS.AES.encrypt(data, CryptoJS.enc.Hex.parse(key), {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.NoPadding
});
const resultData = {
'iv': CryptoJS.enc.Hex.parse(iv).toString('base64'),
'data': encrypted
}
const result = btoa(JSON.stringify(resultData))
return result;
}
您的 crypto-js 代码很接近,但有一些缺陷
function encrypt(data, key, ivLength = 16) {
const iv = CryptoJS.lib.WordArray.random(ivLength);
const encrypted = CryptoJS.AES.encrypt(
data,
CryptoJS.enc.Utf8.parse(key),
{
iv: iv,
mode: CryptoJS.mode.CBC,
//padding: CryptoJS.pad.NoPadding,
}
);
const resultData = {
iv: CryptoJS.enc.Base64.stringify(iv),
data: CryptoJS.enc.Base64.stringify(encrypted.ciphertext),
};
const result = btoa(JSON.stringify(resultData));
return result;
}
注意
CryptoJS.enc.Utf8.parse(key)
不是CryptoJS.enc.Hex.parse(key)
如果使用
.Hex.parse
转换如图所示的密钥(32 个字符),最终将是 128 位,而不是 256 位。
删除了
padding: CryptoJS.pad.NoPadding,
,因为这会破坏解密
在
CryptoJS.enc.Base64.stringify
中使用 resultData
,因为这基本上就是您在节点版本中所做的事情
注意:
crypto-js
开发已停止 - 您应该在节点和浏览器中使用本机加密,即crypto.subtle
主要挑战是
crypto.subtle
的异步性质