繁体   English   中英

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

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

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

我使用库“ crypto”。 我在某处读到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

看看Crypto Node.js文档会发现:

decipher.setAutoPadding(auto_padding = true)

如果数据已加密而没有标准块填充,则可以禁用自动填充,以防止decipher.final检查和删除数据。 仅当输入数据的长度是密码块大小的倍数时才能工作。 您必须先调用此函数,然后再将数据流传输到decipher.update。

decipher.update.之前尝试decipher.setAutoPadding(false) decipher.update.

AES和Rijndael之间有区别。 两者都指定128、192和256位的密钥大小,但是只有Rijndael提供所有三种块大小:128、192和256位。 AES实际上是Rijndael,具有128位的固定块大小。

Node.js使用OpenSSL提供所有可用的密码( crypto.getCiphers() )。 如果您的版本没有可用的rijndael实现,则不能使用node.js的Crypto模块。 您要么需要找到一个实现Rijndael的节点模块,要么只需在C#代码中将块大小设置为128位即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM