- 先阐述最简单和容易实现的操作——邮件加密和签名,着重以图形工具讲解。然后放在第二篇再讲解命令行工具,以及对文件进行加密和数字签名的方法。
是由 Phil Zimmermann (之所以提这个名字是因为这位仁兄背后有一段故事,有兴趣可以找找他的八卦)于 1991 开发的一个用于数据加密和数字签名的程序,由于被广泛应用,以至于后来形成一个开放的标准 OpenPGP,这个标准也是目前最为常用的邮件加密和签名的方式。而 GnuPG 则是实现了该标准的一个开源免费程序,本文将会简单介绍如何使用 GnuPG 管理钥匙、加密/解密文件和电子邮件、数字签名文件和电子邮件。篇幅有点长,一共分两章,不过内容是很简单的。@ivarptr
目录:
- 加密和数字签名的简单原理
- 下载并安装 GnuPG
- 使用(图形化)工具管理钥匙
- 邮件的加密和数字签名
- 使用命令行管理钥匙
- 使用命令行加密解密文件
- 使用命令行对文件进行数字签名
- GnuPG 的更多指南
一、加密和数字签名的简单原理
二、下载并安装 GnuPG
$ sudo pacman -S gnupg
三、使用(图形化)工具管理钥匙
四、邮件加密和数字签名
小练习:尝试用邮件客户端发送一封签名或者加密过的邮件给我:ivarptr@126.com。
from http://web.archive.org/web/20150327150738/http://archboy.org/2013/04/18/gnupg-pgp-encrypt-decrypt-message-and-email-and-digital-signing-easy-tutorial/
五、使用命令行管理钥匙
1、生成钥匙对
$ gpg --gen-key
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection?
What keysize do you want? (2048)
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)
Email address: ivarptr@126.com
Comment: ivarptr on Twitter
第2行输入你的email地址,比如我上面输入的是 ivarptr@126.com。
第3行输入一行备注,备注的作用是进一步标识自己的身份,比如你在姓名一行输入“小明”,为了让你的朋友更确切地知道是哪个小明,你可以输入“你隔壁家的小明”。
2、查看本机钥匙信息
$ gpg --list-keys
——————————–
pub 2048R/72E75B05 2013-04-17 [expires: 2015-04-17]
uid ivarptr (ivarptr on Twitter) <ivarptr@126.com>
sub 2048R/74F0F5F9 2013-04-17 [expires: 2015-04-17]
- 72E75B05 是这个公钥的id,这个id跟uid都是用于标识这个公钥的,因为uid是用户随便输入的所以会有重复的情况,因此在某些需要明确指定公钥的命令,需要用id而不能用uid表示这个公钥。另外在使用这个id表示一个钥匙时,记得在前面加上”0x”,是零和字母XYZ的X,比如”0x72E75B05″
- 2013-04-17 是生成这个公钥的时间,后面括号内的是有效期。
3、导出公钥
$ gpg -a --output key.public --export UID
- -a 表示输出文本文件格式。默认输出是二进制格式,因为二进制格式不太方便在网络(比如论坛或者博客)上展示,所以推荐文本格式。
- –output 指定输出文件的名字,你可以更改为其他名字。
- –export 表示执行输出公钥操作,后面的 UID 为你要输出的公钥的标识。
$ cat key.public
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.19 (GNU/Linux)
…………
…………
-----END PGP PUBLIC KEY BLOCK-----
4、把公钥发布到公钥服务器
$ gpg --keyserver keys.gnupg.net --send-key ID
- –keyserver 用于指定公钥服务器,没有特殊需求的话是可以省略这个参数的,不过有些 GnuPG 版本可能需要指定这个参数才能正常工作。
- –send-key 用于指定待发布的公钥的id。
六、使用命令行加密文件
1、在公钥服务器搜索作者的公钥并导入到本机
$ gpg --keyserver keys.gnupg.net --search-key ivarptr
(1) ivarptr (ivarptr on Twitter) <ivarptr@126.com>
2048 bit RSA key 72E75B05, created: 2013-04-17
Keys 1-1 of 1 for “ivarptr”. Enter number(s), N)ext, or Q)uit >
$ gpg --keyserver keys.gnupg.net --recv-key 0x72E75B05
$ gpg --import key.public
2、核对公钥的指纹值并签收公钥
$ gpg --fingerprint
Key fingerprint = 0D24 0A94 A86C 7B83 3F7C 200E 1CAF 0CB0 72E7 5B05
uid ivarptr (ivarptr on Twitter) <ivarptr@126.com>
sub 2048R/74F0F5F9 2013-04-17 [expires: 2015-04-17]
$ gpg --sign-key ivarptr
$ gpg --delete-keys ivarptr
3、加密一个文件
$ gpg -a --output message-ciper.txt -r ivarptr@126.com -e message.txt
- -a 表示输出文本文件格式。
- –output 指定输出(即加密后)的文件名。
- -r 指定信息的接收者(recipient)公钥的uid,可以是名字也可以是email地址。
- -e 表示这次要执行的是加密(encrypt)操作。
小练习:现在你可以用 email 把加密后的文件寄给我,或者把里面的内容复制然后粘贴到我博客的评论里,接下来我会解密然后回复你。如果你希望我也以加密的形式回复你,记得同时告诉我你的公钥 id。
4、解密一个文件
$ gpg --output message-plain.txt -d message-ciper.txt
- –output 指定输出(即解密后)的文件名。
- -d 表示这次要执行的是解密(decrypt)操作。
七、使用命令行对文件进行数字签名
1、数字签名一个文件的方法A
$ gpg -a -b message.txt
- -a 表示输出文本文件格式。
- -b 表示以生成独立的签名文件的方式进行签名。
$ gpg --verify message.txt.asc
gpg: Signature made Thu 18 Apr 2013 12:35:00 AM CST using RSA key ID 72E75B05
gpg: Good signature from “ivarptr (ivarptr on Twitter) <ivarptr@126.com>”
2、数字签名一个文件的方法B
$ gpg -a --clearsign message.txt
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 hello world, my key id is 72E75B05, finger is 0D24 0A94......5B05, check it out. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQEcBAEBAgAGBQJRbuXuAAoJEByvDLBy51sFaY8IAKKnXX2JGI51mzYSakqvhNnr iV2JLvokMkvyDuJQGeNDMim5W7P0/df+G4oO45B9b0iFx6DSQwZGeBjEGCXvCURa uU2fdEqjaSarlrs0d4R1ihol8rCxkZwBYBBPjcvDkVwoVJJYS0zc3OYzMvWhb8mk Q72wQ0obX5LedUVrauG9OLkvq9aBKONr6Xlkldd133v3gb/Wzjf71CLYcRoJDpze 2XBSkrGS0UxRp3WixJJK8xyfDfI9VHBaXEndCkgQ+Mpfq9nV5XAm3MKcPjlENq4g xGywHRpnwpW8N22VE6ZFEUFlXrh5C8hZfGaG/EcT21PeAbZYH8RcnYTbJ+s2nZ4= =lhd6 -----END PGP SIGNATURE-----
$ gpg --verify abc.txt
$ gpg --output message-original.txt -d abc.txt
八、GnuPG 的更多指南
- 迷你Howto教程:http://www.dewinter.com/gnupg_howto/english/GPGMiniHowto.html
- 迷你Howto教程(中文版): http://www.gnupg.org/howtos/zh/index.html
- The GNU Privacy Handbook http://www.gnupg.org/gph/en/manual.html
- Pretty Good Privacy http://en.wikipedia.org/wiki/Pretty_Good_Privacy
- Quick’n easy gpg cheatsheet http://irtfweb.ifa.hawaii.edu/~lockhart/gpg/
用GnuPG进行信息加密和解密
非对称加密采用的是另一种思想。它会给你产生两个密钥,一个称为“公钥”,另一个称为“私钥”。公钥是可以公开的,你尽管把它传给别人;私钥你一定 要保管好不让其他任何人知道。当某人得到你的公钥后,他就可以给你发送加密信息了。具体来说,他把他要发给你的信息用你的公钥加密后发给你,加密的信息只 能用你的私钥去解密。这样,因为世界上除了你以外没有别人知道你的私钥,所以即使别人看到发送给你的加密信息他也无法解密,甚至连发送者本人也不行。因为 他不知道你的私钥。简单说来,就是用公钥去加密;用对应的私钥去解密。想给谁发送加密信息,首先要得到他的公钥。
支持非对称加密的软件有多种,最著名的可能是美国的PGP了,不过它是个商业软件,价格不便宜。对于加密软件,我反对使用破解软件,因为如果信息需 要加密的话,肯定是非常重要的信息,破解软件无法保证加密的安全可靠。因此我建议使用免费开源的GnuPG软件进行信息的加密和解密。
首先去GnuPG的官方网站下载你的操作系统的软件包()。 然后按照安装向导进行安装。有一步是让你选择语言的,建议选择zh_CN – Chinese (simplified),这样会使GnuPG的输出信息为中文。默认的安装目录是C:Program FilesGNUGnuPG,建议把它加入到PATH环境变量中去。因为GnuPG是一个命令行的软件,将安装目录加入PATH后使用会方便得多。
接下来该使用GnuPG来生成你的公钥和私钥了。打开命令提示符,输入gpg –gen-key。GnuPG会提示你 选择密钥的种类,这里选择默认的第一项“DSA 和 ElGamal”,其他两个都只能用于签名而不能用来加密。按回车接受默认选择。接下来让你设置密钥的长度,数值在1024到4096位之间。长度越长, 安全程度越高,但相应的加密和解密时的计算量也就越大。其实即使是最小值1024位,估计用大型计算机去破解的话也得用好几个月的时间。默认长度是 2048位,足够安全了。然后设置你的密钥有效期,按照提示输入,0表示永不过期。后来确认无误后,输入y确定。
接着输入你的姓名、电子邮件和注释。这些信息将用来标识你的身份。然后按O确认。接着设置你的私钥密码。注意这个密码并不等同于你的私钥,它只是用 来保护私钥不会被其他人利用。私钥是一个很大的整数,你通常是不会去记住的。但当你需要用私钥去解密信息时,GnuPG会提示你输入密码,只有密码输对 了,GnuPG才会去读取你的私钥去解密信息。
输入完两次密码后,GnuPG会提示你动动鼠标键盘之类的,以便产生一个“足够随机”的随机数,最终生成一对公钥和私钥。
至此,一对儿密钥已经产生了。你需要把公钥告诉你的朋友。怎么样得到自己的公钥呢?用gpg的–export选项。下面这个命令会输出我的公钥(假定我在上面生成密钥时设定的姓名为“Wang Jinbo”):
gpg –export “Wang Jinbo”
你看到的应该是一大堆乱码,这其实就是公钥。如果希望公钥看起来整齐一些,可以使用-a选项设置输出为ASCII字符:
gpg –export -a “Wang Jinbo”
把上面的输出重定向到一个文件中去,例如wang.key:
gpg –export -a “Wang Jinbo” > wang.key
这样,wang.key这个文件就是我的公钥了,我可以把它放到我的网站上或者通过电子邮件发送给我的朋友们。
如果你得到了我的公钥,如何用它去加密呢?首先你需要导入我的公钥文件。
gpg –import wang.key
这会将我的公钥导入到你的“钥匙环”中。这样以后你就可以用我的公钥给我发送加密信息了。下面是具体的做法。
假设你给我发送的信息是hello.txt这个文件。现在用GnuPG来加密:
gpg -e -r “Wang Jinbo” hello.txt
这会在当前目录下生成hello.txt.gpg这个文件,这个就是就是hello.txt被加密后的结果。你可以用记事本打开看看,应该是一大堆无意义的乱码。然后你就可以把这个文件通过电子邮件发到我的邮箱中去。我收到后,用下面的方法去解密。
gpg -d hello.txt.gpg
GnuPG会提示我输入密码,也就是我在gpg –gen-key中设定的密码。密码输入完后,GnuPG会在屏幕上立刻显示出解密以后的内容。如果被加密的不是文本内容,比如是一个图片,则可以将输出重定向到一个文件中去:
gpg -d hello.png.gpg > hello.png