C # PasswordDeriveBytes Confusion - PullRequest
       38

C # PasswordDeriveBytes Confusion

7 голосов
/ 10 февраля 2012

У меня следующий код на C #

PasswordDeriveBytes DerivedPassword = new PasswordDeriveBytes(Password, SaltValueBytes, HashAlgorithm, PasswordIterations);
byte[] KeyBytes = DerivedPassword.GetBytes(32);

Я использую алгоритм хэширования "SHA1".

В соответствии с определением SHA1, его ключ генерирует 160 бит (20 байтов).Мой вопрос заключается в том, как метод GetBytes получает 32 байта из DerivedPassword, какой алгоритм используется за методом GetBytes?

Ответы [ 3 ]

11 голосов
/ 10 февраля 2012

Реализация Microsoft оригинального PKCS # 5 (также известного как PBKDF1) включает небезопасные расширения для предоставления большего количества байтов, чем может предоставить хеш-функция (см. Отчеты об ошибках здесь и здесь ).

Даже если это не было ошибкой, вам следует избегать недокументированных, проприетарных расширений стандартов (или вы никогда не сможете расшифровать свои данные в будущем - по крайней мере, за пределами Windows.)

I настоятельно предлагает вам использовать более новую Rfc2898DeriveBytes, которая реализует PBKDF2 (PKCS # 5 v2), которая доступна с .NET 2.0.

5 голосов
/ 10 февраля 2012

Какой алгоритм используется в методе GetBytes?

Он использует алгоритм PBKDF1, который слегка модифицирован для разрешения произвольной длины ключа.Класс замены Rfc2898DeriveBytes использует PBKDF2.

Вы можете прочитать статью Wikipedia о PBKDF2 , чтобы получить общее представление о том, какие базовые концепции делают эту работу.1012 *

4 голосов
/ 10 февраля 2012

Функция вывода ключа использует функцию, называемую Key Stretching . .

Растяжение ключа обычно выполняется путем применения PRF (например, хэш-функции или шифра) в режиме CTR, или путем его повторения и объединения промежуточных выходных данных.

Например, если вы используете процедуру CTR, SHA-1 в качестве PRF и хотите получить 32 байта псевдослучайного вывода, вы объединяете SHA1 (keymaterial, 0) с первыми 12 байтами SHA1 (keymaterial, 1).

...