SSL 原理的學(xué)習 RSA的公用密鑰密碼系統廣泛地應用于計算機工業(yè)的認證和加密方面。
公用密鑰加密技術(shù)使用不對稱(chēng)的密鑰來(lái)加密和解密,每對密鑰包含一個(gè)公鑰和一個(gè)私鑰,公鑰是公開(kāi),而且廣泛分布的,而私鑰從來(lái)不公開(kāi),只有自己知道。
用公鑰加密的數據只有私鑰才能解密,相反的,用私鑰加密的數據只有公鑰才能解密,正是這種不對稱(chēng)性才使得公用密鑰密碼系統那么有用。
認證是一個(gè)驗證身份的過(guò)程,目的是使一個(gè)實(shí)體能夠確信對方是他所聲稱(chēng)的實(shí)體。
下面使用 {something}key 表示something 已經(jīng)用密鑰 key 加密或解密。
實(shí)例:現在有兩個(gè)家伙 A 和 B,其中 B 想要聯(lián)系 A,此時(shí) A 要驗證 B 真的就是 B,其中 B 有一對密鑰對,一個(gè)公鑰,一個(gè)私鑰,首先,
1,B 會(huì )偷偷的告訴 A 他的公鑰(如何偷偷的,馬上再說(shuō))。
* B --> A public-key
2,收到 B 發(fā)送來(lái)的請求(其中包含 B 的公鑰)后,A 產(chǎn)生了一段隨機消息,并發(fā)送給了 B:
* A --> B rand-msg
3,B 收到這段 rand-msg 后,拿出自己的私鑰進(jìn)行了加密,并將加密后的消息返回給了 A:
* B --> A {rand-msg}B-private-key
4,此時(shí),A 收到的是 B 發(fā)送過(guò)來(lái)的經(jīng)過(guò) B 的私鑰加密后的消息,然后掏出第一個(gè) B 發(fā)送給他的公鑰去解密,并且和自己在上一次產(chǎn)生的 rand-msg 進(jìn)行比較,如果一樣的話(huà),他就會(huì )開(kāi)心了,果然是 B。
====> 看上去很美
一切聽(tīng)上去好像很完美了,可是事實(shí)并不像看上去的那么美... ...
我們再舉個(gè)例子,離實(shí)際生活近一點(diǎn)的例子,仍然是 A 和 B 兩個(gè)家伙,兩人都是啞巴,他們的通信都是通過(guò)傳遞小紙條的。其中 A 膽子很小,一天到晚都呆在家里,一天,B 要去找 A,在 A 的門(mén)口敲門(mén),
1,并把一個(gè)他的公鑰寫(xiě)在紙條上通過(guò)門(mén)縫里傳給 A,
* B --> A b-public-key
2,此時(shí),A 傳了紙條給 B
* A --> B 你是 B 嗎?
3,B 收到 A 傳來(lái)的消息,很自覺(jué)地回了消息,并且還用自己的私鑰給消息加了密,可是消息好像不太對:
* B --> A {嗨!兄弟是我!我是 C!}b-private-key
4,A 從門(mén)縫里接過(guò)小紙條,再拿出 B 第一次給他的 b-public-key 進(jìn)行解密,解開(kāi)了,B 也在門(mén)外等了好久,人沒(méi)有見(jiàn)著(zhù),回去了... ...
從這里看出,B 必須對自己需要加密的東西有所了解,還有,這個(gè)私鑰只有你才有!
====> 數字簽名
現在的改進(jìn)是在第三步,當 B 接收到 A 的隨機消息后,并不是簡(jiǎn)單的用私鑰加密一下就好了,而是根據 A 的隨機消息來(lái)構造一個(gè)消息摘要,然后再對這個(gè)消息摘要進(jìn)行加密。
通過(guò)使用這個(gè)消息摘要,A 通過(guò) b-public-key 解密收到這個(gè)加密后的消息摘要,并還原成隨機消息來(lái)比較他之前發(fā)送給 B 的 rand-msg。
~~~ 個(gè)人感覺(jué),這里主要多了一個(gè)對消息進(jìn)一步的消息摘要的構造過(guò)程。多了一層保護,因為一般是不知道如何構造摘要的。
而這個(gè)改進(jìn)技術(shù)就是數字簽名技術(shù)。正如我個(gè)人感覺(jué)的這里的消息摘要(簽名)只是多了一層消息的構造過(guò)程,同樣有些危險。因此,我們的認證協(xié)議需要一次以上的協(xié)議(來(lái)保證更安全的保護),讓部分(or全部)的數據由 B 來(lái)產(chǎn)生(好像也更人性化了一點(diǎn):P):
A --> B Hello, are you B ?
B --> A A, This is B!{Digest[A, This is B!]}b-private-key
此處,我們可以看到了變化:
* B 發(fā)送了自己想要發(fā)送的消息摘要
* 多了發(fā)送的另一部分經(jīng)過(guò) b-private-key 加密的消息摘要,這個(gè)主要用于讓 A 來(lái)驗證 B 是否就是真的 B,感覺(jué)充分使用了這個(gè)別人不知道的 b-private-key :P
====> 證書(shū)
上面我們提到過(guò),在一開(kāi)始 B “偷偷的” 發(fā)送了一個(gè) public-key 給 A(否則任何人都可以是 B 了),為了解決這個(gè)問(wèn)題,標準化組織發(fā)明了一個(gè)叫做證書(shū)的咚咚,一個(gè)證書(shū)主要包含如下信息:
* 證書(shū)的發(fā)行者姓名
* 發(fā)行證書(shū)的組織
* 標題(主題)的公鑰
* 郵戳
證書(shū)使用發(fā)行者(這里如 B )的私鑰加密。每一個(gè)人(如 A)都知道證書(shū)發(fā)行者的公鑰(這樣,每個(gè)證書(shū)的發(fā)行者擁有一個(gè)證書(shū))。證書(shū)是一個(gè)把公鑰與(證書(shū)的發(fā)行者)姓名綁定的協(xié)議。通過(guò)使用證書(shū)技術(shù),每一個(gè)人(如A )都可以檢查 B 的證書(shū),判斷是否被假冒。假設 B 控制好他的私鑰,并且他確實(shí)是得到證書(shū)的 B,就萬(wàn)事大吉了。
1,A-->B hello
2,B-->A Hi, 兄弟,我是 B, 看,這是我的證書(shū) b-certificate
3,A-->B 別以為你有了 B 的證書(shū) b-certificate,我就真的以為你是 B 了,證明你是 B
4,B-->A A, This Is B{Digest[A, This Is B] }b-private-key
再次解釋一下:當 A 收到 B 的第一條消息(2步)后,他可以檢查并核實(shí)證書(shū),以及簽名(如上,使用了消息摘要和公鑰加密),然后再核實(shí)主題(B 的名字)來(lái)確定是不是真的 B。這樣,A就可以確信這個(gè)公鑰的確是 B 的公鑰,下面,再次要求 B 證明他的身份。B 則重新進(jìn)行如上的過(guò)程,計算消息摘要,然后使用 private-key進(jìn)行加密... ...
* 不是有了證書(shū),你就可以進(jìn) A 的家門(mén)的
* 因為你沒(méi)有 B 的私鑰,所以你無(wú)法構造一個(gè)可以讓 A 相信這是來(lái)自 B 的消息。
====> 交流秘密
下面終于可以進(jìn)入 A 的家門(mén)了,B 好辛苦啊,但是下面的交流還是秘密啊,不能被旁人看到,那可是國家機密哦:)
當然,A 之后發(fā)送的消息就是只有 B 才能解碼的消息了,如下:
* A-->B {secret} b-public-key
分析一下上面這個(gè) secret,發(fā)現這個(gè) secret 的方法只有使用 B 的私鑰 b-private-key 來(lái)解密,交換秘密是公用密鑰密碼系統的另一種強大的用法。即使 A 和 B 之間的通信被監視,除了 B,也沒(méi)有人能夠得到秘密。
因為 A(這是他自己傳送的秘密) 和 B(他有私鑰) 都知道這個(gè)秘密,所以他們就可以初始化一個(gè)對稱(chēng)的密碼算法(如DES,RC4,IDEA),然后開(kāi)始傳輸用它加密的消息。下面是修正后的協(xié)議:
A --> B hello
B --> A Hi, I'm B, b-certificate
A --> B prove it
B --> A A, This Is b{ digest[A, This Is B] } b-private-key
A --> B ok b, here is a secret {secret} b-public-key // A 傳了一個(gè) secret
B --> A {some message}secret-key
其中,secret-key 的計算取決于協(xié)議的定義,但是它可以簡(jiǎn)化成一個(gè) secret 的副本。
===> Hacker 來(lái)襲
有些 Hacker 很壞,他們雖然不能 “竊聽(tīng)” 到 A 和 B 之間的國家級機密的對話(huà),但是他們可以從中作梗:
A-->M hello
M-->B hello
B-->M Hi, I'm B, B-certificate
M-->A Hi, I'm B, B-certificate
A-->M prove it
M-->B prove it
B-->M A, This Is B{ digest[A, This Is B] } B-private-key
M-->A A, This Is B{ digest[A, This Is B] } B-private-key
A-->M ok B, here is a secret {secret} B-public-key
M-->B ok B, here is a secret {secret} B-public-key
B-->M {最近國際形勢不太樂(lè )觀(guān)??!}secret-key
M-->A Garble[ {最近國際形勢不太樂(lè )觀(guān)??!}secret-key ] // 如果 M 夠 “幸運” 的話(huà),可能變成了 “你這個(gè)大笨蛋!”
可以看到這個(gè) Hacker 好壞,他一直等到 A 和 B 開(kāi)始交流機密了,然后通過(guò)改變 B 發(fā)送給 A 的機密的方式開(kāi)始作梗,而此時(shí) A 已經(jīng)相信這是 B 的機密了(可能變成了: 你這個(gè)大笨蛋!:P ),結果悲劇再一次上演... ...
為了防止這種破壞,A 和 B 在他們的協(xié)議中引入了一種消息認證碼(Message Authentication Code,MAC)。MAC 是根據秘密的密鑰和傳輸的數據計算出來(lái)的,上面描述的消息摘要算法的屬性正好可以用于構造抵抗 M 的MAC功能。
MAC := Digest[ some message, secret ]
注:我們發(fā)現之前的消息摘要只是對消息進(jìn)行構造,此處,包括了 secret。
因為 M 不知道這個(gè)秘密的密鑰,所以他無(wú)法計算出這個(gè)摘要的正確數值。即使 M隨機的改變消息,如果摘要數據很大的話(huà),他成功的可能性也會(huì )很小。例如,通過(guò)使用 MD5(RSA公司發(fā)明的一種很好的密碼摘要算法),A 和 B能和他們的消息一起發(fā)送 128 位的 MAC 值。M 猜中這個(gè)正確的 MAC 值的幾率只有1/18,446,744,073,709,551,616。
下面是又一次的修正協(xié)議:
A --> B 你好
B --> A 嗨,我是 B,b-certificate
A --> B prove it
B --> A {digest[A, 我是 B] } b-private-key
A --> B ok B, here is a secret {secret}b-public-key
B --> A {some message,MAC}secret-key
現在 M 已經(jīng)無(wú)技可施了。他如果下面想要干擾了得到的消息,A 和 B 能夠發(fā)現偽造的 MAC 值并且立即停止交談。這樣 M 不再能與 B 通訊。
整個(gè)過(guò)程:
1,分發(fā)證書(shū)
2,驗證證書(shū),驗證身份
3,交換秘密