Путаница 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).