0.参考


GnuPG MiniHOWTO

1.开始探索


环境如下:

$ gpg --version         
gpg (GnuPG) 2.2.3
libgcrypt 1.8.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /home/archie/.gnupg
支持的算法:
公钥:RSA, ELG, DSA, ECDH, ECDSA, EDDSA
对称加密:IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256,
     TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
散列:SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
压缩:不压缩, ZIP, ZLIB, BZIP2

建立一个测试文件test.db

首先创建自己的密钥,这里选择RSA、4096位的密钥长度以及密码永不过期

$ gpg --full-gen-key
gpg (GnuPG) 2.2.3; Copyright (C) 2017 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 (仅用于签名)
您的选择? 1
RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)4096
您所要求的密钥尺寸是 4096 位
请设定这把密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0) 0
密钥永远不会过期
以上正确吗?(y/n)y

接下来是输入姓名、注释和邮箱,就不贴了。

然后提示输入passphrase(密码)来保护你的私钥,接下来等待一小会就好了

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
gpg: 密钥 B**************C 被标记为绝对信任
gpg: directory '/home/xxxxxx/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/xxxxxx/.gnupg/openpgp-revocs.d/3**************************************C.rev'
公钥和私钥已经生成并经签名。

pub   rsa4096 2017-12-22 [SC]
      3**************************************C
uid                      C********u (xx) <xxx@xxx.com>
sub   rsa4096 2017-12-22 [E]

生成一张撤销证书

gpg --gen-revoke B074F9CB184D7B2C
gpg --gen-revoke B**************C

sec  rsa4096/B**************C 2017-12-22 C********u (xx) <xxx@xxx.com>

要为这把密钥建立一份吊销证书吗?(y/N)y
请选择吊销的原因:
  0 = 未指定原因
  1 = 密钥已泄漏
  2 = 密钥被替换
  3 = 密钥不再使用
  Q = 取消
(也许您会想要在这里选择 1)
您的决定是什么?0
请输入描述(可选);以空白行结束:
> future use
> 
吊销原因:未指定原因
future use
这样可以吗? (y/N)y
已强行使用 ASCII 封装过的输出。
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: This is a revocation certificate

/*
这里会看到很多字母和数字
*/
-----END PGP PUBLIC KEY BLOCK-----
已建立吊销证书。

请把这个文件转移到一个可隐藏起来的介质(如软盘)上;如果坏人能够取得这
份证书的话,那么他就能让您的密钥无法继续使用。把这份凭证打印出来再藏
到安全的地方也是很好的方法,以免您的保存媒体损毁而无法读取。但是千万
小心:您的机器上的打印系统可能会在打印过程中把这些数据临时在某个其他
人也能够看得到的地方!

因为是本地的密码文件,所以就不要上传公钥啦。那么接下来就对test.db加解密吧:

gpg --recipient xxx@xxx.com --output 1.db --encrypt test.db

--recipient指定接受者,这里的接受者是自己。

解密也很简单:

$ gpg --output 2.db  --decrypt 1.db 

就得到加密后的文件了。

可以对比原始文件test.db、加密文件1.db、解密后的文件2.db前后十六进制(虽然看不出个所以然,反正它可以正常加解密,所以跳过这步好了):

$ hexdump test.db 
0000000 2069 6d61 7420 7365 2074 0a31          
000000c
$ hexdump 1.db   
0000000 0285 030c e55e a09b b5f2 a4ca 0f01 7cff
0000010 9453 175f 8c6f 9e5d 2310 bfe4 6507 566d
0000020 552e 5153 5aaf b522 cecb 018f bd84 a828
0000030 b95a 09d1 2af8 8f3a 9a16 9330 5d78 8d35
0000040 ce41 f9b6 b8b6 b718 4c33 af71 b473 d1d1
0000050 9950 3322 57fb 04e8 157f 8954 25aa 741d
0000060 251c 2c5e 1003 7315 fc0a 5fb7 59d5 0fee
0000070 bace ae78 335b c9a3 7481 0e41 bab9 bb4c
0000080 d9a7 72a4 0482 3838 0533 6bbc bca3 26fa
0000090 a099 c6fc 818e b7fd 1e87 c196 7043 0127
00000a0 dabc 0708 6c29 77c2 631d 9f92 e5bf 78db
00000b0 c1fe 6453 d7d9 b914 7635 f8a6 dd1c 1a0f
00000c0 1c63 f864 64d2 901f 5cd1 74e1 2ebb 57ef
00000d0 008a 9c66 aa78 e339 4200 0acc 32fa 3564
00000e0 cc84 8d4c 93c3 c43c 5dc2 e006 3303 bd47
00000f0 2f28 8d1f 7da7 d65a 7284 7cbc 20c3 1a39
0000100 1ae3 a5ab 263b b92b a636 a3e9 9cbc e28d
0000110 79fe 6286 b45a 8580 1b3d 7d32 4d1c b0c4
0000120 6b8b 1ebc 0ca3 6036 e85a f3b4 6245 abe0
0000130 f514 51d6 5553 49b0 1a5f 1938 6e26 56a0
0000140 44b4 3a05 c5d1 c151 14d7 e646 1d57 1203
0000150 1747 0de8 c7b1 e6ec 1b86 8e84 9b23 f0ed
0000160 08db cd6f 4f0c f9f2 e0c6 6bd7 1262 8ffc
0000170 0e89 8f83 15c1 a101 ab9c 724d d8bd 464b
0000180 aa88 4b98 ed16 6b3c 6788 5d48 16ae 433c
0000190 8447 743b 8a17 1f25 ad29 f62e 466e 7d28
00001a0 c688 dc36 d811 2394 d52d 0223 7282 e191
00001b0 e08c af5c 5c8b 4efd 3ea0 6082 2f20 690d
00001c0 2c44 cd45 6ceb ce58 8d44 452a a5b8 69b7
00001d0 fe8e 7cac c22e 7e0e ef56 3257 cf63 9bac
00001e0 3400 be86 18ef 299b 1eb0 f4d9 d899 afde
00001f0 ae91 59d6 a089 e46b 297b 90f5 2f1c 9e18
0000200 7a5f f0f7 3f9b bd47 f02f f73f 91d1 d26b
0000210 014c 5289 d6a7 08e9 aaca 7bc1 4d47 409c
0000220 7d6a 3a62 a771 6858 a35a d4ba 151b e020
0000230 098b 252a 5f60 2d22 0386 60b2 3cc7 61d9
0000240 0025 6e19 4289 d560 6564 e031 7383 61de
0000250 0f02 9eee ecc3 692c f31c cb1c 0050     
000025d
$ hexdump 2.db   
0000000 2069 6d61 7420 7365 2074 0a31          
000000c

接下来尝试使用对称加密,对称加密就不需要公私钥啦。

支持的对称加密的方法通过输入

gpg --version

查看,这里选择AES256:

gpg --symmetric --cipher-algo AES256 test.db 

可以使用参数指定输出的文件名,不指定的话就是源文件的文件名和后缀名再加上.gpg的后缀了。那么在提示输入两次密码之后就会生成一个test.db.png了。解密也很简单,直接

gpg test.db.gpg 
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
gpg: AES256 加密过的数据
gpg: 以 1 个密码加密
File 'test.db' exists. 是否覆盖?(y/N)n
请输入新的文件名: 3.db

因为gpg命令默认可以省略解密的参数,也就是说默认是解密文件的命令,而加密方法会通过加密之后的文件计算出来。AES加密还有填充方式、加密模式、偏移等参数,这些在gpg里能不能作为参数来选择以及不支持的话用什么方法来做目前还不知道,先挖个坑好了以后来填。