Путаница C# PasswordDeriveBytes

У меня есть следующий код в 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 в качестве пруф, и хочу 32 байт псевдо случайный выход, вы объединить в SHA1(keymaterial,0) с первых 12 байт и SHA1(keymaterial,1).