AES在.NET中使用零填充进行加密,并使用Node.js进行解密

AES encrypt in .NET with zero padding and decrypt with Node.js

本文关键字:js 解密 Node 加密 填充 NET AES      更新时间:2023-09-26

我正在尝试用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)