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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章