1.1.1.1 PKCS#1標準格式簽名
1.1.1.1.1 PKCS#1簽名格式
被簽名的數據爲字節數組。
對給出的被簽名原數據進行HASH運算,HASH結果按PKCS#1標準進行填充:
B = 00 01 ff ff … ff 00 30 … H[00],H[01],…,H[13]
其中H[00],…,H[13]爲HASH結果。
再使用用戶的私鑰對填充後的數據塊作RSA運算,得到的結果即爲PKCS#1格式簽名值。當使用1024位的RSA算法進行簽名時,簽名結果長度爲128字節(與密鑰長度相同)。
-------------------------------------------------------------------------------------------------------------------------------------------------
1.1.1.1.2 PKCS#1簽名
1) 用SHA-1摘要算法對需要簽名的數據(DATA)進行HASH運算,生成20字節HASH結果:
H = SHA(DATA) H爲20字節
2) 按PKCS#1標準對HASH結果作填充;
B = 00 01 ff ff … ff 00
30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14
H[00],H[01],…,H[13]
3) 使用私鑰(記作pvk)對填充後的數據塊作RSA運算,生成128字節簽名結果:
SIGN = RSApvk(B) SIGN爲128字節
1.1.1.1.3 PKCS#1驗籤
從接收簽名結果記爲SIGN,簽名原數據爲DATA,驗籤公鑰爲pbk,則驗證簽名的流程爲:
1) 使用公鑰對簽名結果作RSA公鑰解密運算並去掉填充:
H’ = RSApbk(SIGN)
2) 對簽名原數據作HASH運算:
H = SHA(DATA)
3) 比較H與H’,如相等,則驗證正確,否則驗證錯誤。
1.1.1.2 PKCS#7標準格式簽名
1.1.1.2.1 PKCS#7簽名格式
PKCS#7簽名是在PKCS#1簽名的基礎上增加了簽名者信息等內容後,並進行DER編碼後的數據結構。其結構如表1所示:
表1 PKCS#7數字簽名格式表
PKCS#7 數 字 籤 名 格 式 |
|
版本號 |
1 |
信息摘要算法標識 |
|
被簽名內容信息 |
數據類型 |
被簽名內容(可選) |
|
證書 |
簽名者證書和簽發者證書(可選) |
CRLs |
證書作廢鏈(可選) |
簽名者信息 |
版本號(1) |
證書序列號 |
|
信息摘要算法標識 |
|
簽名時間(可選) |
|
簽名算法標識 |
|
簽名值 |
在數字簽名結果中可以包含被簽名數據(稱爲Attach方式)或不包含被簽名數據(稱爲Detach方式);在數字簽名結果中可以包含簽名者證書也可以不包含簽名者證書。
“簽名值”是通過私鑰對“被簽名內容”和其它可認證屬性進行簽名運算的結果。因此,在上述簽名格式中的證書、CLRs、被簽名內容等可以從已生成的簽名結果中刪除或重新插入。一般情況下,簽名格式根據下面的需要進行選擇:
1) 需要保存在數據庫中的數字簽名與被簽名原數據採用分離的方式進行存放,即在“被簽名內容信息”內不含實際的“被簽名內容”,被簽名內容存放在數據庫其它地方。
2) 不包含簽名者證書,可以減少簽名數據大小,但在驗證時需要查找證書。
3) 需要在網絡上傳輸(例如與其它系統交換數據)的數字簽名,在簽名包中可以包含被簽名數據和簽名者證書。
1.1.1.2.2 PKCS#7簽名
數字簽名前要對數據使用SHA-1或SM3數據摘要算法作HASH運算,再用用戶的簽名私鑰作RSA運算,結果即爲對數據的“數字簽名”。下面的DATA爲待簽名數據,HASH(…)爲HASH函數,SIGN(…)爲簽名運算函數,DS爲簽名結果。數字簽名過程爲:
1)對數據作HASH運算:
H = SHA(DATA) H爲20字節
2)按PKCS#1標準對HASH結果作填充;
B = 00 01 00 ff ff … ff 00 30 … H[00],H[01],…,H[13]
3)使用用戶的私鑰(pvk)對填充後的數據塊作RSA運算。
DS = RSApvk(B) DS爲128字節
4)按PKCS#7標準格式對簽名進行編碼,得到的結果記爲signedData。
1.1.1.2.3 PKCS#7驗籤
設待驗證的簽名爲signedData,簽名原數據爲DATA,則驗證簽名的流程爲:
1)從signedData中提取簽名者證書序列號等信息,按證書序列號獲取簽名者證書並檢驗證書的有效性(在簽名中提取證書或通過LDAP下載證書);
2)從證書中提取簽名者公鑰(pbk),使用公鑰對簽名結果作RSA公鑰解密運算並去掉填充:
H’ = RSApbk(DS)
3)對簽名原數據作HASH運算:
H = SHA(DATA)
4)比較H與H’,如相等,則驗證正確,否則驗證錯誤。
1.1.2 數字信封
數字信封用於通信雙方交換數據。發送方生成一個隨機的報文密鑰,使用報文密鑰對發送內容進行加密(對稱算法),再用接收方的公鑰對報文密鑰加密,最後將加密的報文密鑰和加密的發送內容按PKCS#7標準,編碼組成一個“數字信封”。發送方還可以爲發送內容附加簽名。
1.1.2.1 數字信封格式
數字信封的格式,見表2、表3:
表2 數字信封格式(不帶簽名)
數 字 信 封 格 式 (不帶簽名) |
|
版本號 |
0 |
接收者信息 |
版本號 |
證書序列號 |
|
對密鑰的加密算法標識 |
|
加密的報文密鑰 |
|
加密內容信息 |
數據類型 |
數據加密算法標識 |
|
加密的內容 |
表3 數字信封格式(帶簽名)[G2]
數 字 信 封 格 式 (帶簽名) |
|
版本號 |
0 |
接收者信息 |
版本號 |
證書序列號 |
|
對密鑰的加密算法標識 |
|
加密的報文密鑰 |
|
信息摘要算法 |
算法標識 |
加密內容信息 |
數據類型 |
加密的內容(使用報文密鑰加密) |
|
證書 |
簽名者證書和簽發者證書(可選) |
簽名者信息 |
版本號(1) |
簽名者證書序列號 |
|
簽名時間 |
|
簽名算法 |
|
加密的簽名值(使用報文密鑰加密) |
|
其它屬性 |
1.1.2.2 製作數字信封
數字信封製作過程:
1)隨機生成報文密鑰mk;
2)用接收方公鑰對mk加密(按PKCS#1標準);
3)使用mk對發送內容加密;
4)如果需要簽名,則執行如下步驟:
a) 對發送內容作數字簽名(見數字簽名過程,但不作編碼);
b) 使用mk爲密鑰對簽名進行加密;
5)按格式編碼構成數字信封。
1.1.2.3 解數字信封
接收方從數字信封中解出所需的內容,並驗證發送方的簽名(如果有的話)。
解數字信封的過程:
1)使用接收者自已的私鑰解出mk;
2)使用mk爲密鑰解密傳送的內容;
3)如果存在簽名,則執行:
a) 使用mk爲密鑰解出簽名值;
b) 驗證簽名。