function encrypt() {
const iv = '3af545da025d5b07319cd9b2571670ca'
, payload = '01000000000000000000000000000000'
, key = 'c1602e4b57602e48d9a3ffc1b578d9a3';
const cipher = crypto.createCipheriv('aes128', new Buffer(key, 'hex'), new Buffer(iv, 'hex'));
const encryptedPayload = cipher.update(new Buffer(payload, 'hex'));
let encryptedPayloadHex = encryptedPayload.toString('hex');
console.log(encryptedPayloadHex); // returns 'ae47475617f38b4731e8096afa5a59b0'
};
function decrypt() {
const iv = '3af545da025d5b07319cd9b2571670ca'
, key = 'c1602e4b57602e48d9a3ffc1b578d9a3'
, payload = 'ae47475617f38b4731e8096afa5a59b0';
const decipher = crypto.createDecipheriv('aes128', new Buffer(key, 'hex'), new Buffer(iv, 'hex'));
const decryptedPayload = decipher.update(new Buffer(payload, 'hex'), 'hex', 'hex');
console.log(decryptedPayload); // returns empty string
// decipher.update(new Buffer(payload, 'hex')) // returns empty buffer
const decryptedPayloadHex = decipher.final('hex'); // returns 'EVP_DecryptFinal_ex:bad decrypt' error
// console.log(decryptedPayloadHex);
};
但是,解密结果始终为空。
nodejs docs声明update
在给定编码中将值返回为字符串(如果提供),否则返回Buffer。不过我尝试使用final
,但没有成功。
P.S。实际上,我从外部源收到encryptedPayload
值和iv
(它们没有加密并由我生成),但我决定测试加密(我有普通{{1}我的加密返回与我在外部接收的结果相同的结果。
答案 0 :(得分:0)
好的,所以问题原来是填充。我得到了灵感from here.我只是添加了
decipher.setAutoPadding(false);
在我抓住decipher
对象后立即。
这很奇怪,因为填充问题可能发生在一种语言加密和另一种语言加密时,但加密和解密用同一种语言完成时不应该发生(就像我在这里测试一样)......如果有人对填充问题有评论 - 请添加它们,以便未来的观众可以获得知识(以及我)。