【问题标题】:AES encrypt in .NET with zero padding and decrypt with Node.jsAES 在 .NET 中使用零填充加密并使用 Node.js 解密
【发布时间】:2015-09-16 03:29:54
【问题描述】:

我正在尝试使用 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#项目我什么都改不了,必须在node端找到解决办法。

你能帮帮我吗?

编辑:我试图用这个禁用自动填充:

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

【问题讨论】:

  • 如果块大小为 256 位,则不是 AES。请说明您使用的是什么。
  • @ArtjomB。很可能您可以强制 C# AES 实现执行 Rijndael-256,但我不确定。
  • @ArtjomB 我确定它是 AES。这是实现:gist.github.com/VivienAdnot/e9a96fea04bccfa613ec

标签: javascript c# node.js encryption cryptography


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我现在明白这个问题了。我搜索了除加密之外的另一个节点模块,但目前找不到。我希望有人知道并会在这里写出来。
【解决方案2】:

查看Crypto Node.js doc会发现:

decipher.setAutoPadding(auto_padding=true)

如果数据已加密,您可以禁用自动填充 标准块填充以防止 decipher.final 检查和 删除它。只有当输入数据的长度是的倍数时才能工作 密码块大小。您必须在将数据流式传输到之前调用它 解密。更新。

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

【讨论】:

  • 解密后别忘了去掉补零。
  • @Jim 洪水。感谢您的回答。我已经试过了,但是我遇到了这个错误:数据不是块长度的倍数
猜你喜欢
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多