PKCS5 v2.1主要讲述了三个方面的内容:
- 基于口令的密钥导出函数PBKDF。
- PBKDF1:仅兼容PKCS5 v1.5用,使用HASH(MD2、MD5、SHA-1),导出密钥≤ hLen。
- PBKDF2:推荐使用,使用HMAC,导出密钥可很长。方案同NIST SP800-132的PBKDF。
- 基于口令的加密方案,用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:杂凑函数的输出字节长度。
口令的选择建议参考如下文档。
- 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
输入参数:
- P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
- S:盐值,无需保密,增加密文多变性。
- c:迭代次数,越大越好,建议不小于1000。
- dkLen:导出密钥DK的字节长度,≤ hLen。
内部参数:
- HASH:杂凑函数(为MD2、MD5、SHA-1)。
- hLen:杂凑函数的输出字节长度。
- MSB(L, M):获取数据串M的高L字节。
返回数据:
- 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
输入参数:
- P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
- S:盐值,无需保密,增加密文多变性。
- c:迭代次数,越大越好,建议不小于1000。
- dkLen:导出密钥DK的字节长度,≤ (232 – 1) × hLen。
内部参数:
- PRF:伪随机函数,可以是HMAC-SHA-1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512。
- hLen:杂凑函数的输出字节长度。
- MSB(L, M):获取数据串M的高L字节。
返回数据:
- 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 = Ti⊕Uj
步骤4:返回DK= MSB(T1 || T2 || ... || Tl , dkLen)。
备注:PKCS5 v2.1 PBKDF2和NIST SP800-132 PBKDF中使用的PRF都是HMAC,而NIST SP800-108(普通密钥导出函数,非基于口令的密钥导出函数)中使用的PRF可以是HMAC或CMAC。