證明你是你
信息的加解密過程很簡單:假設(shè)A要發(fā)送信息給B,A用B的公鑰加密信息,得到密文;B用自己的私鑰解密信息,得到明文。
但其中有一個(gè)問題:怎么證明A是A?
由于B的公鑰是公開的,如果僅僅這樣簡單地加解密,顯然B是不能確定信息是否來自于A的。于是就有了簽名這個(gè)東西。
簽名
在說簽名之前,先來說一下數(shù)據(jù)摘要(Digest)
我們知道人的指紋是獨(dú)一無二的,于是我們就想,文件能不能也有這樣一個(gè)屬性,這樣我們就可以容易地驗(yàn)證文件是否被更改。
數(shù)據(jù)摘要就是這樣一個(gè)東西,通過使用數(shù)據(jù)摘要算法,常見的有(MD5,SHA1等),我們可以生成文件的數(shù)據(jù)摘要,并且可以認(rèn)為這個(gè)摘要是獨(dú)一無二的。
簽名是為了讓信息的接收者可以驗(yàn)證發(fā)送者的身份。
同樣假設(shè)A發(fā)送信息M給B,A首先生成一下所要發(fā)送信息的數(shù)據(jù)摘要,然后用自己的私鑰對摘要進(jìn)行加密,用私鑰加密摘要的這個(gè)過程就叫簽名,操作之后就得到了簽名S。
然后A用B的公鑰加密信息M得到密文C,將C和生成的簽名S一起發(fā)送給B。
B收到后,用自己的私鑰對密文C進(jìn)行解密,得到明文M。
然后B生成M的數(shù)據(jù)摘要D2,用A的公鑰解密簽名S,得到數(shù)據(jù)摘要D2,將D1和D2進(jìn)行比較,如果相同則證明這個(gè)消息確實(shí)來自于A。
注意:用私鑰加密,公鑰解密。和用公鑰加密,私鑰解密都是可以的。
證書
當(dāng)今世界什么都可能是假的,你可能是個(gè)假人,上了個(gè)假大學(xué)……
所以B拿到的A的公鑰也可能是假的,如果這樣的話,那簽名什么的還有什么意義呢?可能C想對B圖謀不軌,將B手中的A公鑰替換成了自己的公鑰,然后就可以冒充A和B對話。
于是就有了證書這東西。
證書就是用來證明你手里的公鑰的主人省份,證書一般包含:
- 公鑰PU
- 公鑰的簽名S
- 公鑰所有者的信息。
拿到證書之后,我們需要解密公鑰的簽名S,然后與公鑰PU對比,那我又怎么保證解密S用的公鑰PUU是真的呢?那我是不是又要有一個(gè)證書來證明PUU的正確性,那你又怎么證明用來解密PUU簽名的公鑰PUUU的正確性呢,然后就是PUUUUUU……
其實(shí)這個(gè)循環(huán)從開始就可以避免,只要發(fā)放證書的是一個(gè)權(quán)威機(jī)構(gòu)不就行了。這個(gè)機(jī)構(gòu)叫做CA(Certification Authority)
CA
CA用自己的私鑰對A的公鑰進(jìn)行簽名,將這個(gè)簽名和A的公鑰,以及與A相關(guān)的一些信息做成證書。
當(dāng)B想要A的公鑰時(shí),找CA拿A的證書。用CA的公鑰解密A的公鑰的簽名,與證書中的A的公鑰比較,如果一樣,證明這個(gè)證書是有效的。如果不一樣,說明說明證書可能已經(jīng)被篡改,或者這是個(gè)假的CA……