GPG 用法

Undefined443發表於2024-03-21

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

相關文章