緣由
通常在使用 E-Mail 的時候,有兩件事我們會有安全上的考量:
- 讓收件的人確定是我本人寄出的郵件。
- 別人寄給我的信可以用「我的方式」加密,而且只有我能解密。
底下我將會使用 Thunderbird 這套 mail client 來當例子,來介紹如何 簽署/加密 信件。
首先對於我要介紹的加密系統作點簡單的解釋。我們要採用的加解密模式是使用 key-pair policy,也就是我會有兩把 keys,其一為 public key,另一把為 private key。public key 是要公告給大家知道的,而 private key 必須將它保護起來。你的加密程式會把你要加密的東西和指定的 key 做一些運算後,產生新的輸出,這個輸出可能是加密或簽署過的文件。
當我們要簽署文件時,我們是使用 private key 來做簽署,這樣擁有你 public key 的人就可以使用它來驗證這份簽署的有效性,因為只有你自己擁有這把 private key,如此才能保證簽署的人就是你自己。而如果別人寄給你的信想加密的話,他可以用你的 public key 加密後再寄出,然後你就能用自己的 private key 解開這份加密後的文件。要注意的是,這些情況要成立,public key 跟 private key 比需是相互對應的。
所以,我們現在需要一個加密程式,然後再產生自己專屬的 key-pait 。
GnuPG
我們將會用 OpenPGP 這個加密系統來做加密,我選擇使用 Gnu 的實作版本--GnuPG來當我的加密程式。你可以下載別人作好的 binary 程式回來使用,不過我這裡會介紹抓原始檔回來編譯的方法(如果你不熟悉終端機的操作,就下載 binary 回來用吧)。
到 http://www.gnupg.org/download/index.html 下載最新的 source 回來,然後做下列指令:
# tar zxvf gnupg-<version>.tar.gz
# cd gnupg-<version>
# ./configure
# make
# sudo make install clean
這樣應該就可以順利把 gnupg 裝好了。
產生 Key-pair
在終端機下執行 gpg --gen-key ,然後它會問你以下問題:
請選擇妳要使用的金鑰種類:
(1) DSA 和 Elgamal (預設)
(2) DSA (僅能簽署用)
(5) RSA (僅能簽署用)
妳要選哪一個? 1
因為我們要產生 key-pair,所以我們選擇 1。
DSA 金鑰對會有 1024 位元長.
ELG-E 金鑰的長度可能介於 1024 位元和 4096 位元之間.
妳想要用多大的金鑰尺寸? (2048) 4096
這裡我們就產生所支援的最長位元,位元愈大雖然資料量變大,但是也更加安全。
請指定這把金鑰的有效期限是多久.
0 = 金鑰不會過期
= 金鑰在 n 天後會過期
w = 金鑰在 n 週後會過期
m = 金鑰在 n 月後會過期
y = 金鑰在 n 年後會過期
金鑰的有效期限是多久? (0)
這裡是詢問你 key-pair 的使用期限,如果你要一直使用同一套 key-pair 的話就選 0。
確定了之後,它會要你輸入真實姓名及 E-Mail 帳號:
妳需要一個使用者 ID 來辨識妳的金鑰; 這個軟體會用真實姓名,
註釋和電子郵件地址組合成使用者 ID 如下: "Ke-Huan Lin (Jedi) "
真實姓名: abcde
電子郵件地址: abcde@fg.hi
註釋:
妳選擇了這個使用者 ID:
"abcde "
變更姓名(N), 註釋(C), 電子郵件地址(E)或確定(O)/退出(Q)? o
然後按下 o ,它會要求你輸入一個密碼保護你的 private key:
妳需要一個密語來保護妳的私鑰.
請輸入密語:
接著它就會開始製作金鑰。(4096 bits 可能會有點久)完成時會顯示:
gpg: 金鑰 9FB16F65 已被標記成徹底信任了
公鑰和私鑰已經被建立及簽署了.
gpg: 正在檢查信任資料庫
gpg: 3 個勉強信任以及 1 個完全信任是 PGP 信任模型的最小需求
gpg: 深度: 0 有效: 1 已簽署: 0 信任: 0-, 0q, 0n, 0m, 0f, 1u
pub 1024D/9FB16F65 2005-03-17
金鑰指紋 = 5B0A 562A DB9A C9F6 58E7 954C 0919 B9D5 9FB1 6F65
uid abcde
sub 4096g/23D35AD9 2005-03-17
使用 Thunderbird 來作簽署或加密
首先,我們必須為 Thunderbird 安裝 Enigmail 這個 extension,這樣它才能支援 OpenPGP 的加密系統。
裝好之後我們就要設定一下 Enigmail, 到選單列的 Enigmail -> Preferences 來設定,這裡我們只需要將
GnuPG executable path 設定成 /usr/local/bin/gpg 就可以了。
當我們開始寫信時,會有個 OpenPGP 的選項,如果你是第一次使用,它會要求你選擇 key-pair,如果上述的步驟你都沒有問題的話,你就可以找到你剛產生的 key-pair 而選擇它。我們可以選擇我們要 Sign(簽署)或是 Encrypt(加密)這封信件,如果我們要簽署信件時,選擇 Sign message 就可以了,然後當你信件打完之後,它會要求你輸入 private key 的密碼(別忘了你是用 private key 加密),如此便會寄出簽署過的文件。(你可以把 Enigmail 的 Auto decrypt and verify 的選項關掉,看看寄出什麼樣的東西)
至於加密文件,如果你沒有別人的 public key,你用自己的 public key 加密是沒有意義的(因為這樣只有你自己能解密),如果要匯入別人的 public key,通常大家會以一個純文字檔的方式釋出,當你拿到這個檔案時,就可以到終端機下輸入
# gpg --import < 檔案名
這樣就可以匯入別人的 public key,你也就可以使用它來加密。如果你要輸出你的 public key ,就使用下列指令:
# gpg -a --export > 檔案名
然後你就可以散佈這個檔案,讓別人能用你的 public key 來加密信件寄給你。注意:只有簽署的信件是沒有加密的,所以只會在本文下方加上數位簽章(只能由你的 public key 來驗證);而加密的文件則是一堆亂碼,必須要用 private key 才能解開。
對應 Sign(簽署)的動作叫作 Verify(驗證),而對應 Encrypt(加密)的動作叫作 Decrypt(解密)。
基本的簽署/加密方式就介紹到這裡,剩下的就讓大家自己去試囉。