一、什麼是GPG
要了解什麼是GPG,就要先了解PGP。
1991年,程序員Phil Zimmermann爲了避開政府監視,開發了加密軟件PGP。這個軟件非常好用,迅速流傳開來,成了許多程序員的必備工具。但是,它是商業軟件,不能自由使用。所以,自由軟件基金會決定,開發一個PGP的替代品,取名爲GnuPG。這就是GPG的由來。
GPG有許多用途,本文主要介紹文件加密。至於郵件的加密,不同的郵件客戶端有不同的設置,請參考Ubuntu網站的介紹。
本文的使用環境爲Linux命令行。如果掌握了命令行,Windows 或 Mac OS 客戶端,就非常容易掌握。GPG並不難學,學會了它,從此就能輕鬆傳遞加密信息。建議讀者一步步跟着教程做,對每條命令都自行測試。
二、安裝
GPG有兩種安裝方式。可以下載源碼,自己編譯安裝。
./configure
make
make install
也可以安裝編譯好的二進制包。
# Debian / Ubuntu 環境
sudo apt-get install gnupg# Fedora 環境
yum install gnupg
安裝完成後,鍵入下面的命令:
gpg --help
如果屏幕顯示GPG的幫助,就表示安裝成功。
三、生成密鑰
安裝成功後,使用gen-ken參數生成自己的密鑰。
gpg --gen-key
回車以後,會跳出一大段文字:
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.請選擇您要使用的密鑰種類:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (僅用於簽名)
(4) RSA (僅用於簽名)
您的選擇?
第一段是版權聲明,然後讓用戶自己選擇加密算法。默認選擇第一個選項,表示加密和簽名都使用RSA算法。
然後,系統就會問你密鑰的長度。
RSA 密鑰長度應在 1024 位與 4096 位之間。
您想要用多大的密鑰尺寸?(2048)
密鑰越長越安全,默認是2048位。
接着,設定密鑰的有效期。
請設定這把密鑰的有效期限。
0 = 密鑰永不過期
<n> = 密鑰在 n 天后過期
<n>w = 密鑰在 n 周後過期
<n>m = 密鑰在 n 月後過期
<n>y = 密鑰在 n 年後過期
密鑰的有效期限是?(0)
如果密鑰只是個人使用,並且你很確定可以有效保管私鑰,建議選擇第一個選項,即永不過期。回答完上面三個問題以後,系統讓你確認。
以上正確嗎?(y/n)
輸入y,系統就要求你提供個人信息。
您需要一個用戶標識來辨識您的密鑰;本軟件會用真實姓名、註釋和電子郵件地址組合成用戶標識,如下所示:
"Heinrich Heine (Der Dichter) <[email protected]>"真實姓名:
電子郵件地址:
註釋:
"真實姓名"填入你姓名的英文寫法,"電子郵件地址"填入你的郵件地址,"註釋"這一欄可以空着。
然後,你的"用戶ID"生成了。
您選定了這個用戶標識:
"Ruan YiFeng <[email protected]>"
我的"真實姓名"是Ruan YiFeng,"電子郵件地址"是[email protected],所以我的"用戶ID"就是"Ruan YiFeng <[email protected]>"。系統會讓你最後確認一次。
更改姓名(N)、註釋(C)、電子郵件地址(E)或確定(O)/退出(Q)?
輸入O表示"確定"。
接着,系統會讓你設定一個私鑰的密碼。這是爲了防止誤操作,或者系統被侵入時有人擅自動用私鑰。
您需要一個密碼來保護您的私鑰:
然後,系統就開始生成密鑰了,這時會要求你做一些隨機的舉動,以生成一個隨機數。
我們需要生成大量的隨機字節。這個時候您可以多做些瑣事(像是敲打鍵盤、移動鼠標、讀寫硬盤之類的),這會讓隨機數字發生器有更好的機會獲得足夠的熵數。
幾分鐘以後,系統提示密鑰已經生成了。
gpg: 密鑰 EDDD6D76 被標記爲絕對信任
公鑰和私鑰已經生成並經簽名。
請注意上面的字符串"EDDD6D76",這是"用戶ID"的Hash字符串,可以用來替代"用戶ID"。
這時,最好再生成一張"撤銷證書",以備以後密鑰作廢時,可以請求外部的公鑰服務器撤銷你的公鑰。
gpg --gen-revoke [用戶ID]
上面的"用戶ID"部分,可以填入你的郵件地址或者Hash字符串(以下同)。
四、密鑰管理
4.1 列出密鑰
list-keys參數列出系統中已有的密鑰.
gpg --list-keys
顯示結果如下:
/home/ruanyf/.gnupg/pubring.gpg
-------------------------------
pub 4096R/EDDD6D76 2013-07-11
uid Ruan YiFeng <[email protected]>
sub 4096R/3FA69BE4 2013-07-11
第一行顯示公鑰文件名(pubring.gpg),第二行顯示公鑰特徵(4096位,Hash字符串和生成時間),第三行顯示"用戶ID",第四行顯示私鑰特徵。
如果你要從密鑰列表中刪除某個密鑰,可以使用delete-key參數。
gpg --delete-key [用戶ID]
4.2 輸出密鑰
公鑰文件(.gnupg/pubring.gpg)以二進制形式儲存,armor參數可以將其轉換爲ASCII碼顯示。
gpg --armor --output public-key.txt --export [用戶ID]
"用戶ID"指定哪個用戶的公鑰,output參數指定輸出文件名(public-key.txt)。
類似地,export-secret-keys參數可以轉換私鑰。
gpg --armor --output private-key.txt --export-secret-keys
4.3 上傳公鑰
公鑰服務器是網絡上專門儲存用戶公鑰的服務器。send-keys參數可以將公鑰上傳到服務器。
gpg --send-keys [用戶ID] --keyserver hkp://subkeys.pgp.net
使用上面的命令,你的公鑰就被傳到了服務器subkeys.pgp.net,然後通過交換機制,所有的公鑰服務器最終都會包含你的公鑰。
由於公鑰服務器沒有檢查機制,任何人都可以用你的名義上傳公鑰,所以沒有辦法保證服務器上的公鑰的可靠性。通常,你可以在網站上公佈一個公鑰指紋,讓其他人覈對下載到的公鑰是否爲真。fingerprint參數生成公鑰指紋。
gpg --fingerprint [用戶ID]
4.4 輸入密鑰
除了生成自己的密鑰,還需要將他人的公鑰或者你的其他密鑰輸入系統。這時可以使用import參數。
gpg --import [密鑰文件]
爲了獲得他人的公鑰,可以讓對方直接發給你,或者到公鑰服務器上尋找。
gpg --keyserver hkp://subkeys.pgp.net --search-keys [用戶ID]
正如前面提到的,我們無法保證服務器上的公鑰是否可靠,下載後還需要用其他機制驗證.
五、加密和解密
5.1 加密
假定有一個文本文件demo.txt,怎樣對它加密呢?
encrypt參數用於加密。
gpg --recipient [用戶ID] --output demo.en.txt --encrypt demo.txt
recipient參數指定接收者的公鑰,output參數指定加密後的文件名,encrypt參數指定源文件。運行上面的命令後,demo.en.txt就是已加密的文件,可以把它發給對方。
5.2 解密
對方收到加密文件以後,就用自己的私鑰解密。
gpg --decrypt demo.en.txt --output demo.de.txt
decrypt參數指定需要解密的文件,output參數指定解密後生成的文件。運行上面的命令,demo.de.txt就是解密後的文件。
GPG允許省略decrypt參數。
gpg demo.en.txt
運行上面的命令以後,解密後的文件內容直接顯示在標準輸出。
六、簽名
6.1 對文件簽名
有時,我們不需要加密文件,只需要對文件簽名,表示這個文件確實是我本人發出的。sign參數用來簽名。
gpg --sign demo.txt
運行上面的命令後,當前目錄下生成demo.txt.gpg文件,這就是簽名後的文件。這個文件默認採用二進制儲存,如果想生成ASCII碼的簽名文件,可以使用clearsign參數。
gpg --clearsign demo.txt
運行上面的命令後 ,當前目錄下生成demo.txt.asc文件,後綴名asc表示該文件是ASCII碼形式的。
如果想生成單獨的簽名文件,與文件內容分開存放,可以使用detach-sign參數。
gpg --detach-sign demo.txt
運行上面的命令後,當前目錄下生成一個單獨的簽名文件demo.txt.sig。該文件是二進制形式的,如果想採用ASCII碼形式,要加上armor參數。
gpg --armor --detach-sign demo.txt
6.2 簽名+加密
上一節的參數,都是隻簽名不加密。如果想同時簽名和加密,可以使用下面的命令。
gpg --local-user [發信者ID] --recipient [接收者ID] --armor --sign --encrypt demo.txt
local-user參數指定用發信者的私鑰簽名,recipient參數指定用接收者的公鑰加密,armor參數表示採用ASCII碼形式顯示,sign參數表示需要簽名,encrypt參數表示指定源文件。
6.3 驗證簽名
我們收到別人簽名後的文件,需要用對方的公鑰驗證簽名是否爲真。verify參數用來驗證。
gpg --verify demo.txt.asc demo.txt
舉例來說,openvpn網站就提供每一個下載包的gpg簽名文件。你可以根據它的說明,驗證這些下載包是否爲真。
七、參考文檔
1. Paul Heinlein, GPG Quick Start
2. Ubuntu help,GnuPrivacyGuardHowto
3. KNL, GnuPG Tutorial
4. Alan Eliasen. GPG Tutorial
(完)