0

こんにちは私は文字列値を暗号化および復号化しようとしています...私は次のような手動キーを使用してそれを作りました...

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を動的に生成するにはどうすればよいか...

4

2 に答える 2

2

Rfc2898DeriveBytesクラスはランダムなソルトを生成できます。必要なソルト サイズを適切なコンストラクタに渡すだけです。また、生成されたソルトを安全な場所に保存することを忘れないでください。決定論的に再生成することはできません。ソルトがなければ、復号化のためにキーと 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...
}
于 2010-11-29T10:48:43.160 に答える
1

「ソルト」は秘密ではありません。暗号化されたデータに含めることができます。暗号化/復号化中に異なるソルトを使用することはできません。効果的にするには、メッセージごとに異なるソルトを使用する必要があります。

この System.Security.Cryptography.RandomNumberGeneratorクラスを使用してSaltを作成できます。

于 2010-11-29T09:44:26.853 に答える