互聯網就是個公開演講的廣場。意思是任何人說任何話,其實別人都是能聽見的。這個認為是互聯網的天性了,那么在這個前提下如果我和我一個朋友說點機密的事情,同時不想讓別人偷聽到,這個就成了一個有點挑戰(zhàn)性的技術問題,也就是今天我們要討論的加密通信。
對稱加密
幾千年來,我們人類都在用一種“對稱性加密“的形式來進行秘密信息的傳遞,”對稱“指的是加密用一個密碼,那解密是用的還是這個密碼。但是“對稱性加密”為啥不能用在互聯網上的加密通信中呢?說說這個過程,我有一個文件,用一定的加密方式來進行加密(比如用一些文件壓縮程序),然后可以把加密后的這個包,傳遞給我的朋友,到目前為止一切都好。但是接下來的問題是,我朋友如何才能解密我給他的文件呢,顯然我必須安全的把我加密時輸入的密碼安全的傳遞給他,這樣才能完成這個加密通信過程。所以這就有了一個雞和蛋的問題。最終我可能就不得不借助互聯網以外的工具,例如打電話,來把密碼給我朋友了。所以,對稱性加密是不適合用于互聯網上的加密通信的。
非對稱加密的原理
那我們就可以想一下,是不是有一種“非對稱加密”的方法能解決雞和蛋的問題呢?恭喜你,答對了!非對稱加密用一句話來描述就是,加密是用一個密碼 key,而解密則會用另外一個密碼 key。安裝好相應地程序之后,任何人都可以在自己的計算機上來生產這一對密碼。其中用于加密的這個叫公鑰,是可以公開給別人的,所以叫”密碼“這個不嚴密,還是英文好,就叫 key。另外一個是絕對自己要保密好的,叫”私鑰“,這個是用來解密的,真的是”密碼“。
這兩個 key 是一對,意思是他們在數學角度是有著聯系的,但是如果想要從公鑰計算出私鑰也是不可能的。加密通信的過程是這樣的,收信人,比如說我,先生成這一對 key,然后我想跟我的朋友秘密通話,那我就把我的公鑰傳給他,這個反正有人得到也沒關系。我朋友拿到公鑰之后,就把他想要跟我說的話進行加密,然后把加密后的信息通過互聯網傳給我,整個互聯網上,即使有其他人得到了這些加密數據也沒用,因為只有我擁有跟那個公鑰配對的這個私鑰,所以也就只有我,才可以解密這個信息。
非對稱加密的類比和應用
我們再來打個比方。我家門口有個信箱,那么凡是知道我家地址的人就可以給我發(fā)信了,所以我家的地址就相當于公鑰,但是由于只有我自己有信箱的鑰匙,所以也只有我能看到信。那這個信箱的鑰匙當然就相當于私鑰了。
打另一個比方。我和朋友要秘密的通信。首先朋友寄給我一把她的打開的鎖,這樣我把信放到一個盒子里,鎖上,給她寄過去。拿到盒子之后,朋友拿出自己的鑰匙就可以打開箱子了。反過來,如果我想從她那里得到回信,那我就給她寄我的鎖就行了。這種通信方式的好處是,任何一把鎖的鑰匙都沒有郵寄過。
最后說實際的一個應用。我在北京,如果我有一臺服務器在美國,那么我如何讓信息從我的服務器上安全的傳遞到我這里呢?首先,我先生成一對 key,然后我就把公鑰傳到我的服務器上。這樣,我的服務器就可以把信息加密,然后傳遞給我了,聽起來可能比較麻煩,但是實際中有 ssh 這樣的程序幫忙,其實加密和解密過程都是自動完成的。 下面是生產秘鑰的具體操作過程:
$> ssh-keygen
Generating public/private rsa key pair.
$> ls .ssh/
id_rsa id_rsa.pub
好,加密通信就說這么多,以后有機會我們會談一個相關的話題:數字簽名。