【问题标题】:how to generate the same key when using crypto c# 4.0使用crypto c# 4.0时如何生成相同的密钥
【发布时间】:2010-11-29 09:25:13
【问题描述】:

您好,我正在尝试加密和解密字符串值...我是通过使用手动密钥来实现的...

private static byte[] _salt = Encoding.ASCII.GetBytes("123456789abcdefg");

我创建了密钥和 iv 喜欢

Rfc2898DeriveBytes rfcDeriveBytes = new Rfc2898DeriveBytes(password, _salt);
rijndaelManaged = new RijndaelManaged();
rijndaelManaged.Key = rfcDeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
rijndaelManaged.IV = rfcDeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);

但我想动态生成相同的密钥...我的意思是如何动态生成 _salt...

【问题讨论】:

  • 不清楚您所说的“动态创建相同的密钥”是什么意思。你想要什么是动态的?您只是在谈论生成 random 密钥吗?请注意,您还没有告诉我们有关 rfcDeriveBytes 的任何信息。
  • 请在此处解释“相同”和“动态”的含义
  • 我想使用密钥生成器而不是 _salt

标签: c# .net key rijndaelmanaged


【解决方案1】:

Rfc2898DeriveBytes 类可以为您生成随机盐 - 只需 pass the required salt size to the appropriate constructor。并且不要忘记将生成的盐存储在安全的地方 - 它无法确定性地重新生成,没有它您将无法重新创建密钥和 IV 进行解密。

string password = GetPasswordFromUserInputOrWherever();

using (var deriveBytes = new Rfc2898DeriveBytes(password, 16))  // 16 byte salt
{
    byte[] salt = deriveBytes.Salt;

    // now save the salt somewhere safe
    // you'll need it to generate the same byte sequence when decrypting

    using (var rijndael = new RijndaelManaged())
    {
        rijndael.Key = deriveBytes.GetBytes(rijndael.KeySize / 8);
        rijndael.IV = deriveBytes.GetBytes(rijndael.BlockSize / 8);

        // encrypt...
    }
}

然后解密:

string password = GetPasswordFromUserInputOrWherever();
byte[] salt = GetSaltFromWhereverYouPreviouslySavedIt();

using (var deriveBytes = new Rfc2898DeriveBytes(password, salt))
using (var rijndael = new RijndaelManaged())
{
    rijndael.Key = deriveBytes.GetBytes(rijndael.KeySize / 8);
    rijndael.IV = deriveBytes.GetBytes(rijndael.BlockSize / 8);

    // decrypt...
}

【讨论】:

    【解决方案2】:

    “盐”不是秘密,您可以将其包含在加密数据中。加密/解密时不能使用不同的盐,为了有效,您应该为每条消息使用不同的盐。

    您可以使用 System.Security.Cryptography.RandomNumberGenerator 类来创建 Salt。

    【讨论】:

    • 请注意,Rfc2898DeriveBytes 可以根据您的要求为您生成盐(在内部使用 RandomNumberGenerator)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多