大家好,我想知道是否有人使用nodejs使用aes256进行解密。
加密字符串是base64编码的,前16个字节是IV。
我正在尝试提取下面的IV,但遇到问题:
$ awk '($9 ~ /^1$|^3$|^5$/) {print $0}' file
我一直得到"无效的IV长度"错误。
答案 0 :(得分:0)
我相信问题是您的key
在base64
中,而createDecipheriv
在期望其他类型。
来自the docs:
key
是算法使用的原始密钥,iv
是初始化向量。两个参数都必须是'utf8'
编码的字符串,Buffers
,TypedArray
或DataViews
。如果密码不需要初始化向量,则iv可以为null。
此外,从加密的数据中,您首先从前16个字节中获取IV,然后解密其余的数据。
这是我认为您需要的,尽管结果有些混乱:
const crypto = require('crypto');
const decrypt = (textBase64, keyBase64, ivBase64) => {
const algorithm = 'aes-256-cbc';
const ivBuffer = Buffer.from(ivBase64, 'base64');
const keyBuffer = Buffer.from(keyBase64, 'base64');
const decipher = crypto.createDecipheriv(algorithm, keyBuffer, ivBuffer);
decipher.setAutoPadding(false);
let decrypted = decipher.update(textBase64, 'base64', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
const encryptedMessage = 'mIBOVqk3bDCQPupFcIWNReXrdNRnb2P+iKl35yYRgbA=';
const key = '6IAVE+56U5t7USZhb+9wCcqrTyJHqAu09j0t6fBngNo=';
const iv = Buffer.from(encryptedMessage, 'base64').slice(0, 16);
// the message comes from the bytes AFTER the IV - this is what you should decrypt
const message = Buffer.from(encryptedMessage, 'base64').slice(16);
const result = decrypt(message, key, iv);
console.log(result);
结果是:
I AM CONFUSED╚╚╚