天天看點

兩個程式的愛情故事(續)

我這個程序和她不在一個機器上, 雖然相距243毫秒,但是這并不是阻礙我們交往的理由, 我每天都通過socket 和她來通信,訴說相思之情。

不要驚訝我用時間來表示距離,人類好像也是用光年來表示宇宙間的距離吧? 在我們計算機世界, 距離不是有意義的辨別,時間才是! 你看我和紐約相距1萬多公裡, 我和那裡的機器溝通隻需要花費466毫秒, 但是和北京的另外一個機器溝通竟然需要743毫秒! 可見距離近是不管用的!

最近黑客猖獗, 我和她通信的時候總是有一種被偷看的感覺, 實際上确實是這樣, 那些隻有我們才可以知道的悄悄話被别人偷窺,甚至曝光了。

我和她商量着要保護隐私,要對我們來往的信件加密, 可我聽說加密需要密鑰, 這個密鑰必須雙方都得事先知道才行, 我用密鑰加密,她用同樣的密鑰解密。

兩個程式的愛情故事(續)

那問題就來了: 加密解密算法是公開的, 但是密鑰是私有的,當我們倆通過網絡協商密鑰時, 黑客可能就把密鑰也給偷看了, 那加密就毫無用處。

這可真是傷腦筋, 我說:“要不我到你那兒去一趟? 正好看看你, 你可以面對面的把密鑰告訴我。”

她說: “你暈頭了吧, 你一個程序怎麼可能從一個機器來到另外一個機器?”

我自知失言,馬上補救: “ 這樣吧, 我們機器上有個U盤, 要不我把密鑰寫到那裡, 這樣将來可以Copy到你的機器上”

“那更不行了, Copy到U盤上更容易洩露,速度還慢! ”

我是沒轍了,長時間的沉默。

她突然說:“我想起來了,我們機器有個進行數學計算的程序,知識淵博,我去問問他”

我焦急地等待,不知過了多少毫秒, 女朋友終于興沖沖的回來了: “那個數學程序小帥哥真是厲害,我簡直佩服死了, 他告訴我了一個非常簡單的辦法 , 能解決我們的密鑰生成問題”

我心裡略微不爽,但還是耐着性子,一邊聽她說,一邊寫了下來,這個算法确實很簡單, 舉個例子來說是這樣的:

1. 首先我和她先協定一個質數 p=17以及另外一個數字g=3, 這兩個數字是公開的, 黑客拿去也沒有問題

2. 我選擇一個随機的秘密數字x = 15, 計算a = g15 mod p并發送給她。

a = 315 mod 17 = 6.

這個a=6也是公開的

3. 她選擇一個随機的秘密數字y=13, 計算b = g13 mod p并發送給我。

b = 313 mod 17 = 12.

這個b=12也是公開的

4. 我拿到她發給我的b = 12 , 計算s = b x mod p ->1215 mod 17 = 10

5. 她拿到我發給她的a = 6, 計算s = a y mod p -> 613 mod 17 = 10

(注:例子來源于wikipedia, 紅色表示數字一定要保密, 綠色表示數字可以公開)

最後神奇的魔法發生了, 我們兩個得到了同樣的值 s = 10!

這個s 的值隻有我們兩個才知道, 其實就是密鑰了, 可以用來做加密解密了( 當然,這隻是一個例子,實際的密鑰不會這麼短), 我們倆的通訊從此就安全了。

“可是為什麼會這樣呢” 我問道。

“數學家小帥哥說了, 原因很簡單,(gx mod p)y mod p 和 (gy mod p)x mod p 是相等的! ”

“那黑客不能從公開傳輸的 p = 17, g = 3, a = 6 , b = 12 推算出s = 10 嗎?” 我問道。

“當然不能, 不過前提是需要使用非常大的p , x, y, 這樣以來,即使黑客動用地球上所有的計算資源, 也推算不出來。 ”

我雖然心裡不爽, 但還是暗自佩服那個數學家, 他竟然能想到把一些數字給公布出去,不怕黑客竊取, 還不洩露最終的密鑰。解決了在一個不安全的通信環境下,生成密鑰進行加密和解密的問題。

好吧,就用這個方法來加密通信吧。

後記:文中描述的算法叫做Diffie-Hellman Key Exchange算法, 發明人是 Whitfield Diffie 和 Martin Hellman ,他們于2015年獲得了計算機科學領域的最高獎:圖靈獎,以表彰他們對密碼學和當今網際網路安全的巨大貢獻。因為他們的創造,引發了對一個新的密碼學領域,即非對稱密鑰算法的探索,而非對稱密鑰算法可以看作現代密碼學的基礎。