GPG入門教程

一、什麼是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

5. GnuPG 袖珍 HOWTO (中文版)

6. The GNU Privacy Handbook

(完)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章