Using GPG to Protect Your Pirvacy and Information
GPG or GnuPG 是目前最流行、最好用的加密工具之一。是由GNU出品的PGP的开源实现版本.广泛应用于加密、数字签章及产生非对称匙对等.
Table of Contents
Why Use GPG?
自从登登同学勇敢举报了美帝大范围窃听民众通讯之后, 越来越多的人开始注意自己的个人隐私(o(▽)o (好~~). 其推荐的tails也是非常不错. 用GPG来加密往来邮件, 加密文件, 以防 帝国 美帝 窃听个人隐私…("▔□▔).(万一你写给女盆友的 亲密的 情书被偷看了, 嗯…
如何获取GPG呢?
Under Linux
在fedora/SL/Centos下:
1 | sudo dnf install -y gnupg2 |
debian/ubuntu:
1 | sudo apt-get install gnupg2 |
opensuse:
1 | sudo zypper in gnupg2 |
Under Mac
mac下的推荐GPGTools, 直接下载安装就好了. 还有一个macgpg, 现在不推荐使用了.
源码安装
如果想自己编译,可以下载源码编译安装.
怎么使用GPG呢?
生成个人密钥
在终端下运行如下命令
1 | gpg --gen-key |
会看到如下的输出:
1 | gpg (GnuPG) 1.4.19; Copyright (C) 2015 Free Software Foundation, Inc. |
一般选择 1 就好, 接下来就是密钥的长度,过期时效,名字,邮箱,注释, 最后输入密码(一定要记住).最后的最后确认一遍, 然后随便做点什么小动作给他点熵值.
几分钟后你会看到类似如下的结果:
1 | key 577F4A22 marked as ultimately trusted |
其中, uid
就是用户ID
, 577F4A22
也可以用来当作用户ID
, 以下用 UID
代替.
接着生成一张"撤销证书", 用来将来密钥作废时,请求外部的公钥服务器撤销你的公钥
1 | gpg --output revoke.asc --gen-revoke UID |
同样地,确认, 原因, 注释, 密码, revoke.asc就是撤销证书, 好好保存. 不要让别人偷了去了.
管理个人密钥
列出密钥
1 | gpg --list-keys |
这会列出系统已有密钥,如下:
1 | /home/dark/.gnupg/pubring.gpg |
第一行 pubring.gpg-显示公钥文件名,第三行显示公钥特征(4096位,Hash字符串和生成时间),第四行显示"用户ID",第五行显示私钥特征。
删除密钥
列出密钥后,可以删除不用的密钥.
1 | gpg --delete-key UID |
这样就删除了UID
这个密钥
输出密钥
公钥文件(.gnupg/pubring.gpg)以二进制形式储存, 可以这样导出到ASCII文本中:
1 | gpg --armor --output public.txt --export UID |
导出密钥到ASCII文本中:
1 | gpg --armor --output private.txt --export-secret-keys UID |
上传密钥
公钥服务器是网络上专门储存用户公钥的服务器, 上传到公钥服务器可以让别人导入你的公钥, 进而向你发送加密文件或邮件.
1 | gpg --send-keys UID --keyserver hkp://subkeys.pgp.net |
这样,你的公钥就上传到了公钥服务器上了, 通过交换机制,所有的公钥服务器最终都会包含你的公钥。由于公钥服务器不会检查上传人的身份, 故需要你将你的公钥指纹发布到网上,确保真实性, 让其他下载你公钥的人可以检验是否为真. 用下面的命令输出你的公钥指纹.
1 | gpg --fingerprint UID |
我的公钥指纹是
1 | pub 4096R/577F4A22 2015-07-01 |
导入密钥
同样的,你可以从公钥服务器上导入别人的公钥:
1 | gpg --keyserver keys.gnupg.net --search-key UID |
--search-key
参数可以是邮箱, 或者 uid
的名字.
如果准确知道导入公钥的 uid
, 可以直接导入
1 | gpg --keyserver keys.gnupg.net --rec-key UID |
或者让别人直接发给你,然后导入
1 | gpg --import [key-file] |
确定公钥的真实性后,可以对其签收:
1 | gpg --sign-key UID |
同样上面也能导入其他的自己的秘钥.
文件加密解密
文件加密
假定加密文件为 file
, 加密后的文件为 en-file
:
1 | gpg --recipient UID --output en-file --encrypt file |
UID
是接收人的秘钥UID
.
文件解密
收到别人给自己的加密文件 file
, 可以解密到 de-file
1 | gpg --output de-file -d file |
不加--output
会直接输出到终端
文件数字签名
对文件签名
有时候我们需要对文件签名,表示这个文件确实是本人发出的, 若有多个秘钥,则需要加上 -u(--local-user) uid
1 | gpg [-u UID] --sign file |
之后会生成一个file.gpg
的二进制文件, 用--cleansign
代替--sign
会生成 ASCII 文件 file.asc
可以将签名写进另一个文件, 高度推荐这种用法,尤其是对二进制文件(如文档)签名的时候。另外, --armor
选项在这儿也非常有用, 会生成 ASCII 码形式的签名文件, 不加则是二进制的.
1 | gpg [-u UID] --armor --detach-sign file |
对文件签名验证
收到别人签名后的文件,需要用对方的公钥验证签名是否为真, 如果没有其公钥,需要先导入.
1 | gpg --verify file.asc |
如果是签名和文件合在一起,可以使用如下命令提取原始文件:
1 | gpg --output file.orig -d file.asc |
签名并加密
有时候我们需要签名的时候进行加密,可以这样做:
1 | gpg [-u Sender] [-r Recipient] [--armor] --sign [--clearsign] --encrypt [Data] |
Sender
是自己的 UID
, Recipient
是对方的 UID
.
验证签名并解密
如果数据既签名又加密,则验证签名过程是在解密中进行的
1 | gpg --output de-file -d file |
邮件加密解密
… Absent Now…
水水更健康"o((>ω< ))o"