Для генерации допустимого попарного главного ключа для сети 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 битов, требуемых для ключа?
Спасибо за справку.
да, верно, алгоритм генерации двоичного ключа для сети 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)
salt - это SSID, pass - это пароль.