PBKDF2-HMAC-SHA1 - PullRequest
       34

PBKDF2-HMAC-SHA1

9 голосов
/ 17 марта 2010

Для создания действительного парного мастер-ключа для сети WPA2 маршрутизатор использует алгоритм PBKDF2-HMAC-SHA1. Я понимаю, что функция sha1 выполняется 4096 раз для получения PMK, однако у меня есть два вопроса об этом процессе.

Извините за псевдокод.

1) Как форматируется вход для первого экземпляра функции SHA1? SHA1 ( "network_name" + "network_name_length" + "network_password")

Это отформатировано в таком порядке, это шестнадцатеричное значение имени сети, длины и пароля или прямой ASCII?

Затем из того, что я собрал, полученный 160-битный дайджест подается прямо в другой раунд хэширования без какого-либо дополнительного посола. Примерно так: SHA1 («160-битный дайджест из последнего раунда хеширования») Встаньте и повторите.

2) Как только это происходит 4096 раз, 256 бит выходных данных используются в качестве парного главного ключа. Чего я не понимаю, так это того, что если SHA1 выдает 160-битный вывод, как алгоритм достигает 256-битных значений, необходимых для ключа?

Спасибо за помощь.

1 Ответ

8 голосов
/ 18 марта 2010

да, верно, алгоритм генерации двоичного ключа для сети WPA:

ключ = PBKDF2 (кодовая фраза, ssid, 4096, 256)

PBKDF2 описан в http://www.ietf.org/rfc/rfc2898.txt

Он использует алгоритм HMAC для создания дайджеста входных данных. HMAC может использовать любую хеш-функцию, здесь спецификация вызывает SHA1, как вы упомянули. Хеш выполняется в промежуточном состоянии в алгоритме HMAC:

H(K XOR opad, H(K XOR ipad, text))

(H = выбранная хеш-функция, K - кодовая фраза, текст будет ssid)

Этот процесс HMAC повторяется PBKDF2 4096 раз.

Алгоритм HMAC: http://www.ietf.org/rfc/rfc2104

Здесь приведен исходный пример получения ключа:

https://www.codeblog.org/viewsrc/openssl-engine-0.9.6a/crypto/evp/p5_crpt2.c

int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
   80:                            unsigned char *salt, int saltlen, int iter,
   81:                            int keylen, unsigned char *out)

соль - это SSID, пароль - это пароль.

...