AES在.NET中使用零填充进行加密,并使用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;
我使用"加密"库。我在某个地方读到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)
相关文章:
- 在.js档案中解密
- RSA在JS和Python之间加密和解密(pycrypto)
- Node.js对外部PHP aes-256-cbc进行解密,然后对其进行加密
- 如何解密此JS
- 在 PHP 中加密字符串,在 Node.js 中解密
- 节点加密与加密-js 加密和解密之间的兼容性
- 使用crypto-js加密密码并通过ajax发送表单(并在java中解密),我得到:类型错误:无法读取未定义的属性“单词
- 节点JS加密:解密时密码错误
- AES解密在伪造中失败,但在crypto-js中工作
- 加密-js - 读取和解密文件
- 加密 JS 在解密加密消息时引发的异常
- 节点.js RSA 加密/解密
- 加密iOS并解密Node.js AES
- PHP中的加密和node.js中的解密
- JavaScript:使用openpgp.js解密GnuPG加密文件的内容
- 使用node.js解密mcrypt编码的文本
- c#加密和JS解密(CryptoJS)
- 无法使用Crypto-Js解密邮件
- 用Node.JS解密Rijndael(用Delphi和Delphi加密汇编加密后)
- JS:解密后不可能存储在数据库(SJCL)