9.PGP

Pretty Good Privacy——很好的隐私

PGP是为了保护处于极端状况下的人们的隐私而开发的密码软件。

OpenPGP是对密文和数字签名格式进行定义的标准规格(RFC1991、RFC2440、RFC4880、RFC5581、RFC6637)。

GnuPG(GNU Privacy Guard,GPG)是一款基于OpenPGP标准开发的密码学软件,支持加密、数字签名、密钥管理、S/MIME、ssh等多种功能。GnuPG本身是一款命令行工具,但它经常被集成到其他应用软件中。

GnuPG分为stable、modern 和 classic三个系列。

9.PGPPGP的功能生成密钥对加密与解密加密生成和加密会话密钥压缩和加密消息解密解密私钥生成和验证数字签名生成数字签名验证数字签名生成数字签名并加密以及解密并验证数字签名用PGP生成数字签名并加密用PGP解密并验证数字签名散列值、会话密钥和消息的变化信任网

PGP的功能

PGP具有现代密码软件所必需的几乎全部功能

生成密钥对

加密和数字签名的前导步骤是生成密钥对。

在debian系中,使用 gpg2 --full-gen-key 命令生成密钥对。

使用 gpg2 --export --armor A57FF192 命令显示公钥A57FF192的内容(文本格式)。

加密与解密

加密

加密过程如下:

image-20250505095401921

消息经过混合密码系统进行加密,然后转换成报文数据(文本数据)。此处还包括了消息的压缩以及二进制到文本转换(转换为ASCII radix-64格式)。

生成和加密会话密钥

  1. 用伪随机数生成器生成会话密钥
  2. 用公钥密码加密会话密钥,这里使用的密钥是接收者的公钥

压缩和加密消息

  1. 压缩消息
  2. 使用对称密码对压缩的消息进行加密,这里使用的密钥是步骤1生成的会话密钥
  3. 将加密的会话密钥与加密的消息合并
  4. 将步骤3的结果转换成文本数据,转换后的结果就是报文数据

混合密码系统的特点: 用公钥密码加密会话密钥,用对称密码加密消息

解密

解密过程如下:

image-20250505100252702

解密私钥

PGP的私钥是保存在用户的钥匙串中的。为了防止钥匙串被盗,私钥都是以加密状态保存的,并在保存时使用了基于口令的秘密(PBE)。口令由多个单词组成,没有正确的口令就无法使用相应的私钥。

解密的步骤如下

  1. 接收者输入解密的口令
  2. 求口令的散列值,生成用于解密私钥的密钥
  3. 将钥匙串中经过加密的私钥进行解密
  4. 将报文数据(文本数据)转换成二进制数据
  5. 将二进制数据分解成两部分:加密的会话密钥、经过压缩和加密的消息
  6. 用公钥密码解密会话密钥,此处使用步骤3中生成的接收者的私钥
  7. 对步骤5中得到的经过压缩和加密的消息用对称密码进行解密。此处使用步骤6中生成的会话密钥
  8. 对步骤7中得到的经过压缩的消息进行解压缩
  9. 得到原始消息

下图展示了加密和解密的过程中,会话密钥和消息经过了哪些变化:

image-20250505103048961

生成和验证数字签名

生成数字签名

PGP中生成数字签名的过程如下图所示:

image-20250505103355290

消息与对应的签名进行拼合,并最终转换成报文数据(文本数据)。

在PGP中,可以选择是否要将报文数据转换成文本数据。

生成数字签名步骤如下:

  1. 发送者输入签名用的口令
  2. 求口令的散列值,生成用于解密私钥的密钥
  3. 将钥匙串中经过加密的私钥进行解密
  4. 用单向散列函数计算消息的散列值
  5. 对步骤4中得到的散列值进行签名,相当于使用步骤3中得到的私钥进行加密
  6. 将步骤5中生成的数字签名与消息进行拼合
  7. 将步骤6的结果进行压缩
  8. 将步骤7的结果转换为文本数据
  9. 步骤8的结果就是报文数据

验证数字签名

PGP验证数字签名的过程如下图所示:

image-20250505105533415

验证数字签名的过程步骤如下:

  1. 将报文数据(文本数据)转换为二进制数据
  2. 对经过压缩的数据进行解压缩
  3. 将解压缩后的数据分解成经过签名的散列值和消息两部分
  4. 将经过签名的散列值(经过加密的散列值)用发送者的公钥进行解密,恢复出发送者发送的散列值
  5. 将步骤3中分解的消息输入单向散列函数计算散列值
  6. 将步骤4中得到的散列值与步骤5中得到的散列值进行对比
  7. 如果步骤6的结果相等则数字签名成功,否则验证失败
  8. 步骤3中分解出的消息就是发送者发送的消息

下图展示了生成和验证数字签名的过程中,散列值和消息经过了怎样的变化:

image-20250505113902614

生成数字签名并加密以及解密并验证数字签名

用PGP生成数字签名并加密

过程如下图所示:

image-20250505114101920

用PGP解密并验证数字签名

过程如下图所示:

image-20250505114317318

散列值、会话密钥和消息的变化

如下图所示:

image-20250505114414323

信任网

信任网是PGP采用的一种确认公钥合法性的方法,解决公钥合法性问题。

【公钥合法性】,即,确认自己所得到的公钥是否真的属于正确的人。

公钥可能会通过中间人攻击被替换。

证书是确认公钥合法性的方法之一。证书由认证机构对公钥施加数字签名,通过验证这个数字签名就可以确认公钥合法性。

PGP中没有使用认证机构,而是采用了 信任网 (web of trust)方法。在此方法中,PGP用户会 互相对对方的公钥进行数字签名

信任网的要点是:【不依赖认证机构,而是建立每个人之间的信任关系】。即,能够自己决定要信任哪些公钥。

根据 《TLS Mastery》第一章:TLS密码学 所述,【信任网】和【证书颁发机构】,是两种信任公钥的通用模型。信任网模型要求用户做出初始信任决策,然后用可传递的信任来评估世界。信任网令人困惑、难以使用、容易被玩弄。

建立信任网的三个场景:

公钥合法性与所有者信任是不同的

所有者信任级别因人而异

image-20250505133206957