AES在.NET中使用零填充进行加密,并使用Node.js进行解密
本文关键字:js 解密 Node 加密 填充 NET AES | 更新日期: 2023-09-27 18:00:31
我正在尝试用NodeJS解密一些数据。
该数据是用C#和AES-CBC-256算法创建的。keySize和blockSize为256,Padding为ZeroPadding。
我不能用Node.js解密它,错误是:
Error: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
这是我的javascript代码:
decipher = crypto.createDecipheriv('aes-256-cbc', key, iv.slice(0, 16));
decrypted = decipher.update(encryptedPayloadBuffer, 'base64', 'ascii');
decrypted += decipher.final('ascii');
decipher = null;
return decrypted;
我使用"加密"库。我在某个地方读到node.js解密只适用于PKSC7填充。这是真的吗?我无法更改C#项目中的任何内容,我必须在节点端找到解决方案。
你能帮我吗?
编辑:我试图用这个禁用自动填充:
decipher.setAutoPadding(false);
//next line of code:
//decrypted = decipher.update(encryptedPayloadBuffer, 'base64', 'ascii');
但我收到了这个错误:
Error: error:0606508A:digital envelope routines:EVP_DecryptFinal_ex:data not multiple of block length
AES和Rijndael之间存在差异。两者都指定了128、192和256位的密钥大小,但只有Rijndael提供了所有三个块大小:128、192、256位。AES实际上是Rijndael,具有128位的固定块大小。
Node.js使用OpenSSL来提供所有可用的密码(crypto.getCiphers()
)。如果您的版本没有rijndael实现,那么您就不能使用node.js的Crypto模块。您要么需要找到一个实现Rijndael的节点模块,要么只需在C#代码中将块大小设置为128位。
查看Crypto Node.js文档可以发现:
decrypt.setAutoPadding(auto_padding=true)
如果数据已加密,则可以禁用自动填充防止解密的标准块填充。final检查和删除它。只有当输入数据的长度是密码块大小。在将数据流式传输到之前,必须调用此解密更新
在decipher.update.
之前尝试decipher.setAutoPadding(false)