PKCS#5研究——第二部分 基於口令的加密方案

6. 基於口令的加密方案

有兩個基於口令的加密PBES方案,如下表。

表5.1 基於口令的加密方案PBES1和PBES2對比

hLen爲HASH函數的輸出長度)

項目

PBES1

PBES2

使用的PBKDF

PBKDF1

PBKDF2

使用的密碼算法

DES / RC2 – CBC模式

AES-CBC-Pad

使用

不推薦

僅兼容PKCS5 v1.5

推薦使用

  • AES-CBC-Pad是AES算法,密鑰16/24/32字節,分組16字節,IV16字節。
  • 根據PKCS#5的附錄B.2.4 RC5-CBC-Pad 提到的RC5-128的填充方式,猜測AES-CBC-Pad的填充方式爲:the padding string consists of 16-(||M||mod 16) octets each with value 16-(||M|| mod 16).

 

6.1 PBES1

PBES中對消息填充的方案(EM = M || PS)爲:

  • 記T = 8-(#M mod 8),
  • 填充數據PS爲連續T個字節且每個字節值均爲T的字符串。
  • 例:若#M mod 8 = 7,PS = 01
  • 例:若#M mod 8 = 0,PS = 08 08 08 08 08 08 08 08
  • 此填充規則來至於RFC 1423。

6.1.1 PBES1-ENC

函數:C = PBES1-ENC (M, P, S, c)

功能:基於口令的加密方案PBES1的加密算法

輸入參數:

  1. M:明文。
  2. P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
  3. S:鹽值,8字節。無需保密,增加密文多變性。
  4. c:迭代次數,越大越好,建議不小於1000。

內部參數:

  1. ENC-CBC:加密函數CBC模式(如AES-ENC-CBC)。

返回數據:

  1. C:密文。

執行步驟:

步驟1:生成導出密鑰,DK = PBKDF1 (P, S, c, 16)。

步驟2:生成加密密鑰K(DK的高8字節)和初始化向量IV(DK的低8字節):

K = DK[0...7], IV = DK[8...15] .

步驟3:生成編碼後的消息(記T = 8-(#M mod 8))

EM = M || PS

其中填充數據PS爲連續T個字節且每個字節值均爲T的字符串。

  • 例:若#M mod 8 = 7,PS = 01
  • 例:若#M mod 8 = 0,PS = 08 08 08 08 08 08 08 08

步驟4:CBC加密:C = ENC-CBC(K, IV, EM)。

步驟5:輸出密文C。

6.1.2 PBES1-DEC

函數:M = PBES1-DEC (C, P, S, c)

功能:基於口令的加密方案PBES1的解密算法

輸入參數:

  1. C:密文。
  2. P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
  3. S:鹽值,8字節。無需保密,增加密文多變性。
  4. c:迭代次數,越大越好,建議不小於1000。

內部參數:

  1. DEC-CBC:解密函數CBC模式(如AES-DEC-CBC)。

返回數據:

  1. M:明文。

執行步驟:

步驟1:生成導出密鑰,DK = PBKDF1 (P, S, c, 16)。

步驟2:生成加密密鑰K(DK的高8字節)和初始化向量IV(DK的低8字節):

K = DK[0...7], IV = DK[8...15] .

步驟3:CBC解密:EM = DEC-CBC(K, IV, C)。

步驟4:解碼生成編碼後的消息

M || PS = EM

記T 爲EM最後一個字節的值,填充數據PS爲連續T個字節且每個字節值均爲T的字符串。如果PS不滿足要求(1):T=1,2,...,8;(2)PS的T個字節的值都爲T;則填充數據格式驗證失敗,返回錯誤。

步驟5:輸出明文M。

6.2 PBES2

PBES中對消息填充的方案(EM = M || PS)爲:

  • 記T = 8-(#M mod 8),
  • 填充數據PS爲連續T個字節且每個字節值均爲T的字符串。

 

  • 例:若#M mod 8 = 7,PS = 01
  • 例:若#M mod 8 = 0,PS = 08 08 08 08 08 08 08 08
  • 此填充規則來至於RFC 1423。

6.2.1 PBES2-ENC

函數:C = PBES2-ENC (M, P, S, c)

功能:基於口令的加密方案PBES2的加密算法

輸入參數:

  1. M:明文。
  2. P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
  3. S:鹽值,8字節。無需保密,增加密文多變性。
  4. c:迭代次數,越大越好,建議不小於1000。

內部參數:

  1. dkLen:導出密鑰DK的字節長度。

返回數據:

  1. C:密文。

執行步驟:(PKCS#5未詳細描述dkLen、K和IV的獲取,相關內容爲揣測)

步驟1:根據選擇的密碼算法AES-CBC-Pad確定dkLen自定義)。

步驟2:生成導出密鑰,DK = PBKDF2 (P, S, c, dkLen)。

步驟3:加密:C = AES-CBC-Pad.ENC(DK, M)。(涉及K和IV的劃分,自定義

步驟4:輸出密文C。

根據PKCS#5的附錄B.2.4 RC5-CBC-Pad 提到的RC5-128的填充方式,猜測AES-CBC-Pad的填充方式爲:the padding string consists of 16-(||M||mod 16) octets each with value 16-(||M|| mod 16).

6.2.2 PBES2-DEC

函數:M = PBES2-DEC (C, P, S, c)

功能:基於口令的加密方案PBES2的解密算法

輸入參數:

  1. C:密文。
  2. P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
  3. S:鹽值,8字節。無需保密,增加密文多變性。
  4. c:迭代次數,越大越好,建議不小於1000。

內部參數:

  1. dkLen:導出密鑰DK的字節長度。

返回數據:

  1. M:明文。

執行步驟:(PKCS#5未詳細描述dkLen、K和IV的獲取,相關內容爲揣測)

步驟1:根據選擇的密碼算法AES-CBC-Pad確定dkLen自定義)。

步驟2:生成導出密鑰,DK = PBKDF2 (P, S, c, dkLen)。

步驟3:解密:M = AES-CBC-Pad.DEC(DK, C)。(涉及K和IV的劃分,自定義

步驟4:輸出明文M。

 

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