#gpgtools

LIVE

這篇文章是加密通訊教學系列文第二篇。第一篇是基本原理介紹(務必要讀!),這一篇是教大家如何在 Mac 上使用加密軟體 gpgtools。第三篇文章會介紹 Windows 上的加密軟體的使用方式。然後如果是習慣使用瀏覽器登入 gmail 的朋友,我會建議再搭配 WebPG 這個瀏覽器外掛(支援 Chrome/Firefox)一起使用。

二、gpgtools 中文使用介紹

功能介紹

gpgtools 是一款 Mac 上的自由加密軟體,功能很強大,包括:

  • 金鑰與憑證管理(GPG Keychain Access)
  • 文字或檔案加解密、簽章(GPG Service)
  • 電子郵件(使用 Mac 內建的 Mail.app)加解密、簽章(GPGMail)

不過,這套軟體什麼都好,就是一點不好:它是英文介面的,所以以下介紹如何安裝跟使用這套軟體,我會使用截圖並且加上中文註解。

安裝

  1. 先到網站上下載 .dmg 映像檔。請注意,gpgtools 目前支援 OSX 10.6-10.8,請注意你的系統版本。
  2. 點擊一下映像檔檔案,打開後會長這樣:

    image
    點擊 Install 那個檔案,之後一路按 Continue 和 Install 按鍵即可。過程中會跳出密碼視窗,要求你輸入密碼才能安裝軟體,請放心輸入。
  3. 安裝完之後,會多出幾個東西:"GPG keychain access"(在 Application 資料夾裡)、GPGPreferences(在系統設定裡)、GPG service(在 Finder 裡面按右鍵,選擇 “Services",底下出現 OpenPGP 開頭的都是)
    image

建立自己的金鑰

上一篇系列文已經交代什麼是金鑰,這一段要介紹怎麼建立屬於自己的金鑰。

請特別注意:建立金鑰之後,請好好維持電腦作業系統的安全,萬一電腦中毒、被入侵,讓外人取得你的金鑰,那基本上你的所有使用這對金鑰進行加密通訊都會被破解。

特別聲明:這一段的截圖,步驟 3. 開始都是直接取自 gpgtools 官網的入門介紹的附圖,我直接加上中文註解。

  1. 打開你的 Application 資料夾,找到 "GPG Keychain Access” 這個程式,打開它:

    image
  2. 點兩下打開來,會長得像這張圖,按一下左上角的 “New” 以新增金鑰:

    image
  3. 會跳出一個對話視窗,要求你輸入你的全名(我不確定能不能輸入中文,保險起見我會建議使用英文拼音姓名)跟電子郵件信箱(選一個你會拿來做秘密通訊的信箱;如果你有好幾個信箱都會拿來做秘密通訊的話也有辦法解決,但是先選一個再說),輸入完之後按 “Generate Key":

    image
  4. 輸入完之後會要你自訂一個「密碼」(Passphrase)。這個密碼只是個認證身分的手續,你以後如果要使用這組金鑰,就必須輸入它,來確認是你本人。請務必牢記密碼,不然你就無法使用這組金鑰(對於詳細的技術原因好奇的人請看註一):

    image
  5. 完成啦,恭喜你:

    image

註一:因為 GPG keychain access 是把「你的密碼餵進雜湊函數吐出來的字串」當做另一個金鑰,把你的金鑰再加密。

最後,有一件很重要的事情:

因為安全起見,金鑰基本上都有使用期限。一般設定是四年就會過期(但也可以在做金鑰的時候就調整久一點),如果快要過期的話,就要換一個新金鑰(其實也可以展期,但是我不建議這樣做),請大家要注意。

交換公鑰

接下來就是要交換公鑰了(私鑰要自己留著不能給別人!!),如果要寄出加密訊息,你必須要有所有收信方的公鑰才能加密。通常有兩種方法可以做:

  • 直接匯出公鑰,然後附加在 email 裡面,給你要通訊的對象。反正公鑰這種東西不怕給人拿走,所以放在公開的 email 傳送無所謂。
  • 把公鑰貼到公布欄(精確地說,是上傳到公鑰交換伺服器),讓大家搜尋你的公鑰,讓程式自己下載下來

這兩個步驟也是在 GPG Keychain Access 裡面做,首先,請你先把 GPG Keychain Access 打開。

以下介紹如何匯出公鑰,其實只有兩三步:

  1. 選擇你要匯出的金鑰,按 "Export” 就好:

    image
  2. 會出現存檔畫面如下。基本上軟體會幫你決定一個檔名,但是可以改掉。底下會有一個可以打勾的選項,千千萬萬不要打勾!!!再重複一次,千千萬萬不要打勾!!!!之後按 Save 就可以匯出了:

    image
  3. 之後會多出一個叫做「檔名.asc」的檔案,請把這個檔案 email 出去。

另一種我個人覺得比較方便的作法,是把公鑰貼到公布欄(公鑰交換伺服器),然後也可以在上面搜尋你朋友貼上去的公鑰。

  1. 打開 GPG Keychain Access,選擇你自己的公鑰,在上面按右鍵,點選 “Send public key to Keyserver",你的公鑰就會被貼到公布欄了:

    image
  2. 接下來是把別人的公鑰抓下來,這其實也很簡單,如圖示:

    image
  3. 在跳出的對話框裡,輸入你通信對象的 email 地址或姓名(請先確定他們都已經把公鑰貼上公布欄了):

    image
  4. 我直接拿官方的 email 示範,搜尋結果會長這樣:

    image

    按 "Retreive key” 把公鑰抓下來。(你會看到兩筆結果,是因為有兩個公鑰都有用這個信箱。然後呢,第二筆公鑰,內含多個信箱一起掛在這個公鑰裡,是給需要用多個信箱進行加密通訊的使用者用的)
  5. 然後要注意喔:如果你之後更動了金鑰(例如說把第二個電子信箱加進去),就需要更新一次金鑰。(就是重複貼一次,然後叫大家更新這樣)

傳送加密郵件

重頭戲來了:要怎麼傳送加密郵件呢?有兩種方法:

  • 如果你是用 Mail.app 的話,恭喜你,這非常好解決,因為你在一開始安裝的時候,就有安裝 GPGMail 這個外掛
  • 如果你還是偏好用網路瀏覽器上 gmail 或是 webmail 開信箱的話,手續會複雜一點點

以下先介紹如何用 Mail.app 傳送加密郵件(以下圖片還是取自 gpgtools 官網的介紹,感謝它們):

  1. 你現在進 Mail.app,寫一封新郵件,畫面會長這樣:

    image

    你會多出三個按鈕:加密按鈕(鎖頭打開是沒加密,鎖上是加密)、狀態按鈕(簽章有打開就是勾勾,沒打開就是打叉叉)跟狀態按鈕(視窗右上角綠色的那玩意,如果沒有作用會是灰色)。
  2. 先填入你的收件人(們),再按這兩個按鈕,就會長得跟上面那張圖一樣。通常這個步驟會要你輸入你的密碼來驗證你的身分。
  3. 接下來就繼續寫信、寄信,就完成啦。對方如果也有裝 GPGMail,然後是正確的收信人,對方看到的信會長這樣:

    image

接下來是有些朋友比較習慣用瀏覽器登入跟收發 email,那步驟瑣碎一些:

我強烈建議 gmail 用戶之間都使用這個作法,不然可能會因為一些程式的問題讓加解密出問題。

  1. 先安裝 WebPG:

    image


  2. (以下以 Chrome 示範。好吧,我承認有幾張圖是在 Windows 底下截的,但是差異不大)點一下右上角的外掛按鈕,會出現三個選項,請選擇 Options:

    image


  3. 進去之後一定會跳出錯誤訊息。別擔心,請按 “Advanced Options",在 "GPGCONF binary 那一欄,輸入 /usr/local/MacGPG2/bin/gpgconf",然後在 "Keyserver” 輸入 “hkp://keys.gnupg.net":


    然後再把上面所有的按鈕全部按成 Enabled。接下來,再點一下 WebPG 的按鈕,選擇 "Key Management",進去那個畫面之後會先進到 "Private Key” 這個分頁,請選擇你慣用的私鑰,把 Disabled 的按鈕按成 Enabled:

    image
  4. 設定差不多完成了,接下來的執行步驟,請直接參考本系列文第三篇(給 Windows 用戶)的最後一段,過程一模一樣。(請原諒我懶得寫兩次…)

結語

這篇簡單交代了最基本的使用方法,但是 gpgtools 的功能跟設定不只如此(例如說憑證的信任程度、金鑰展期、撤銷金鑰、加密檔案),我會建議大家還是可以去摸一下程式內容、看一下官網的 tutorial 跟討論區把這些摸清楚。

人們總是有各種加密通訊跟檔案的理由。我在這系列文章裡大概解釋一下現代加密技術基本原理,然後會交代在 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