1.名詞解釋
- 數字簽名:在ISO7498-2標准中定義為:"附加在數據單元上的一些數據,或是對數據單元所作的密碼變換,這種數據和變換允許數據單元的接收者用以確認數據單元來源和數據單元的完整性,並保護數據,防止被人(例如接收者)進行偽造"。
- PKCS#7:也叫做加密消息的語法標准,由RSA安全體系在公鑰加密系統中交換數字證書產生的一種加密標准。PKCS#7描述數字證書的語法和其他加密消息——尤其是,數據加密和數字簽名的方法,也包含了算法。當使用PKCS#7進行數字簽名時,結果包含簽名證書(一列相關證書撤回列表)和已證明路徑上任何其他證書。如果使用PKCS#7加密數據,通常包含發行者的參考消息和證書的序列號,它與用於解密已加密數據的公共密鑰相關。
2.PKCS#7標准定義
-
數據:字節或8位元組串。
-
簽名設計:隨加密數據摘要一起的數據。一個信息摘要是一個哈希算法的結果(術語摘要和散列是相同定義的)。使用信息摘要保證原始消息在傳輸過程中沒有被篡改,並確認發送者的身份。
-
封裝數據:密文加上公鑰能夠解密數據。用這種方法保持消息內容對所有人保密,都是信任收件人。
-
簽名和加密數據:有公鑰的加密內容和雙重加密的消息摘要。
-
摘要數據:數據加上消息摘要。
-
單獨的加密數據:在這種情況,加密數據的公鑰必須通過其他機制傳輸。
3.類型
1.CertificateRevocationList
CertificateRevocationLists 類型給定一個證書撤銷列表的集合。它表示集合中包含足夠的信息來決定集合中的證書是否是”hot listed”的,但是可能有多於必要的證書撤銷列表,也可能少於必要的。
CertificateRevocationLists::= SET OF CertificateRevocationList
2.ContentEncryptionAlgorithmIdentifier
ContentEncryptionAlgorithmIdentifier類型確定一個內容加密算法比如DES。一個內容加密算法支持加密和解密操作。加密操作用一個內容加密密鑰把一個8位字節串(消息)映射為另一個8位字節串(密文)。解密操作和加密操作相反。由上下文確定使用哪 個操作。
ContentEncryptionAlgorithmIdentifier::= AlgorithmIdentifier
3.DigestEncryptionAlgorithmldentifier
DigestAlgorithmIdentifier類型確定一個消息摘要算法。例如MD2和MD5。一個消息摘要算法把一個8位字節串(消息)映射位另一個8位字節串(消息摘要)。
DigestAlgorithmIdentifier::= AlgorithmIdentifier
4. DigestEncryptionAlgorithmIdentifier
DigestEncryptionAlgorithmIdentifier類型確定一個摘要加密算法(可用來加密消息摘要)。 一個例子就是PKCS #1的rsaEncryption。一個摘要加密算法支持加密和解密操作。加密操作用一個摘要加密密鑰把一個8位字節串(消息摘要)映射為另一個8位字節串(加了密的摘要)。解密操作和加密操作相反。由上下文確定使用哪 個操作。
DigestEncryptionAlgorithmIdentifier::= AlgorithmIdentifier
5.ExtendedCertificateOrCertificate
ExtendedCertificateOrCertificate類型指定一個PKCS #6擴展證書或者一個X.509證書。這一類型遵循PKCS #6 第6節推薦的語法:
ExtendedCertificateOrCertificate::= CHOICE {
certificate Certificate, -- X.509
extendedCertificate [0] IMPLICITExtendedCertificate
}
4.通用語法
參照此標准,實體間內容交換的通用語法在內容上結合了一個content type。 該語法應有ASN.1類型的 ContentInfo:
ContentInfo::= SEQUENCE {
contentType ContentType,
content [0] EXPLICIT ANY DEFINED BYcontentType OPTIONAL }
ContentType::= OBJECT IDENTIFIER
類型ContentInfo的域有以下意義:
-
contentType 簡要說明該內容的類型。它是一個對象標識符,即它是一個由定義內容類型的權威機構分配的唯一整數串。這一標准定義了六種內容類型:(見Section14): data, signedData,envelopedData, signedAndEnvelopedData, digestedData, 和 encryptedData。
-
content就是內容. 域是可選的,如果該域不存在,它的intended value一定由其他方式給出。它的類型和contentType的對象標識符一起定義。
注:當一個ContentInfo值是諸如signed-data、signed-and-enveloped-data、或者digested-data的內部內容,一個消息摘要算法就應用於該內容的DER編碼的字節上。當一個ContentInfo值是enveloped-data或signed-and-enveloped-data 的內部內容,一個內容加密算法就應用於該內容的定長BER編碼的字節上。
5.Signed-data 內容類型
signed-data內容類型由任意類型的內容和加密的(0或多個簽名者)消息摘要組成
標准應用:
- 表示一個簽名者對該內容類型數據的數字簽名
- 發布證書和crl
簽名數據的產生過程有如下幾步:
- 對於每一個簽名者,他用自己的消息摘要算法計算出摘要值
- 對於每一個簽名者,消息摘要和相關的信息用自己的私鑰加密
- 對於每一個簽名者,把加密的消息摘要和其他的簽名者特定信息放入SignerInfo值中。每個簽名者的證書、crl以及那些並不對應任何簽名者的信息也在這一步被收集進來。
- 把所有簽名者的信息摘要算法、他們的SignerInfo值和內容一起放進SignedData值中。
5.1SignedData類型
signed-data內容類型應該是ASN.1 類型的 SignedData:
SignedData::= SEQUENCE {
version Version,//1
digestAlgorithmsDigestAlgorithmIdentifiers,
contentInfo ContentInfo,
certificates
[0]IMPLICIT ExtendedCertificatesAndCertificates
OPTIONAL,
crls
[1] IMPLICITCertificateRevocationLists OPTIONAL,
signerInfos SignerInfos
}
DigestAlgorithmIdentifiers::=
SET OF DigestAlgorithmIdentifier
SignerInfos::= SET OF SignerInfo
類型SignedData的域有以下幾點意義:
- version是指語法的版本號,這一標准中版本應該為1 。
- digestAlgorithms是消息摘要算法標識符的集合。 可以包含任意數量的元素,包括0。每一個元素標識一種消息摘要算法(和任何相應的參數),內容就是用某個簽名者的算法進行摘要運算的。該集合旨在(以任何順序)列出所有簽名者使用的消息摘要算法以方便one-pass簽名驗證。這一消息摘要處理過程在Section 9.3中有描述。
- contentInfo是被簽名內容。它可以包含任意一種定義了的內容類型。
- certificates是PKCS#6擴展證書和X.509證書的集合。它表示集合足以包含從可識別的“根”或“頂級CA”到signerInfo域中所有簽名者的證書鏈。可能有多於必要的證書,並且可能有足夠的證書來包含鏈(從兩個或多個獨立的頂級CA)。 也可能有少於必要的證書,比如驗證簽名有一個替換的方法來獲得必要的證書(e.g., 從一個先前證書集合中)。
- crls是證書撤銷列表的集合。它表示集合包含足夠的信息來決定certificates域中的證書是否是“hot listed”的,但這不是必須的。 可能有多於必要的crl,也可能有少於必要的crl。
- signerInfos是每個簽名者信息的集合。其中可有任意數量的元素,包括0。
5.2 SignerInfo 類型
每個簽名者的信息都早SignerInfo中呈現
SignerInfo::= SEQUENCE {
version Version,//是指語法的版本號,這一標准中版本應該為1
issuerAndSerialNumberIssuerAndSerialNumber,
digestAlgorithmDigestAlgorithmIdentifier,
authenticatedAttributes
[0] IMPLICIT Attributes OPTIONAL,
digestEncryptionAlgorithm
DigestEncryptionAlgorithmIdentifier,//標識用簽名者私鑰加密消息摘要和相關信息的摘要加密算法
encryptedDigest EncryptedDigest,//是用簽名者私鑰加密消息摘要和相關信息后的結果
unauthenticatedAttributes//是不被簽名者簽名(i.e.鑒別的)的屬性的集合
[1] IMPLICIT Attributes OPTIONAL }
EncryptedDigest::= OCTET STRING
- issuerAndSerialNumber通過頒發者的可辨別名和頒發序列號來指定簽名者的證書(及簽名者的可辨別名和公鑰)。
- digestAlgorithm指定對內容和待鑒別屬性(若存在的話)進行摘要計算的信息摘要算法(及相應的參數)。它應該存在於高級SignerInfo值的digestAlgorithms域中。信息摘要的處理在Section9.3中描述。
- authenticatedAttributes是經由簽名者簽名(i.e.鑒別的)的屬性的集合。 該域是可選的,但是當被簽名的ContentInfo的content type不是data類型時該域必須存在。如果該域存在,它必須包含至少兩個屬性:
- PKCS #9 content-type 屬性,當ContentInfo的content type值被簽名時。
-
PKCS #9 message-digest 屬性,當值是內容的消息摘要時(見下面)。
建議在PKCS實現中僅產生版本1的SignedData 值。既然版本0兼容的PEM簽名方法已廢棄,建議PKCS實現僅接受版本1的SignedData 值。
5.3 消息摘要處理
- 初始的輸入是ContentInfo的content域中的DER編碼的內容字節。僅僅是該域的DER編碼的內容字節進行摘要計算,而不包括 identifier字節或length字節。
- 消息摘要依賴於authenticatedAttributes域是否存在。當該域不存在時,結果就是內容的消息摘要值。然而當該域存在時,結果是包含authenticatedAttributes中的屬性值的完全DER編碼的消息摘要。既然Attributes值必須當作和內容的content type、消息摘要一樣的屬性被包含,那些值就間接的包含在結果中
- 當待簽名內容的content type是data且authenticatedAttributes域不存在時僅該數據的值(e.g.,文件的內容)進行摘要計算。這樣有一個優點,就是在加密處理前無需知道待簽名的內容的長度。這個方法和PEM兼容。
5.4摘要加密的處理
- 輸入:消息摘要處理的結果和摘要算法標識符(或object identifier)。
- 加密密鑰:簽名者的私鑰
- 結果密鑰對DigestInfo類型值的BER編碼
DigestInfo::= SEQUENCE {
digestAlgorithmDigestAlgorithmIdentifier,
digest Digest
}
Digest::= OCTET STRING
- digestAlgorithm標識用來計算內容和鑒別屬性的摘要的消息摘要算法(和相應的參數)。它應該和SignerInfo的digestAlgorithm 域有同樣的值。
- digest是消息摘要處理的結果。
6.Enveloped-data 內容類型
6.1 組成
- 加密內容和加密的一個或者多個接收者的內容加密密鑰組成。
6.2 組建過程
- 隨機產生一個對應於特定對稱加密算法的內容加密密鑰K1
- 用K1加密內容得到密文E
- 用接收者的公鑰對k進行機密得到。
- 對與每一個接受者將K2和接受者的其他信息放入Recipientinfo
- 將所有接收者的RecipientInfo值和密文E放入EnvelopedData值中。
6.3 Envelop-data 類型
EnvelopedData::= SEQUENCE {
version Version,
recipientInfos RecipientInfos,// 每個接收者信息的集合
encryptedContentInfo EncryptedContentInfo //密文
}
RecipientInfos::= SET OF RecipientInfo
EncryptedContentInfo::= SEQUENCE {
contentType ContentType,//指示內容的類型
contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier,
encryptedContent [0] IMPLICIT EncryptedContentOPTIONAL //標識內容加密算法
}
EncryptedContent::= OCTET STRING
6.4RecipientInfo類型
- 每個接收者信息用RecipientInfo類型表示:
RecipientInfo::= SEQUENCE {
version Version,
issuerAndSerialNumber IssuerAndSerialNumber,//通過特定的號碼和數字指定受者的證書
//指定用接收者公鑰加密內容加密密鑰的密鑰加密算法
keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,
encryptedKey EncryptedKey //被接受者加密密鑰加密后的內容密鑰
}
EncryptedKey::= OCTET STRING
7.Signed-and-enveloped-data 內容類型
7.1 組成
- 由任意類型的加密內容、加了密的一個/多個接收者的內容加密密鑰和雙重加密的一個/多個簽名者的消息摘要。
- “雙重加密”由簽名者私鑰的加密和內容加密密鑰的加密組成。
7.2 組件過程
- 隨機產生一個對應於特定加密算法的內容加密密鑰k1
- 內容加密密鑰用每個接受者的公鑰加密得到,密鑰k2
- 對與每一個接受者將K2和接受者的其他信息放入Recipientinfo
- 對於每一個簽名者,他用自己的消息摘要算法計算出摘要值 (如果兩個簽名者使用同樣的算法,那么摘要值只需計算一次) 。
- 對於每一個簽名者,消息摘要S和相關的信息用自己的私鑰加密得到Sp,結果再用k1加密得到SE
- 對於每一個簽名者,把雙重加密的消息摘要和其他的簽名者特定信息放入SignerInfo值中
- 用k1加密原文P得到密文E
- 把所有簽名者的消息摘要算法、所有簽名者的SignerInfo值、所有接收者的RecipientInfo值和密文E一起放入SignedAndEnvelopedData
7.2.3打開信封並驗證簽名
- 用接收者的私鑰解密鑰K2得到密鑰K1,並用內容加密密鑰K1解開加密的內容得到原文P。
- 每個簽名者雙重加密的消息摘要SE用K1解得到SP,結果再用簽名者公鑰解密Sp得到摘要S,恢復的消息摘要S再和獨立計算的消息摘要進行比較。
- 注: signed-data和enveloped-data內容類型有序結合通常比SignedAndEnvelopedData 更情願被使用,除非有意考慮PEM加密處理的兼容性。
7.3 SignedAndEnvelopedData 類型
SignedAndEnvelopedData::= SEQUENCE {
version Version,// 1
recipientInfos RecipientInfos, //
digestAlgorithmsDigestAlgorithmIdentifiers,//消息摘要算法標識符的集合
encryptedContentInfoEncryptedContentInfo,//加密內容
//PKCS#6擴展證書何X509證書的集合
certificates [0]IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
//是證書撤銷列表的集合
crls [1] IMPLICIT CertificateRevocationListsOPTIONAL,
signerInfos SignerInfos //每個簽名者信息集合
}
- 注:摘要處理過程中都沒使用DER編碼
8. Digested-data內容類型
8.1 組成
- digested-data內容類型由任意類型的內容和內容的消息摘要組成。
8.2 組建過程
- 使用消息摘要算法對內容計算摘要
- 把消息摘要算法、消息摘要和內容放入DigestdData中.
DigestedData::= SEQUENCE {
version Version,
digestAlgorithmDigestAlgorithmIdentifier,//標識對內容進行摘要計算的消息摘要算法
contentInfo ContentInfo,//對其進行摘要計算的內容。可以是任意定義的內容類型。
digest Digest // digest是消息摘要計算的結果。
}
Digest::= OCTET STRINGD
9.Encrypted-data內容類型
- encrypted-data內容類型由任意類型的加密內容組成。 encryptedContentInfo是加了密的內容信息
EncryptedData::= SEQUENCE {
version Version,// version是指語法的版本號,這一標准中版本應該為0。
encryptedContentInfoEncryptedContentInfo// encryptedContentInfo是加了密的內容信息
}
9.數字簽名與數字信封
1. 數字簽名
-
指用戶利用自己的私鑰對原始數據的哈希摘要進行加密所得的數據。數字簽名定義兩種互補的運算:一種用於簽名,另一個用於驗證。“私鑰簽名,公鑰驗證”。
-
簽名:發送方用特殊的hash算法,由明文中產生固定長度的【摘要】,然后利用自己的私鑰對形成的摘要進行加密,這里加密后的數據就是數字簽名。
-
驗證:接受方利用發送方的公鑰解密被加密的摘要得到結果A,然后對明文也進行hash操作產生摘要B.最后,把A和B作比較。此方式既可以保證發送方的身份正確性,又可以保證數據在傳輸過程中不會被篡改。
2.數字信封
- 數字信封的功能類似於普通信封。普通信封在法律的約束下保證只有收信人才能閱讀信的內容;數字信封則采用密碼技術保證了只有規定的接收人才能閱讀信息的內容。
- 數字信封中采用了單鑰加密體制和公鑰密碼體制。信息發送者首先利用隨機產生的【對稱密鑰】加密信息(因為非對稱加密技術的速度比較慢),再利用接收方的【公鑰】加密對稱密鑰。在傳遞信息時,信息接收方要解密信息時,必須先用自己的私鑰解密加密的對稱密鑰,得到對稱密鑰,才能利用對稱密鑰解密所得到的信息。
- 數字信封既發揮了對稱加密算法速度快、安全性好的優點,又發揮了非對稱加密算法密鑰管理方便的優點。
3.應用示例
- 為了保證信息傳送的真實性、完整性和不可否認性,需要對要傳送的信息進行數字加密和數字簽名。其傳送過程如下:
發送者A:
-
A准備要傳送的 數字信息(明文)
-
A對數字信息(明文)進行哈希(hash)運算,得到一信息摘要。
-
A用自己的【私鑰(SK)】對信息摘要進行加密得到A的數字簽名,並將其附在數字信息上。(數字簽名)
-
A隨機產生一個對稱密鑰,並用此密鑰對要發送的信息(明文)進行加密,形成密文。(對稱加密)
-
A用B的【公鑰(PK)】對剛才隨機產生的加密密鑰進行加密得到encKey,將加密后的DES密鑰連同密文一起傳送給B。(數字信封)
接收者B:
-
B收到A傳送過來的密文和加過密的DES密鑰,先用自己的私鑰(SK)對encKey進行解密,得到對稱密鑰。
-
B然后用對稱密鑰對受到的密文進行解密,得到明文的數字信息,然后將對稱密鑰拋棄(即密鑰作廢)。
-
B用A的公鑰(PK)對A的數字簽名進行解密,得到信息摘要。
-
B用相同的has算法對收到的明文再進行一次hash運算,得到一個新的信息摘要。
-
B將收到的信息摘要和新生成的信息摘要進行比較,如果一致,說明收到的信息沒有被修改過。