c# - C#Rfc2898DeriveBytes到节点

我正在使用Node重写加密算法(在C#中实现)。加密使用32字节密钥和16字节IV,并使用Rfc2898DeriveBytes生成密钥和IV。我已经使用crypto.pbkdf2Sync生成了48个字节而不是32个字节的密钥。前32位将是密钥,其余的位将用作IV,如下所示:

const crypto = require( "crypto");

const secret = 'e23d5bb0-2349-289a-d932-abc5a238a873';
const salt = '1bca26a8-49b8-6ad0-b65c-206a96107702';
const algorithm = 'aes-256-xts';
const keyAndIv = crypto.pbkdf2Sync(Buffer.from(secret, "binary"),
  Buffer.from(salt, "binary"),
  1024,
  48,
  'sha1');
const key = keyAndIv.slice(0, 32);
const iv = keyAndIv.slice(32, 48);

const cipher = crypto.createCipheriv(algorithm, key, iv);

let encrypted = cipher.update('test', 'utf8', 'hex');
encrypted += cipher.final('hex');
console.log(encrypted);


这将引发以下错误:

Error: Invalid key length
    at Cipheriv.createCipherBase (internal/crypto/cipher.js:78:18)
    at Cipheriv.createCipherWithIV (internal/crypto/cipher.js:122:20)
    at new Cipheriv (internal/crypto/cipher.js:231:22)
    at Object.createCipheriv (crypto.js:105:10)


任何想法都将非常有益。

最佳答案

观察到的行为的原因是所使用的模式AES-256-XTS。

AES-XTS从传递的密钥生成两个密钥,并且可以作为AES-256-XTS和AES-128-XTS使用。 AES-256-XTS期望使用64字节的密钥并从这两个32字节密钥生成,AES-128-XTS期望使用32字节的密钥并生成两个16字节密钥。

代替填充ciphertext stealing。因此,明文和密文具有相同的长度。另外,明文的大小必须至少为一个块(= 16字节)。可以在herehere中找到有关AES-XTS的更多详细信息。

在C#代码中使用32字节的密钥代表使用AES-128-XTS,而不是AES-256-XTS,为此需要64字节的密钥。如果代码中的算法从AES-256-XTS更改为AES-128-XTS,该错误将不再发生。

例如。对于发布的输入数据,纯文本

The quick brown fox jumped over the lazy dog


在以下密文中使用AES-128-XTS加密

b70d9f10ea6c1db513e141290059a73ab7c454e7d0a24fe482c9a6023a783303fe8bcc41bec1734d85af84ba




密钥和IV代没有错。

具有pbkdf2Sync的NodeJS方法digest = 'SHA1'与C#方法Rfc2898DeriveBytes相对。两者都用HMACSHA1实现PBKDF2,因此对于相同的输入数据返回相同的结果。例如。对于过帐的输入数据:

secret:          e23d5bb0-2349-289a-d932-abc5a238a873
salt:            1bca26a8-49b8-6ad0-b65c-206a96107702
iteration count: 1024
key size:        48


生成以下字节序列:

BE00676F6A3D57EE66FF618FDE5BB15C0E1FC9ECDE5CE949BC784D14ACB7963B49FA9319394A69024A1F359BCC23C703

本文翻译自 https://stackoverflow.com/questions/56053342/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c# node.js node-crypto


相关文章:

c# - 当鼠标悬停在UI按钮上时更改它的源图像吗? (统一)

c# - 窗口中的Mvvm拖动网格

c# - 如何知道何时在可观察集合中调用基本方法或重写方法

c# - 在Cookie中保存“&”符号

c# - 验证视图状态MAC失败。由Web场托管的应用程序,请确保<machineKey>配置[重复]

c# - 如何设置datetimepicker的语言?

c# - DotNetCore 1.0 MVC如何实时自动重定向到单个域

c# - 实体框架中两个上下文之间的继承

c# - 方法参数C#

c# - 开发一个在.NET后台运行的程序?