目录

GnuPG学习笔记

前言

GNU Privacy Guard(GnuPG或GPG)是一个密码学软件,用于加密、签名通信内容及管理非对称密码学的密钥。GnuPG是自由软件,遵循IETF订定的OpenPGP技术标准设计,并与PGP保持兼容。

GnuPG主页

安装

1
sudo apt install gpg -y

生成密钥对

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
ubuntu@ubuntu:~$ gpg --full-gen-key
gpg (GnuPG) 2.2.19; Copyright (C) 2019 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 和 RSA (默认)
   (2) DSA 和 Elgamal
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
  (14) Existing key from card
您的选择是? 4
# 这里选择4
RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(3072) 4096
请求的密钥长度是 4096# 密钥长度拉满
请设定这个密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 0
# 这里坑定选择永不过期
密钥永远不会过期
这些内容正确吗? (y/N) y
# 别问 问就是没问题
GnuPG 需要构建用户标识以辨认您的密钥。

真实姓名: test1
电子邮件地址: a@admin.com
注释: test1
您选定了此用户标识:
    “test1 (test1) <a@admin.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)? o
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。
gpg: 密钥 7C4A96E3BBC9744C 被标记为绝对信任
gpg: 吊销证书已被存储为‘/home/ubuntu/.gnupg/openpgp-revocs.d/454039FDD30010C960EB66287C4A96E3BBC9744C.rev’
公钥和私钥已经生成并被签名。

请注意这个密钥不能用于加密。您可能想要使用“--edit-key”命令来
生成一个用于此用途的子密钥。
pub   rsa4096 2021-08-29 [SC]
      454039FDD30010C960EB66287C4A96E3BBC9744C
uid                      test1 (test1) <a@admin.com>
注意

通过上面的操作,生成了一个名为test1,使用RSA加密 且永不过期的账户

454039FDD30010C960EB66287C4A96E3BBC9744C为密钥id

创建子密钥

我认为主密钥应仅用于管理子密钥,子密钥用来加密解密签名操作

首先看一下我们刚刚创建的密钥

1
2
3
4
5
6
7
8
ubuntu@ubuntu:~$ gpg -K
# k为小写时列出公钥 k为大写时列出私钥
/home/ubuntu/.gnupg/pubring.kbx
-----------------------------
sec   rsa4096 2021-08-29 [SC]
      454039FDD30010C960EB66287C4A96E3BBC9744C
uid           [ 绝对 ] test1 (test1) <a@admin.com>

注意
Option Description
uid 拥有者信息,姓名和邮箱
pub public key 公钥
sub public subkey 子公钥
sec secret key 私钥
ssb secret subkey 子私钥
S sign 表示可以用来签名
C Certify 表示可以用于认证其他密钥
E Encrypt 表示可以用来加密
A Authentication 表示可以用来认证

创建两个子密钥 一个用来加密 一个用来签名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
ubuntu@ubuntu:~$ gpg --edit-key test1
gpg (GnuPG) 2.2.19; Copyright (C) 2019 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.

私钥可用。

sec  rsa4096/7C4A96E3BBC9744C
     创建于:2021-08-29  有效至:永不       可用于:SC  
     信任度:绝对        有效性:绝对
[ 绝对 ] (1). test1 (test1) <a@admin.com>

gpg> addkey
# addkey是创建子密钥的意思
请选择您要使用的密钥类型:
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
   (5) ElGamal(仅用于加密)
   (6) RSA(仅用于加密)
  (14) Existing key from card
您的选择是? 4
# 选择4 仅用于签名
RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(3072) 4096
请求的密钥长度是 4096 位
请设定这个密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 0
密钥永远不会过期
这些内容正确吗? (y/N) y
真的要创建吗?(y/N) y
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。

sec  rsa4096/7C4A96E3BBC9744C
     创建于:2021-08-29  有效至:永不       可用于:SC  
     信任度:绝对        有效性:绝对
ssb  rsa4096/17B455B1D1CF2DC4
     创建于:2021-08-29  有效至:永不       可用于:S   
[ 绝对 ] (1). test1 (test1) <a@admin.com>

gpg> addkey
请选择您要使用的密钥类型:
   (3) DSA(仅用于签名)
   (4) RSA(仅用于签名)
   (5) ElGamal(仅用于加密)
   (6) RSA(仅用于加密)
  (14) Existing key from card
您的选择是? 6
# 选择6 仅用于加密
RSA 密钥的长度应在 1024 位与 4096 位之间。
您想要使用的密钥长度?(3072) 4096
请求的密钥长度是 4096 位
请设定这个密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 0
密钥永远不会过期
这些内容正确吗? (y/N) y
真的要创建吗?(y/N) y
我们需要生成大量的随机字节。在质数生成期间做些其他操作(敲打键盘
、移动鼠标、读写硬盘之类的)将会是一个不错的主意;这会让随机数
发生器有更好的机会获得足够的熵。

sec  rsa4096/7C4A96E3BBC9744C
     创建于:2021-08-29  有效至:永不       可用于:SC  
     信任度:绝对        有效性:绝对
ssb  rsa4096/17B455B1D1CF2DC4
     创建于:2021-08-29  有效至:永不       可用于:S   
ssb  rsa4096/77C63F3A7A718DE9
     创建于:2021-08-29  有效至:永不       可用于:E   
[ 绝对 ] (1). test1 (test1) <a@admin.com>

gpg> save
# 一定要记得保存

导出

导出公钥

1
gpg -o pub.key -a --export test1

导出私钥

1
gpg -o sec.key -a --export-secret-keys test1

导出全部子私钥

1
gpg -o ssb.key -a --export-secret-subkeys test1

导出单个子私钥

1
gpg -o ssb.key -a --export-secret-subkey 私钥id! # 感叹号是必要的

导出吊销证书

1
gpg --output revoke.asc --gen-revoke mykey
注意
参数mykey必须是密钥说明符,可以是主密钥对的密钥 ID,也可以是标识密钥对的用户 ID 的任何部分。生成的证书将保留在文件 revoke.asc 中。如果省略--output选项,结果将放在标准输出上。由于证书很短,您可能希望打印证书的硬拷贝以存放在安全的地方,例如您的保险箱。证书不应存储在其他人可以访问的地方,因为任何人都可以发布吊销证书并使相应的公钥无用。

导入

导入公钥

1
gpg --import pub.key

导入私钥

1
gpg --import sec.key
注意
gpg -K时密钥后面的#表示主密钥不在本地

删除

删除公钥

1
gpg --delete-key test1

删除私钥

1
gpg --delete-secret-key test1

删除所有

1
gpg --delete-keys test1