9

要为 WPA2 网络生成有效的成对主密钥,路由器使用 PBKDF2-HMAC-SHA1 算法。我知道 sha1 函数执行了 4096 次来导出 PMK,但是我对这个过程有两个问题。

原谅伪代码。

1) SHA1 函数的第一个实例的输入是如何格式化的?SHA1("network_name"+"network_name_length"+"network_password")

它是按该顺序格式化的,是网络名称、长度和密码的十六进制值还是直接的 ASCII?

然后从我收集到的 160 位摘要中,直接送入另一轮散列,无需任何额外的加盐。像这样: SHA1("160bit digest from last round of hashing") 上升并重复。

2) 一旦发生这种情况,输出的 4096 乘以 256 位将用作成对主密钥。我不明白的是,如果 SHA1 产生 160 位输出,那么算法如何达到密钥所需的 256 位?

谢谢您的帮助。

4

1 回答 1

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=选择的哈希函数,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 是密码。

于 2010-03-17T21:01:52.760 回答