目录
13.2 PGP简介
13.2.1 什么是PGP
PGP是于1990年左右由菲利普·季默曼个人编写的密码软件,现在依然在世界上被广泛使用。PGP这个名字是Pretty Good Privacy的缩写。
PGP可以在Windows、MacOS、Linux等很多平台上运行,版本包括商用版本和免费版。此外,还有一个由GNU遵照OpenPGP规范编写的叫作GnuPG(GNU Privacy Guard)的自由软件。
OpenPGP规范是对密文和数字签名进行定义的标准规范(RFC1991、RFC2440、RFC4880、RFC5581、RFC6637)。
关于GNU Privacy Guard
GNU Privacy Guard(GnuPG、GPG)是一款基于OpenPGP标准开发的密码学软件,支持加密、数字签名、密钥管理、S/MIME、ssh等多种功能。
GnuPG是基于GNU GPL协议发布的一款自由软件,因此任何人都可以自由使用它。GnuPG本身是一款命令行工具,但它也经常被集成到其他应用软件中。
GnuPG分为stable、modern和classic三个系列。
13.2.2 PGP的功能
PGP具备现代密码软件所必需的几乎全部功能。
- 对称密码
- 公钥密码
- 数字签名
- 单向散列函数
- 证书
- 压缩
- 文本数据
- 大文件的拆分和拼合
- 密钥串管理
13.4 加密与解密
13.4.1 加密
这里的加密过程跟第6章的混合密码系统的结构基本一致,差异在于这里还包括了消息的压缩以及二进制→文本转换(转换为ASCII radix-64格式)这两个步骤。
生成和加密会话密钥
(1)用伪随机数生成器生成会话密钥。
(2)用公钥密码加密会话密钥,这里使用的密钥是接收者的公钥。
压缩和加密消息
(3)压缩消息。
(4)使用对称密码对压缩的消息进行加密,这里使用的密钥是步骤(1)中生成的会话密钥。
(5)将加密的会话密钥(步骤(2))与加密的消息(步骤(4))拼合起来。
(6)将步骤(5)的结果转换为文本数据,转换后的结果就是报文数据。
用公钥密码加密会话密钥,用对称密码加密消息就是混合密码系统的特点。
13.4.2 解密
解密私钥
PGP的私钥是保存在用户的钥匙串中的。为了防止钥匙串被盗,私钥都是以加密状态保存的,并在保存时使用了基于口令的密码(PBE)。
解密私钥的步骤如下:
(1)接收者输入解密的口令。
(2)求口令的散列值,生成用于解密私钥的密钥。
(3)将密钥串中经过加密的私钥进行解密。
解密会话密钥
(4)将报文数据(文本数据)转换成二进制数据。
(5)将二进制数据分解成两部分:加密的会话密钥、经过压缩和加密的消息。
(6)用公钥密码解密会话密钥,这里使用步骤(3)中生成的接收者的私钥。
解密和解压缩消息
(7)对步骤(5)中得到的经过压缩和加密的消息用对称密码进行解密。这里使用步骤(6)中生成的会话密钥。
(8)对步骤(7)中得到的经过压缩的消息进行解压缩。
(9)得到原始消息。
13.5 生成和验证数字签名
13.5.1 生成数字签名
解密私钥
在钥匙串中,私钥是通过口令进行加密保存的,因此不知道口令的人就无法使用相应的私钥。
(1)发送者输入签名用的口令。
(2)求口令的散列值,生成用于解密私钥的密钥。
(3)将钥匙串中经过加密的私钥进行解密。
生成数字签名
(4)用单向散列函数计算消息的散列值。
(5)对步骤(4)中得到的散列值进行签名。这一步相当于使用步骤(3)中得到的私钥进行加密。
(6)将步骤(5)中生成的数字签名与消息进行拼合。
(7)将步骤(6)的结果进行压缩。
(8)将步骤(7)的结果转换为文本数据。
(9)步骤(8)的结果就是报文数据。
13.5.2 验证数字签名
恢复发送者发送的散列值
(1)将报文数据(文本数据)转换为二进制数据。
(2)对经过压缩的数据进行解压缩。
(3)将解压后的数据分解成经过签名的散列值和消息两部分。
(4)将经过签名的散列值(经过加密的散列值)用发送者的公钥进行解密,恢复出发送者发送的散列值。
对比散列值
(5)将步骤(3)中分解出的消息输入单向散列函数计算散列值。
(6)将步骤(4)中得到的散列值与步骤(5)中得到的散列值进行对比。
(7)如果步骤(6)的结果相等则数字签名验证成功,不相等则验证失败。这就是数字签名的验证结果。
(8)步骤(3)中分解出的消息就是发送者发送的消息。
13.6 信任网
在使用PGP时,确认自己所得到的公钥是否真的属于正确的人(公钥合法性)是非常重要的,因为公钥可能会通过中间人攻击被替换。
第10章中介绍的证书就是确认公钥合法性的方法之一。证书就是由认证机构对公钥施加的数字签名,通过验证这个数字签名就可以确认公钥合法性。
然而,PGP中却没有使用认证机构,而是采用了一种叫做信任网(web of trust)的方法。在这种方法中,PGP用户会互相对对方的公钥进行数字签名。