在C#和NodeJS中生成PBKDF2密钥

Elaverick

我正在尝试使用AES192和基于PBKDF2密码/盐的密钥在C#中加密字节数组,并在NodeJS中解密相同的数据。但是,我的密钥生成在NodeJS和C#中产生了不同的结果。

C#代码如下:

    private void getKeyAndIVFromPasswordAndSalt(string password, byte[] salt, SymmetricAlgorithm symmetricAlgorithm, ref byte[] key, ref byte[] iv)
    {
        Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt);
        key = rfc2898DeriveBytes.GetBytes(symmetricAlgorithm.KeySize / 8);
        iv = rfc2898DeriveBytes.GetBytes(symmetricAlgorithm.BlockSize / 8);
    }

    private byte[] encrypt(byte[] unencryptedBytes, string password, int keySize)
    {
        RijndaelManaged aesEncryption = new RijndaelManaged();
        aesEncryption.KeySize = keySize;
        aesEncryption.BlockSize = 128;
        byte[] key = new byte[keySize];
        byte[] iv = new byte[128];
        getKeyAndIVFromPasswordAndSalt(password, Encoding.ASCII.GetBytes("$391Ge3%£2gfR"), aesEncryption, ref key, ref iv);
        aesEncryption.Key = key;
        aesEncryption.IV = iv;
        Console.WriteLine("iv: {0}", Convert.ToBase64String(aesEncryption.IV));
        Console.WriteLine("key: {0}", Convert.ToBase64String(aesEncryption.Key));
        ICryptoTransform crypto = aesEncryption.CreateEncryptor();
        // The result of the encryption and decryption            
        return crypto.TransformFinalBlock(unencryptedBytes, 0, unencryptedBytes.Length);
    }

NodeJS代码如下所示:

    crypto.pbkdf2("Test", "$391Ge3%£2gfR", 1000, 192/8, (err, key) => {
        var binkey = new Buffer(key, 'ascii');
        var biniv = new Buffer("R6taODpFa1/A7WhTZVszvA==", 'base64');
        var decipher = crypto.createDecipheriv('aes192', binkey, biniv);
        console.log("KEY: " + binkey.toString("base64"));
        var decodedLIL = decipher.update(decryptedBuffer);
        console.log(decodedLIL);
        return;
    });

IV是硬编码的,因为我不知道如何使用pbkdf2进行计算。我已经查看了nodeJS文档以获得更多帮助,但是我对这里发生的事情一无所知。

任何帮助将不胜感激。

彼得·O

我看到的问题之一是井号(£的编码crypto.pbkdf2默认情况下,将密码和盐编码为二进制数组,其中每个字符都被截断为最低的8位(这意味着井号变为字节0xA3)。

但是,您的C#代码将盐转换为ASCII,其中每个字符都被截断为最低的7位(这意味着井号变为字节0x23)。它还使用Rfc2898DeriveBytes构造函数,该构造函数使用String作为密码。不幸的是,文档没有说明将字符串转换为字节的编码方式。幸运的是,Rfc2898DeriveBytes确实有另一个构造函数,该构造函数采用字节数组作为密码,并且还采用迭代计数参数,此处为1000。

因此,您应该通过将每个字符截断为8位来将密码和salt字符串转换为字节数组,就像Node.js默认情况下一样。这是一个例子:

var bytes=new byte[password.Length];
for(var i=0;i<bytes.Length;i++){
  bytes[i]=(byte)(password[i]&0xFF);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rfc2898 / PBKDF2以SHA256作为C#中的摘要

来自分类Dev

在C#中生成一个强大的HMACSHA256密钥

来自分类Dev

PBKDF2和Java中的HMAC

来自分类Dev

jasypt PBKDF2实现

来自分类Dev

PBKDF2 Python密钥与.NET Rfc2898

来自分类Dev

存储PBKDF2迭代

来自分类Dev

Crypto ++ pbkdf2输出不同于Rfc2898DeriveBytes(C#)和crypto.pbkdf2(JavaScript)

来自分类Dev

PBKDF2和C#问题

来自分类Dev

javascript和iOS中的PBKDF2哈希生成不同的密钥

来自分类Dev

HKDF或PBKDF2用于生成对称加密密钥?(Python密码学)

来自分类Dev

如何使用PBKDF2在Java和Ruby中生成相同的安全哈希

来自分类Dev

Ironclad和Couch PBKDF2哈希之间的不匹配

来自分类Dev

php和node.js之间的pbkdf2的差异

来自分类Dev

在Java和PHP中使用PBKDF2

来自分类Dev

验证.NET中Python Passlib生成的PBKDF2 SHA512哈希

来自分类Dev

使用带有128位密钥的AES和PBKDF2的Java密码体系结构进行文件加密

来自分类Dev

Java和打字稿产生差异PBKDF2哈希

来自分类Dev

从C#在JavaScript中生成Rfc2898DeriveBytes密钥

来自分类Dev

openssl如何使用PBKDF2构造从密码派生的密钥?

来自分类Dev

这个用于密码生成的pbkdf2散列的PHP实现被认为安全吗?

来自分类Dev

用PBKDF2盐腌和散列

来自分类Dev

pbkdf2如何工作?

来自分类Dev

验证.NET中Python Passlib生成的PBKDF2 SHA512哈希

来自分类Dev

PBKDF2是否生成唯一的哈希?

来自分类Dev

如何从密码和 PBKDF2 迭代中获取原始密钥数据

来自分类Dev

如何在c#中生成与先前随机生成的相同的密钥

来自分类Dev

PBKDF2 未在 C# 中返回明文和散列期望值

来自分类Dev

使用 pkcs11interop、c#、windows Visual Studio 2010 生成 PBKDF2 密钥

来自分类Dev

如何在没有nodeJS的情况下使用cryptoJS的函数pbkdf2

Related 相关文章

  1. 1

    Rfc2898 / PBKDF2以SHA256作为C#中的摘要

  2. 2

    在C#中生成一个强大的HMACSHA256密钥

  3. 3

    PBKDF2和Java中的HMAC

  4. 4

    jasypt PBKDF2实现

  5. 5

    PBKDF2 Python密钥与.NET Rfc2898

  6. 6

    存储PBKDF2迭代

  7. 7

    Crypto ++ pbkdf2输出不同于Rfc2898DeriveBytes(C#)和crypto.pbkdf2(JavaScript)

  8. 8

    PBKDF2和C#问题

  9. 9

    javascript和iOS中的PBKDF2哈希生成不同的密钥

  10. 10

    HKDF或PBKDF2用于生成对称加密密钥?(Python密码学)

  11. 11

    如何使用PBKDF2在Java和Ruby中生成相同的安全哈希

  12. 12

    Ironclad和Couch PBKDF2哈希之间的不匹配

  13. 13

    php和node.js之间的pbkdf2的差异

  14. 14

    在Java和PHP中使用PBKDF2

  15. 15

    验证.NET中Python Passlib生成的PBKDF2 SHA512哈希

  16. 16

    使用带有128位密钥的AES和PBKDF2的Java密码体系结构进行文件加密

  17. 17

    Java和打字稿产生差异PBKDF2哈希

  18. 18

    从C#在JavaScript中生成Rfc2898DeriveBytes密钥

  19. 19

    openssl如何使用PBKDF2构造从密码派生的密钥?

  20. 20

    这个用于密码生成的pbkdf2散列的PHP实现被认为安全吗?

  21. 21

    用PBKDF2盐腌和散列

  22. 22

    pbkdf2如何工作?

  23. 23

    验证.NET中Python Passlib生成的PBKDF2 SHA512哈希

  24. 24

    PBKDF2是否生成唯一的哈希?

  25. 25

    如何从密码和 PBKDF2 迭代中获取原始密钥数据

  26. 26

    如何在c#中生成与先前随机生成的相同的密钥

  27. 27

    PBKDF2 未在 C# 中返回明文和散列期望值

  28. 28

    使用 pkcs11interop、c#、windows Visual Studio 2010 生成 PBKDF2 密钥

  29. 29

    如何在没有nodeJS的情况下使用cryptoJS的函数pbkdf2

热门标签

归档