C# PasswordDeriveBytes Confusion
У меня есть следующий код в C#
PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations);
byte[] KeyBytes = DerivedPassword.GetBytes(32);
Я использую алгоритм хеширования "SHA1".
Согласно определению SHA1, его генерируют 160-битный (20-байтовый) ключ. Мой вопрос заключается в том, как метод GetBytes получить 32 байта из DerivedPassword, какой алгоритм используется за метод GetBytes?
3 ответа
Внедрение Microsoft оригинальной PKCS#5 (также известной как PBKDF1) включает небезопасные расширения для предоставления большего количества байтов, чем может предоставить хеш-функция (см. Отчеты об ошибках здесь и здесь).
Даже если это не было ошибкой, вам следует избегать незарегистрированных, проприетарных расширений стандартов (или вы никогда не сможете расшифровать свои данные в будущем - по крайней мере, за пределами Windows).
Я настоятельно рекомендую вам использовать более новые Rfc2898DeriveBytes
который реализует PBKDF2 (PKCS#5 v2), который доступен с.NET 2.0.
какой алгоритм используется за методом GetBytes?
Он использует алгоритм PBKDF1, который слегка модифицирован для разрешения произвольной длины ключа. Класс замены, Rfc2898DeriveBytes
использует PBKDF2.
Вы можете прочитать статью в Википедии о PBKDF2, чтобы получить общее представление о том, какие базовые концепции делают эту работу.
Функция получения ключа использует функцию, называемую " Растяжение ключа". (Не пытайтесь искать его в Википедии, потому что текущая статья путает концепцию с усилением ключа, что является совершенно другим.)
Растяжение ключа обычно выполняется путем применения PRF (например, хэш-функции или шифра) в режиме CTR, или путем его итерации и объединения промежуточных выходных данных.
Например, если вы используете процедуру CTR, SHA-1 в качестве PRF и хотите получить 32 байта псевдослучайного вывода, вы объедините SHA1(ключевой материал,0) с первыми 12 байтами SHA1(ключевой материал,1).