【发布时间】:2018-04-28 14:32:36
【问题描述】:
所以,我有一个内容需要用私钥和填充 AES/ECB/PKCS5Padding 解密。
我尝试了许多库和许多示例,但它们都不起作用。现在,这是我设法完成最后一步的地方,但我不确定是否有另一个库可以为我做这件事。
var absolutePath = path.resolve('./private.txt');
var privateKey = fs.readFileSync(absolutePath, "utf8");
var buffer = new Buffer(toDecrypt, "base64");
var decrypted = crypto.privateDecrypt(privateKey, buffer);
return decrypted.toString("utf8");
这会引发我的错误:
0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
第二个示例,与第一个示例略有不同,但使用了填充(这就是我需要的,我只是想尝试不使用它,看看它是否有效):
var stringKey = 'BEGIN RSA PRIVATE KEY-----....';
var cipherText = 'ENCRYPTEDTEXT';
// we compute the sha256 of the key
var hash = crypto.createHash("sha256");
hash.update(stringKey, "utf8");
var sha256key = hash.digest();
var keyBuffer = new Buffer(sha256key);
var cipherBuffer = new Buffer(cipherText, 'hex');
var aesDec = crypto.createDecipheriv("aes-256-ecb", keyBuffer, ''); // always use createDecipheriv when the key is passed as raw bytes
var output = aesDec.update(cipherBuffer, 'binary', 'binary');
var final = aesDec.final();
return output + final;
它在var final = aesDec.final() 线上崩溃并抛出错误:
digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
有没有人知道或经验如何做到这一点?
【问题讨论】:
-
密码测试 'ENCRYPTEDTEXT' 不是有效的密文,因此很可能抛出异常。你期待什么?
-
采用 ECB 模式的 AES 要求加密数据是块大小的倍数,AES 为 16 字节。
-
您在问题开始时提到了 PKCS5 填充,但正如 zaph 所提到的,您实际上并没有应用任何填充。我也很困惑为什么您要尝试使用 RSA 私钥的 SHA256 作为对称加密密钥。此外,您似乎使用的是空 IV,这意味着此代码容易受到密钥重用攻击。也没有应用真实性记录,因此由于使用带有填充的 CBC 模式,它很容易受到延展性攻击和填充预言问题。
标签: node.js encryption aes rsa node-crypto