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