在使用 Nodejs createDecipher 时,我似乎能够使用两个不同的 key 解密相同的密文数据负载,而不会出现错误。
var ciphertext = '31c655f86b39fc9ac1dd96d7ae5e9d905e7c977df9ea70e6b87d3504caf03760';
var key1 = 'asdf';
var key2 = '8bc94f258d9aaf509061b5ff52bfeb019ce802959c41eaa188beacd5e33f21db';
function decrypt(data, key) {
var decipher = crypto.createDecipher('aes-256-cbc', key);
var decrypted = decipher.update(data, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
// 890736.159999999
console.log(decrypt(ciphertext, key1));
// ������F������쭳����M2�����C�<
console.log(decrypt(ciphertext, key2));
当使用第二个 key 解密时,我预计会产生 EVP_DecryptFinal_ex:badcrypt
错误。事实上,当我更改第二个键中的单个字符时,会产生错误:
crypto.js:153
var ret = this._handle.final();
^
Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
at Error (native)
at Decipher.Cipher.final (crypto.js:153:26)
at decrypt (/Users/user/decrypt.js:8:27)
at Object.<anonymous> (/Users/user/decrypt.js:13:13)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:148:18)
使用第二个 key :8bc94f258d9aaf509061b5ff52bfeb019ce802959c41eaa188beacd5e33f21dd
虽然没有抛出错误,但第二个 key 生成的解密值不正确,应为 890736.159999999。
我尝试在 Mac 上使用 Node 6.10.3、4.4.6 和 5.10。 我还尝试在运行 amazon linux 的 docker 容器中使用 Node 6.10.3。
根据docs : crypto.createDecipher() 的实现使用 OpenSSL 函数 EVP_BytesToKey 派生 key ,摘要算法设置为 MD5,一次迭代,无盐。
我可能会看到 md5 冲突吗?
最佳答案
由于第二个解密数据不正确,因此它未正确解密。
明文为16字节 将添加 16 字节的填充,从而添加 32 字节的加密数据 加密数据为 64 个十六进制字符或 32 个字节。
所以这一切都是有道理的。
现在对于错误,我怀疑您收到错误 key 的填充错误,即填充不一致。请参阅PKCS#7 padding .
填充错误不是对正确加密 key 的有效检查。如果您需要检查加密是否成功,则需要添加身份验证。
关于node.js - Nodejs createDecipher,可以用两个不同的 key 解密相同的密文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44690010/