[英]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.