#密碼學

LIVE

人們總是有各種加密通訊跟檔案的理由。我在這系列文章裡大概解釋一下現代加密技術基本原理,然後會交代在 Mac跟 Windows 上,哪些軟體可以達到加密 email 通訊的要求。

(至於 Linux 的朋友就抱歉了,但是大部分的 distro 都有支援 GnuPG 服務,我想精熟的用戶要搞懂,它甚至找到合適的 UI 應該不是問題)

另外,我後面的文章只會介紹「在電腦上做 email 通訊加密」,智慧型手機上面也有一些 App 有加解密 email 的功能,但我沒有用過無法推薦。如果讀者是想要在即時通訊聊天(e.g. Facebook/Google Talk 等等)加密通訊的話,可以參考這篇介紹 OTR 通訊軟體的文章,或是這篇介紹手機加密通訊 App Safeslinger 的文章

一、現代加密技術基本原理

我知道大家都討厭上技術課,但是相信我,知道一點基本原理對於正確、安全地使用加密軟體非常必要,所以請大家姑且耐點性子看過這段。

然後要先交代:這篇文章除了註一以外,其他註解不需要認真看,除非你真的對技術面很有好奇心。

前情提要

如果兩個人(下稱 A 跟 B)要秘密通訊,其中發送訊息的人(A)會把訊息(下稱「明文」),經過一些複雜的手續(加密),變成一堆外人看不懂的東西(密文),然後再傳送給對方(B)。B 收到密文後,會透過另一套複雜的手續(解密),把密文再轉換成明文,解讀 A 的訊息。

問題就在於,A 跟 B 玩的加密、解密手續,過程中會需要一些關鍵訊息(密碼學的人會叫它「金鑰」,另見註一)。傳統的加解密方法(例如凱撒法表格法)基本上都會有個問題:A 和 B 手上都要有同一個金鑰、要知道同樣的數學方法,才能正確加、解密。所以問題會變成:如何安全地把金鑰送到對方手上?想想看,在戰爭的過程中,我方的金鑰被敵方截走,所有的秘密通訊就會被看光光。這在密碼學發明千年以來一直都是一場惡夢,直到有人在二十世紀七零年代發展了所謂「非對稱加密法」(註二),這個問題才終於獲得(暫時的)解決(註三)。

註一:然後,金鑰 (key) 跟「密碼」(password/passphrase) 是不一樣的。密碼基本上可以想成像是「芝麻開門」一類的咒語,輸入驗證你的身分後,就可以使用某些服務和工具,像是登入你的 email 帳號之類的;金鑰基本上就只是加密、解密需要用到的關鍵資訊而已。在比較簡單的加密方法裡,密碼可以就是金鑰,但是在複雜的系統中,密碼只是一種驗證手續,讓你可以使用金鑰,做後續你想做的事情。

註二:好啦,其實在更早之前就有發明出類似的東西,但是真的普及推廣是七零年代的事情,有興趣自己去翻 wikipedia。

註三:所有的加密方式都會同樣的問題:我拿不到金鑰,大不了我就暴力去電腦把密文破解明文啊。凱撒法非常好破解,運氣最差就把所有字母試過一輪就好了;表格法其實也有一些統計的方法可以破解,需要費一點功夫。最登峰造極的成就大概就是英國計算科學家Alan Turing在二戰時為了對付德國的密碼機Enigma發展出來的方法。

電腦普及後,大概就是依照加密方法原理硬是暴力算出來(不過其實也可能因為演算法的「缺陷」有些竅門)。所以現在大概常見的狀況是,你電腦很快,那我就還是同樣的加密演算法,但是把金鑰的長度提高,提高一點就讓破解的時間拉長很多,看你有多少力氣跟時間去算(而且值不值得花這個成本去破解可能沒什麼重要性的密文)。

非對稱加解密基本原理

以下介紹的就是各種非對稱加密的最基本原理(至於真槍實彈的數學呢,去找密碼學家不要找我我也不懂)。

首先,這些新方法一次會產生一對金鑰:一個叫做公鑰、另一個叫做私鑰。公鑰顧名思義,就是要公開周知讓大家知道也無所謂,私鑰則是千千萬萬要收好不能弄丟也不能讓你個人以外的其他人知道的。

(因此大家平常還是注意自己的電腦安全喔!該裝的掃毒軟體跟防火牆要裝還要更新、定期掃描,不該裝的怪怪軟體要清理乾淨,平常不要上一些奇奇怪怪的網站,可能有讀,然後可以使用安全的瀏覽器──基本上其他的瀏覽器都比 IE 安全很多啦。)

那加密跟解密的操作概念如下:

image

當 A 想要寄訊息給 B 的時候,A 可以去一個布告欄上去找 B 公布在上面的公鑰(或者是 B 也可以把他自己的公鑰事先送給 A),然後 A 會透過這個公鑰和數學方法,把訊息變成密文。等到 B 收到密文的時候,就可以用 B 自己私藏的私鑰,把密文解密回明文。

大家可以很明顯地看到,任何人基本上都可以拿到 B 的公鑰,也可以寄送密文給 B,但是因為只有 B 有自己的私鑰,所以只有他本人可以把密文轉換成看得懂的東西,因此解決了我上面說的「要怎麼把金鑰送到對的人手上不會被偷走」的問題。

另外的重要用途:簽章

那除了加密跟解密以外,其實非對稱加密系統有另一個也很重要的功能:簽章。

簽章是什麼意思呢?任何通訊基本上會遇到另一個問題:「我怎麼知道這封訊息是你本人寫的,還是別人假造你名義寫的?」

這個難題,也可以用非對稱加密法解決,過程概念如下:

image

當 A 要發訊息給 B 的時候,為了要證明「這封信是 A 寫的」,所以,首先 A 會把他的訊息餵給一個電腦工具(叫做「雜湊函數」),生產出一串奇怪的字串,也就是所謂的「摘要」。雜湊函數的特性是,只要輸入的訊息有一點點不一樣(例如說被動過手腳),跑出來的字串就會差很多。

接下來,A 會把摘要,透過 A 自己的私鑰,加密成「簽章」這個東西。然後,他就會把他訊息的「密文」跟「簽章」,一道寄給 B。

B 收到密文跟簽章之後,一方面用 B 自己的私鑰解出訊息的明文,另一方面,B 會用 A 的公鑰把簽章還原成一串奇怪的字串(暫且稱為「摘要 X」好了)。這時候,B 還會把解出來的明文,再餵進雜湊函數裡。如果這次跑出來的「摘要 Y」,跟上面還原出來的「摘要 X」比對後內容一模一樣的話,B 就可以相信:

「這篇訊息的明文是 A 發給我的沒錯,而且內容沒有被更改過」。

小結,還有加解密軟體的任務

上面介紹了加、解密跟簽章這兩種用途,基本上通常是一起使用的:

  • 當 A 寄信給 B 時,A 會「拿 B 的公鑰對明文做加密變成密文」+「拿 A 自己的私鑰對明文簽章」
  • 當 B 收到 A 的信時,B 會「拿 B 自己的私鑰對密文解密變成明文」+「拿 A 的公鑰,對簽章做還原變成摘要,並且把上頭解出的明文餵進雜湊函數結果跟摘要比對」

image

好了,原理說完了。所以基本上大家下載加解密軟體,要做的事情就是:

  1. 生產出屬於自己的公鑰跟私鑰
  2. 把公鑰貼在公布欄上,私鑰留在自己電腦裡
  3. 去公布欄把好麻吉(和會通訊的對象)的公鑰抓下來
  4. 把訊息、檔案傳給別人時,用別人的公鑰加密內容,用自己的私鑰簽章
  5. 接收到別人的訊息、檔案時,用自己的私鑰把內容解密,用別人的公鑰還原簽章並且核對

好消息是,除了 1, 2, 3 以外,4, 5 程式大都可以幫你自動做好。接下來兩篇文章分別會介紹 gpgtools (Mac) 和 Windows 上幾個程式的使用方法。我基本上會盡量選擇開源軟體(換句話說:免費,而且程式碼是公開的,通常這也代表這些程式有點信用,不會被偷偷埋漏洞),操作要上手也不太困難──很不幸的是這些軟體操作介面大多都是英文的!我會附上中文的說明跟有中文註解的截圖,讓大家熟悉怎麼操作。

然後還是要提醒:如果你的電腦不乾淨,不管你使用再好的加密程式也是白搭。千萬不要在自己不信任的電腦上登入 email 或留下任何的個人資訊。至於如何安全地保護自己的電腦,可以參考Security in a Box(簡體中文)這篇文章(雖然說我覺得它有些建議有點太嚴格,在台灣不太需要啦),然後也要學會如何使用 email 或社群網站的兩階段驗證服務(據我所知 Google,facebook蘋果都有)。

loading