GPG (GnuPG) 是一種加密工具,用於資料加密和數字簽名。
金鑰配置
# 生成金鑰
gpg --full-generate-key
# 列出金鑰
gpg --list-keys # 列出公鑰
gpg --list-secret-keys # 列出私鑰
# 匯出金鑰
gpg --armor --export [email/ID] > public.asc # 匯出公鑰
gpg --export-secret-keys -a [email/ID] > private.asc # 匯出私鑰
# 匯入金鑰
gpg --import [key_file] # 匯入金鑰
gpg --sign-key [email/ID] # 為匯入的金鑰簽名(信任)
# 刪除金鑰
gpg --delete-key [email/ID] # 刪除公鑰
gpg --delete-secret-key [email/ID] # 刪除私鑰
# 編輯金鑰
gpg --edit-key [email/ID]
# 更改金鑰密碼
gpg --passwd [email/ID]
金鑰 ID 是金鑰指紋的後 8 位或者後 16 位,或者完整的金鑰指紋。三者之一都可以用來表示金鑰 ID。
加密/簽名
# 加密
gpg --recipient [email/ID] --encrypt [input_file] # 將生成一個 .gpg 檔案,包含了加密的檔案
# 解密
gpg --decrypt [gpg_file] > [output_file]
# 簽名
gpg --sign [input_file] # 將生成一個 .gpg 檔案,包含了明文檔案和檔案簽名
## 使用分離簽名
gpg --detach-sign [input_file] # 將生成一個 .sig 二進位制檔案
gpg --armor --detach-sign [input_file] # 將生成一個 .asc 文字檔案
# 驗證簽名
gpg --verify [signature_file] [input_file] # 可以省略 input_file,此時會以 signature_file 的檔名推測輸入檔名
# 另外,也可以使用 --decrypt 在解密的同時驗證簽名
# 簽名並加密
gpg --sign --recipient [email/ID] --encrypt [input_file]
# 解密並驗證簽名(和僅解密的命令一樣)
gpg --decrypt [gpg_file] > [outputfile]
使用樣例
列出所有公鑰
$ gpg --list-keys
[keyboxd]
---------
pub ed25519 2023-12-28 [SC]
564B356F76DEDA922C87D9A6ADA20CA03D7C43B
uid [ 絕對 ] User Name (Default GPG Key) <example@email.com>
sub cv25519 2023-12-28 [E]
pub
: 這行表示一個公鑰 (pubkey) 的記錄開始。ed25519
: 這是公鑰使用的加密演算法,ed25519 是一個採用 Edwards-curve Digital Signature Algorithm (EdDSA) 的簽名演算法,它著名的特點是速度快且安全。這種演算法特別適用於建立數字簽名。2023-12-28
: 這個日期是公鑰的生成日期。[SC]
: 這裡的 S 表示簽名(Sign),C 表示證書(Certify)。這意味著這個公鑰可以用於數字簽名和證書其他金鑰。564B356F76DEDA922C87D9A6ADA20CA03D7C43B
: 這是公鑰的指紋,是識別公鑰的一種更精確的方式。它是公鑰的一個雜湊值,可用於在金鑰伺服器上查詢公鑰或驗證公鑰。uid
: 這個欄位代表使用者身份(User ID),包括名稱和電子郵件地址。在這個例子中,表示公鑰的擁有者是 “User Name” 且電子郵件地址為 “example@email.com”。[ 絕對 ]
: 這表明信任級別為 “絕對”。在 GPG 中,你可以給一個金鑰指定信任級別,以標識你對此金鑰所有人身份驗證的信任程度。“絕對” 表示你完全信任此金鑰。sub
: 這表示一個附屬金鑰 (subkey),它關聯到上面的主公鑰。附屬金鑰可以用於加密,而主金鑰仍然保持簽名和證書的任務。cv25519
: 這是附屬金鑰使用的加密演算法,Curve25519 是一種用於建立公鑰加密金鑰的演算法。cv25519 通常用於加密。[E]
: 這表示這個附屬金鑰用於加密 (Encrypt)。
總的來說,這個輸出表示你有一個用 ed25519 演算法生成的 GPG 主公鑰,它在 2023 年 12 月 28 日生成,並有一個使用者身份名為 “User Name” 和對應的電子郵件地址。你還有一個用 cv25519 演算法生成的附屬金鑰用於加密,它也是在同一天生成的。
列出所有私鑰
$ gpg --list-secret-keys
[keyboxd]
---------
sec ed25519 2023-12-28 [SC]
564B356F76DEDA922C87D9A6ADA20CA03D7C43B
uid [ 絕對 ] User Name (Default GPG Key) <example@email.com>
ssb cv25519 2023-12-28 [E]
keyboxd
部分是內部的,通常你不需要關心;它跟 GPG 的金鑰儲存有關。sec
表示這是一段私鑰(secret key)的資訊。ed25519 是私鑰使用的加密演算法,這裡採用的是 Ed25519,一種基於 EdDSA 簽名演算法的公鑰加密演算法。Ed25519 被認為是非常安全的,主要用於簽名操作。2023-12-28
表示私鑰的生成日期是 2023年12月28日。[SC]
表示這把私鑰具有簽名(S)和證書(C)的能力。簽名用於保護資訊和驗證作者的身份,而證書能力意味著這把鑰匙可以用來為其他的公鑰簽名,建立信任網路。56EBD36FC71AEDC622DE749A43DA00CC0D17643C
是私鑰的指紋。這是一個獨特的標識,用於確切地指代這把私鑰。在 GPG 的使用中,指紋用來驗證金鑰的真實性。uid
表示使用者 ID,這是金鑰所有者的身份說明。[ 絕對 ] 表示對該金鑰的信任等級是絕對的,即這把金鑰完全被信任。User Name (Default GPG Key) example@email.com 包含名字、評論(這裡用作標識預設的 GPG 金鑰)、以及電子郵件地址,這是用來標識金鑰所有者的資訊。ssb
是指私鑰下的子金鑰(secret subkey)。cv25519 指明瞭子金鑰使用的加密演算法是 Curve25519,這通常用於加密操作。2023-12-28 是子金鑰的生成日期。[E]
表示子金鑰的用途是加密(E)。
加密檔案
gpg --recipient example@email.com --encrypt my_file
解密檔案
gpg --decrypt my_file.gpg > my_file