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的加密算法
輸入參數:
- M:明文。
- P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
- S:鹽值,8字節。無需保密,增加密文多變性。
- c:迭代次數,越大越好,建議不小於1000。
內部參數:
- ENC-CBC:加密函數CBC模式(如AES-ENC-CBC)。
返回數據:
- 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的解密算法
輸入參數:
- C:密文。
- P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
- S:鹽值,8字節。無需保密,增加密文多變性。
- c:迭代次數,越大越好,建議不小於1000。
內部參數:
- DEC-CBC:解密函數CBC模式(如AES-DEC-CBC)。
返回數據:
- 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的加密算法
輸入參數:
- M:明文。
- P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
- S:鹽值,8字節。無需保密,增加密文多變性。
- c:迭代次數,越大越好,建議不小於1000。
內部參數:
- dkLen:導出密鑰DK的字節長度。
返回數據:
- 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的解密算法
輸入參數:
- C:密文。
- P:口令,任意長度的字符串(通常爲ASCII 或UTF-8字符)。
- S:鹽值,8字節。無需保密,增加密文多變性。
- c:迭代次數,越大越好,建議不小於1000。
內部參數:
- dkLen:導出密鑰DK的字節長度。
返回數據:
- 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。