GPG根本上用的是非對稱加密算法和電子簽名算法
public/private key 是密鑰對,public key很長,下面這張截圖只展示了它的大約1/4。

由于太長,public key一般通過文件的形式傳播,比如Electrum把軟件發(fā)布者的public key下載鏈接放在官網(wǎng)上,我下載后可以將它用GPG導入。
In order to be able to verify GPG signatures, you need to import the public key of the signer. Electrum binaries are signed with ThomasV's public key. On Linux, you can import that key using the following command:
gpg --import ThomasV.asc.
https://electrum.org/#download
fingerprint
fingerprint 是public key的 hash,fingerprint的長度大大縮短[1],只需要40個字符。
E6DDF298F8F06D3B7368A3B38D1BE4E317CEF449
fingerprint相比public key更方便傳播,可以方便的展示在個人網(wǎng)站上。它和public key一一對應,幾乎沒有碰撞的可能。我們可以根據(jù)他人的 fingerprint 從 key server 獲取對應的 public key,gpg的命令行工具支持這項功能。
- fingerprint足夠短,可以方便的貼在github、twitter、個人網(wǎng)站、PPT上。
- 但又足夠長,幾乎沒有碰撞的可能;
比如 https://github.com/laanwj 在github主頁宣告自己的 gpg fingerprint:

fingerprint 是 public key 的 hash,而驗證簽名需要 public key。public key 的 hash 是無法驗證簽名的。我們需要將public key上傳到公開的 key server,其他人可以根據(jù) fingerprint 在 key server 檢索,下載對應的public key。
$ gpg --recv-keys "ED1A 1280 DEFC A603 14CD 15BF 72B5 BACD FEDF 39D7"
gpg: key 72B5BACDFEDF39D7: public key "T Dev D (Samourai) <dev@samouraiwallet.com>" imported
從 key server 下載的 public key 是真實可信的,因為下載 public key 后我們可以對其進行驗證。只需將下載下來的public key 進行 hash 計算得到 fingerprint,將其與檢索用的 fingerprint 進行比對。如果相同,則 public key 是真實的。
key ID
fingerprint 包含 40個字符,而 key ID 則是 fingerprint 的其中后16個字符。
我的 fingerprint 和 key ID 分別是:
- E6DDF298F8F06D3B7368A3B38D1BE4E317CEF449
- 8D1BE4E317CEF449
之所以使用key ID,是為了方便展示,16 個字符對個人身份的區(qū)分度足夠了。使用GPG簽名過的git commits在github頁面展示的就是key ID:

和 fingerprint 一樣,同樣可以根據(jù) key ID 獲取公鑰:
$ gpg --recv-keys "8D1BE4E317CEF449"
gpg: key 8D1BE4E317CEF449: public key "周宇盛 <jasonzhouu@163.com>" imported
gpg: Total number processed: 1
gpg: imported: 1
signature
有時需要證明一個信息是自己發(fā)出的,比如發(fā)布軟件的最新版、發(fā)送的郵件。這時先對文件進行 hash 計算,得到 hash;然后用自己的 private key 對 hash 簽名,得到 signature。其他人收到信息時,可以用你的 public key 對電子簽名進行驗證。
驗證文件的電子簽名需要3樣東西:
- 文件本身
- 發(fā)布者用 private key 對文件的簽名
- 發(fā)布者的 public key
驗證時,需要提前導入發(fā)布者的公鑰,然后在命令行中指定第1、2個參數(shù)的路徑:
$ gpg --verify GPG_Suite-2018.5.dmg.sig GPG_Suite-2018.5.dmg
gpg: Signature made Tue Oct 23 02:20:49 2018 CST
gpg: using RSA key 8C31E5A17DD5D932B448FE1DE8A664480D9E43F5
gpg: Good signature from "GPGTools Team <team@gpgtools.org>" [unknown]
Primary key fingerprint: 85E3 8F69 046B 44C1 EC9F B07B 76D7 8F05 00D0 26C4
Subkey fingerprint: 8C31 E5A1 7DD5 D932 B448 FE1D E8A6 6448 0D9E 43F5
計算機執(zhí)行驗證任務時,進行了以下幾個步驟:先計算得到文件的 hash,使用hash、signature、public key驗證,如果驗證通過,則說明這個文件確實是這個 public key 對應的人發(fā)出的。