как сгенерировать тот же ключ при использовании crypto c # 4.0 - PullRequest
0 голосов
/ 29 ноября 2010

Привет, я пытаюсь зашифровать и расшифровать строковое значение ... я сделал это с помощью ручного ключа, как ...

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 динамически ...

Ответы [ 2 ]

2 голосов
/ 29 ноября 2010

Класс 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...
}
1 голос
/ 29 ноября 2010

«Соль» не секрет, вы можете включить его в зашифрованные данные. Вы не можете использовать разные соли при шифровании / дешифровании, и для эффективности вы должны использовать разные соли для каждого сообщения.

Вы можете использовать класс System.Security.Cryptography.RandomNumberGenerator для создания Соли.

...