PKCS#5研究——第一部分 基于口令的密钥导出函数

PKCS5 v2.1主要讲述了三个方面的内容:

  • 基于口令的密钥导出函数PBKDF
    • PBKDF1:仅兼容PKCS5 v1.5用,使用HASH(MD2、MD5、SHA-1),导出密钥≤ hLen
    • PBKDF2:推荐使用,使用HMAC,导出密钥可很长。方案同NIST SP800-132PBKDF
  • 基于口令的加密方案,用PBKDF导出密钥进行加密。
    • PBES1:仅兼容PKCS5 v1.5,PBKDF1 + DES / RC2 – CBC
    • PBES2:推荐使用,PBKDF2 + AES-CBC-Pad
  • 基于口令的消息认证方案,用PBKDF导出密钥计算MAC。

 

主要涉及如下几个参数

  • P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
  • S:盐值,无需保密,增加密文多变性,可为口令索引值或伪随机数等。
  • c:迭代次数,口令导出密钥时的迭代次数,建议不小于1000,以适当增加使用者负担,但可以显著增加攻击者难度。
  • DK:导出密钥。
  • dkLen:导出密钥的字节长度。
  • hLen:杂凑函数的输出字节长度。

 

口令的选择建议参考如下文档。

  1. NIST SP 800-63: Electronic Authentication Guideline: Recommendations of the National Institute of Standards and Technology, Appendix A, April 2006.

5. 基于口令的密钥导出函数

有两个基于口令的密钥导出函数PBKDF方案,如下表。

表5.1 基于口令的密钥导出函数PBKDF1和PBKDF2对比

hLen为HASH函数的输出长度)

项目

PBKDF1

PBKDF2

HASH函数

MD2

MD5

SHA-1

HMAC

(HMAC底层使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512)

导出密钥长度

hLen

≤ (232 – 1) × hLen

使用

不推荐

仅兼容PKCS5 v1.5

推荐使用

对比NIST SP800-132

NIST SP800-132无PBKDF1函数

NIST SP800-132的PBKDF即PBKDF2函数

NIST SP800-132基于口令的密钥导出函数,是基于PKCS5得到。

5.1 PBKDF1

说明:NIST SP800-132基于口令的密钥导出函数不涉及此PBKDF1函数。

函数:DK = PBKDF1 (P, S, c, dkLen)

功能:基于口令的密钥导出函数PBKDF1

输入参数:

  1. P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
  2. S:盐值,无需保密,增加密文多变性。
  3. c:迭代次数,越大越好,建议不小于1000。
  4. dkLen:导出密钥DK的字节长度,≤ hLen

内部参数:

  1. HASH:杂凑函数(为MD2、MD5、SHA-1)。
  2. hLen:杂凑函数的输出字节长度。
  3. MSB(L, M):获取数据串M的高L字节。

返回数据:

  1. DK:导出密钥。

执行步骤:

步骤1:若dkLen > hLen,返回错误标识。

步骤2:T0 = P || S

步骤3:for i = 1,2,..., c,执行

      3.1        Ti = Hash (Ti-1)

步骤4:返回导出密钥DK = MSB (dkLen, Tc)。

5.2 PBKDF2

说明:NIST SP800-132基于口令的密钥导出函数PBKDF即此PBKDF2函数。

函数:DK = PBKDF2 (P, S, c, dkLen)

功能:基于口令的密钥导出函数PBKDF2

输入参数:

  1. P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
  2. S:盐值,无需保密,增加密文多变性。
  3. c:迭代次数,越大越好,建议不小于1000。
  4. dkLen:导出密钥DK的字节长度,≤ (232 – 1) × hLen

内部参数:

  1. PRF:伪随机函数,可以是HMAC-SHA-1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512。
  2. hLen:杂凑函数的输出字节长度。
  3. MSB(L, M):获取数据串M的高L字节。

返回数据:

  1. DK:导出密钥。

执行步骤:

步骤1:若dkLen > (232 – 1) × hLen,返回错误标识。

步骤2:分组数l和最后一个分组的大小r

(即r = dkLen mod hLen,但模值为0时修正为hLen)。

步骤3:for i = 1,2,..., l

      3.1        Ti = 0,U0=S || Int(i)(Int(i)为i值的32比特大端表示)

      3.2        for j = 1,2,..., c

            3.2.1     Uj= PRF (P, Uj-1)

            3.2.2     Ti = TiUj

步骤4:返回DK= MSB(T1 || T2 || ... || Tl , dkLen)。

备注:PKCS5 v2.1 PBKDF2NIST SP800-132 PBKDF中使用的PRF都是HMAC,而NIST SP800-108(普通密钥导出函数,非基于口令的密钥导出函数)中使用的PRF可以是HMACCMAC

猜你喜欢

转载自blog.csdn.net/samsho2/article/details/83986926
今日推荐