Использование класса Rfc2898DeriveBytes для получения ключа и IV - PullRequest
3 голосов
/ 25 марта 2011

Я только знакомлюсь с шифрованием и .NET Framework.После просмотра многих примеров я вижу повторяющийся шаблон, который сбивает с толку при использовании .NET Class Rfc2898DeriveBytes.При использовании этого класса для получения ключа шифрования и вектора инициализации, похоже, используется тот же метод.

Вот код из блога MSDN , который демонстрирует получение ключа и вектора инициализации.

byte[] salt = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 };
Rfc2898DeriveBytes pwdGen = new Rfc2898DeriveBytes("P@$$w0rd", salt, 1000);

// generate an RC2 key
byte[] key = pwdGen.GetBytes(16);
byte[] iv = pwdGen.GetBytes(8);

Я видел это в других местах.Думаю, я бы подумал, что это будет что-то вроде этого ...

// generate an RC2 key
byte[] key = pwdGen.GetKey();
byte[] iv = pwdGen.GetInitializationVector();

Я ДОЛЖЕН что-то здесь упустить.Если Ключ и Вектор Инициализации (IV) являются просто случайными числами, как они получаются снова при использовании правильного пароля и соли?

1 Ответ

4 голосов
/ 25 марта 2011

Алгоритм получения ключа RFC2898 является детерминированным. Когда вы запустите его с теми же входами, вы получите те же выходы.

Так что, пока вы звоните GetBytes() в том же порядке, запрашивая одинаковое количество байтов, вы получите тот же ключ и IV.

Не забывайте, что в реальной системе соль должна генерироваться случайным образом во время шифрования (и храниться так, чтобы ее можно было извлечь во время расшифровки).

...