GPG简介
GPG是自由软件基金会依照由IETF订定的OpenPGP技术标准设计出了GNU Privacy Guard(GnuPG或GPG)。GPG是满足GPL的PGP加密软件的替代物,用于加密、数字签名及产生非对称匙对的软件。
PGP是(英语:Pretty Good Privacy,中文含义“良好隐私密码法”)是一套用于消息加密、验证的应用程序,采用IDEA的散列算法作为加密与验证之用。 PGP的主要开发者是菲尔·齐默尔曼(Phil Zimmermann)。齐默曼于1991年将PGP在互联网上免费发布。OPENGPG是1997年7月,PGP Inc.与齐默尔曼同意IETF制定一项公开的互联网标准,称作OpenPGP,任何支持这一标准的程序也被允许称作OpenPGP。
GPG常用步骤
1.安装GPG软件包
2.生成密钥
3.密钥管理
4.导入导出密钥
1.安装GPG软件包
Debian系列发行版:
apt install gnupg //下载并安装gnupg软件包
Redhat系列发行版:
yum install gunpg //下载并安装gnupg软件包
2.对称加密及解密
gpg -c myfile //对称方式加密
这样,会提示你输入两次密码,然后生成myfile的加密文件myfile.gpg,注意不能对目录加密,可以用-o选项指定输出文件名称。
解密对称加密的文件:
gpg -o mydecrypt -d myfile.gpg //对称方式解密
这样,会提示你输入解密密码,输入之后,将会解密相应的文件,通过-o指定生成的解密文件,-d指定被解密的文件。
3.生成密钥
gpg --gen-key //生成密钥(交互式)
[root@localhost ~]# gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 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.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 2048
Requested keysize is 2048 bits
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 0
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: geekdeedy
Email address: geekboy@qq.com
Comment:
You selected this USER-ID:
"geekdeedy <geekboy@qq.com>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
GPG密钥生成步骤:
- 选择加密算法 (默认为1)
- 选择密钥长度 (默认为2048)
- 选择密码的有效期(默认值为0,表示永不过期)
- 确认上述信息是否正确 (确认y不确认n)
- 输入个人信息(姓名、邮箱、说明;说明可以为空)
- 确认个人信息是否正确(O确认,Q退出,N修改用户名,C修改说明,E修改邮箱)
- 使用口令加密私钥
- 然后软件说“需要生成大量随机字节”,你可以随意进行一些操作,敲击键盘、晃动鼠标等。
- 生成密钥
最后,建议再生成一个撤销证书,以便以后密钥作废时,请求公钥服务器撤销你的公钥:
gpg --ken-revoke [uid] //请求服务器生成撤销证书
4.管理密钥
列出密钥
gpg --list-keys //列出密钥
[root@localhost ~]# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------------------
pub 2048R/5F40F244 2017-07-19
uid geekdeedy <geekboy@qq.com>
sub 2048R/7D1E46CE 2017-07-19
//第一行是公钥文件路径,第二行是公钥信息,第三行是用户ID,第四行是私钥信息。
删除密钥
gpg --delete-secret-keys [uid] //删除这个uid的私钥(删除时必须先删除私钥然后才能删除公钥)
gpg --delete-keys [uid] //删除这个uid的公钥
删除私钥
[root@localhost ~]# gpg --delete-secret-keys geekdeedy
gpg (GnuPG) 2.0.22; Copyright (C) 2013 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 2048R/A2AB8C54 2017-07-19 geekdeedy (this is comment) <geekboy@qq.com>
Delete this key from the keyring? (y/N) y
This is a secret key! - really delete? (y/N) y
删除公钥
[root@localhost ~]# gpg --delete-keys geekdeedy
gpg (GnuPG) 2.0.22; Copyright (C) 2013 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.
pub 2048R/A2AB8C54 2017-07-19 geekdeedy (this is comment) <geekboy@qq.com
Delete this key from the keyring? (y/N) y
//删除密钥成功是没有提示的,没有消息就是最好的消息。
导入密钥
gpg --import [密钥文件] //导入密钥文件中的密钥
导出密钥
导出公钥
gpg -omypubkey --export [uid] //二进制方式导出公钥(默认)
gpg -a -omypubkeyascii --export [uid] //以文本方式导出公钥
导出私钥
gpg -o mysubkey --export-secret-keys [uid] //以二进制方式导出私钥(默认)
gpg -o mysubkey --export-secret-keys [uid] //以文本方式导出私钥
密钥默认以二进制方式导出私钥
如果没KeyID则是备份所有的私钥,-o表示输出到文件mysubkey中,如果加上-a的参数则输出文本格式的信息,否则输出的是二进制格式信息。
非对称加密及解密
加密前查看文件内容
[root@localhost ~]# ls
test
[root@localhost ~]# cat test
hello this is earth,welcome
加密
[root@localhost ~]# gpg -ea -r geekdeedy test(-e表示加密、-a表示以ascii格式输出、-r表示指定密钥)
加密后查看文件内容
[root@localhost ~]# ls
test test.asc
[root@localhost ~]# cat test.asc //使用-a选项表示以ASCII编码输出,后缀以asc结尾,默认是以gpg结尾
-----BEGIN PGP MESSAGE-----
Version: GnuPG v2.0.22 (GNU/Linux)
hQEMA4YGEWB9HkbOAQgAgqrpnYkoW/y0SUZkXtMrHnTnHmQj4WgMNC+g5sqAhg9L
SvTmD0UdJYU5QJJOqgJF9DcWLU6H8M6KnQU9m1aGvzmZLR5fWKlh0qJG5jojOVGa
rfpaATozUJrwSRZUyh3OoEP28K39jmhBoVLpyUyYyV3VNBPrDIOwqBAj62DYbCrY
UCRNX7/ozcWq4h/8Gq/oVH3b2hDGD6++CQBfuvI4N+ckEh4U1JNZQkHT7urL38ec
O+Hcs3Xu9NvwiW1HY25+4i+bldDJrHkueLTcg9xxdW50MQj2pjPuIohWEYLrsYqH
6AUJEFWnLuHkuhQygo+q7cErJqaV+Zj6df/HxIkfNdJbAelbiQVIMWdBkSwI91qj
v0cyTtM1G39WC14u5ZoeUxoxkDWjzIVCuh0Z8SLDRYhaUEz8rlqJE/zRB7VozRya
2T5luUZ1wGGdtCt4e0OSbQN40VeNEER5PI3M5w==
=GmS0
-----END PGP MESSAGE-----
//使用gpg密钥加密过的test数据
解密
[root@localhost ~]# gpg -o test2 -d test.asc //-o 表示解密后输出文件名 -d 表示需要解密的文件,解密需要私钥密码
You need a passphrase to unlock the secret key for
user: "geekdeedy <geekboy@qq.com>"
2048-bit RSA key, ID 7D1E46CE, created 2017-07-19 (main key ID 5F40F244)
gpg: encrypted with 2048-bit RSA key, ID 7D1E46CE, created 2017-07-19
"geekdeedy <geekboy@qq.com>"
[root@localhost ~]# ls
test test2 test.asc
[root@localhost ~]# cat test2
hello this is earth,welcome
//此时就能看到加密前的数据了
签名与验证
签名作用是验证明文、加密文件、密钥是来自正确的发送者的,没经过其它人的修改。签名使用的也是密钥对,与加密操作相同。只是在结果上,点不同。它只是在文件最后添上加密的验证信息(签名)。一旦文件有所改变,签名验证就会出错。比如我们ubuntu安装软件时,首先要用事先保存的密钥(从可信的服务器上下载)验证软件源的签名,以保证我们连的是正确的安全的下载服务器。
gpg -o test.sig -s test //产生二进制签名
gpg -o test.sig2 -clearsign test //产生文本格式签名
签名过程中都需要加密
gpg -o test.sig -ser geekdeedy test //签名并解密
gpg -o test3 --decrypt test.sig //恢复加密的签名文件
gpg -o test4.sig --ab test //分离式签名,不包含原文件数据
gpg --verify test4.sig test //验证分离式签名和原文件数据
[其他]
编辑公钥
可以对公钥进行编辑,这里没具体实践,大致过程如下:
#gpg --edit-key [uid] //uid是别人的用户id,输入之后,出现命令提示符号。
fpr <===输入这个表示查看uid的指纹,核对信息真实性,这样之后签署。
sign <===输入这个签署公钥,这样以后再使用它加密的时候不会产生警告了。
check <===输入这个,检查uid已有的钥匙的签名。
list //使用list可以看到当前用户的 密钥及用户标识
adduid //添加一个用户标识
quit <===输入这个,退出交互,可能会提示你保存之前的设置。
revuid 使用注销命令进行标识的注销。