基本簡介
用公鑰加密的數據只有私鑰才能解密,相反的,用私鑰加密的數據只有公鑰才能解密,正是這種不對稱性才使得公用密鑰密碼系統那么有用。
使用公用密鑰密碼系統進行認證
認證是一個驗證身份的過程,目的是使一個實體能夠確信對方是他所聲稱的實體。
下面用簡單的例子來描述如何使用公用密鑰密碼系統來輕易的驗證身份。
註:下面的 key 表示something 已經用密鑰 key 加密或解密。
加密解密雛形
假設A要認證B,B有一個密鑰對,即一個公鑰和一個私鑰,B透露給A他的公鑰(至於他是怎么做的將在以後討論)。然後A產生一段隨機的訊息,然後把它發給B。
A-->B random--message
B用自己的私鑰來加密這段訊息,然後把加密後的訊息返回給A。
B-->A B's--private--key
A接到了這段訊息,然後用B以前發過來的公鑰來解密。她把解密後的訊息和原始的訊息做比較,如果匹配的話,她就知道自己正在和B通信。一個入侵者應該不知道B的私鑰,因此就不能正確的加密那段A要檢查的隨機訊息。
數字簽名
除非你確切的知道你在加密什麼,否則用你的私鑰加密一些東西,然後發給別人永遠不是一件好事。這是因為加密後的數據可能會背叛你(記住,只有你能加密,因為只有你才有密鑰)。
所以,我們不加密A 傳送的原始訊息,取而代之的是,由B構造一個訊息摘要,然後加密它。訊息摘要是從隨機訊息中以某種方式提取出來的,並且具有以下特點:
- 摘要很難逆轉,任何假冒B的人不能從摘要得到原始訊息
- 假冒者無法找到具有相同摘要的不同訊息
通過使用摘要,B能夠保護自己。他首先計算出A發給他的隨機訊息的摘要並加密,然後把加密後的摘要返回給A,A可以計算出相同的摘要,通過解密B的訊息然後對比一下就可以認證B的身份。
這個過程就是傳說中的數字簽名。
A-->B hello,are you B?
B-->A A,This Is B{digest[A,This Is B]}B's-private-key
當B使用這個協定的時候,他知道自己發給A的是什麼訊息,並且不介意簽名。他首先傳送沒有加密的訊息“A,This Is B” 然後傳送加密的摘要。A能夠輕易的判斷B是B,並且B沒有簽任何他不願意簽的東西。
分發公鑰與證書
B如何以一種可信賴的方式分發他的公鑰呢?我們假設認證協定是這個樣子的:
A-->B hello
B-->A Hi, I'm B, B's-public-key
A-->B prove it
B-->A A, This Is B{ digest[A, This Is B] } B's-private-key
如果使用這個協定的話,任何人都可以是B。你需要的只是一個公鑰和私鑰,你跟A慌稱你是B,接著你用自己的公鑰代替B的公鑰,然後你通過用你的私鑰加密的東西來證明,這樣A就不能分辨出你不是B。
為了解決這個問題,標準化組織發明了一個叫做證書的東西,一個證書包括下面的一些內容:
- 證書發行者的名字
- 證書傳送給的團體
- 主題的公鑰
- 一些時間戳
證書是由證書發行者的私鑰簽名的,每個人都知道證書發行者的公鑰(即證書發行者有一個證書,等等)。證書是一種把公鑰綁定到名字的標準方式。
通過使用證書這種技術,每個人都可以通過檢查B的證書來判斷B是不是偽造的。假設B嚴格的控制著他的私鑰,並且的確是b得到了他的證書,那么一切都好。下面是補償協定:
A-->B hello
B-->A Hi, I'm B, B'S-certificate
A-->B prove it
B-->A A, This Is B{ digest[A, This Is B] } B's-private-key
當A收到B的第一條訊息,她可以檢查證書,核實簽名(如上,使用摘要和公鑰加密),然後,核實主題(B的名字)來判斷那是不是真的B。這樣她就相信公鑰是B的公鑰,然後要求B證明他的身份。B則重新進行一次上面的相同過程,計算訊息的摘要,簽名之後發給A,A可以用從證書得到的公鑰檢查B的訊息摘要,從而判斷B的身份。
防止數據篡改與訊息認證碼
假設有個壞傢伙H,雖然不能發現A和B交換的秘密,但是他可以干預並且破壞他們的對話。
舉例來說,如果H位於A和B之間,他可以選擇讓大多數的訊息返回以及向前繼續傳輸沒有改變,但是破壞了特定位的訊息。
A-->H hello
H-->B hello
B-->H Hi, I'm B, B's-certificate
H-->A Hi, I'm B, B's-certificate
A-->H prove it
H-->B prove it
B-->H A, This Is B{ digest[A, This Is B] } B's-private-key
H-->A A, This Is B{ digest[A, This Is B] } B's-private-key
A-->H ok B, here is a secret B's-public-key
H-->B ok B, here is a secret B's-public-key
B-->H {some message}secret-key
H-->A Garble[ {some message}secret-key ]
H一直讓數據沒有改變的通過,直到A和B分享一個秘密。然後H通過改變B傳送給A的訊息來進入這個方式中。這時候A是相信B的,因此她就可能相信這個改變的訊息,然後按照它來做。注意H並不知道這個秘密-他能做的所有事就是破壞用這個秘密的密鑰加密的數據。他可能不能利用這個協定製造出一條有效的訊息,但是下一次,他可能會幸運一點。
為了防止這種破壞,A和B在他們的協定中引入了一種訊息認證碼(MAC)。MAC是根據秘密的密鑰和傳輸的數據計算出來的,上面描述的摘要算法的屬性正好可以用於構造抵抗H的MAC功能。
MAC := Digest[ some message, secret ]
因為H不知道這個秘密的密鑰,所以他無法計算出這個摘要的正確數值。即使H隨機的改變訊息,如果摘要數據很大的話,他成功的可能性也很小。舉例來說,通過使用MD5,A和B能和他們的訊息一起傳送128位的MAC值。H猜中這個正確的MAC值的幾率是 18,446,744,073,709,551,616 分之1。
下面是樣本協定,又訂正了一次:
A-->B hello
B-->A Hi, I'm B, B's-certificate
A-->B prove it
B-->A {digest[A, This Is B] } B's-private-key
ok B, here is a secret B's-public-key
{some message,MAC}secret-key
H現在有麻煩了,H可以改變任何的訊息,但是MAC的計算將揭露他的欺詐行為。A和B能發現偽造的MAC值並停止會話,H就不能偽造B的訊息了。
但是這樣同樣不能防範H鸚鵡學舌。如果H記錄了會話的過程,他雖然可能不知道會話的內容,但是他可以重放這些會話。實際上,H能在A和B之間做一些真正齷齪的事。