【问题标题】:PBKDF2-HMAC-SHA1PBKDF2-HMAC-SHA1
【发布时间】:2011-01-28 18:30:27
【问题描述】:

要为 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 位?

感谢您的帮助。

【问题讨论】:

    标签: sha1 hmac pbkdf2


    【解决方案1】:

    是的,为 WPA 网络生成二进制密钥的算法是:

    key = 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 是密码。

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 2020-08-24
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 2012-10-12
      • 2011-07-05
      • 2013-12-01
      • 2011-05-29
      相关资源
      最近更新 更多