node.js - Nodejs createDecipher,可以用两个不同的 key 解密相同的密文

标签 node.js encryption openssl

在使用 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/

相关文章:

java - AES加密在CFB模式下截断文本

Android 2.2 : javax.net.ssl.SSLException : Not trusted server certificate - Android 2. 3 : javax.net.ssl.SSLPeerUnverifiedException:没有对等证书

node.js - 如何使用 node.js 使用自定义协议(protocol)/方案定义路由?

javascript - JavaScript 中的异步回调

php - 任何人都可以使用 PHP 解密这个字符串吗?

java - 加密文件并签名

c - 混合 openssl API 和 BSD sockets API

c - 使用 Visual Studio 和 Openssl 进行 AES 256 CTR 加密/解密

node.js - 安装 Zombie.js 错误 : ReferenceError: Set is not defined. 我做错了什么?

php - 用socket_write传递socket.io房间?