2010-03-17 5 views
9

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

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

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

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

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

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

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

ответ

8

да то будет правильно, алгоритм, чтобы сгенерировать двоичный ключ для сети 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 = выбранная хэш-функция, К есть ключевая фраза, текст будет SSID)

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

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, проход пароль.