Pretty Good Privacy (PGP) 和数字签名

如果您曾向某人发送过任何明文机密电子邮件(很可能您发送过),您是否曾质疑过邮件在传输过程中是否被篡改或被任何人读取?如果没有,您应该质疑一下!

任何未加密的电子邮件都像一张明信片。它可能被任何人(黑客/安全骇客、公司、政府或任何具有必要技能的人)在传输过程中看到。

1991 年,言论自由活动家和反核和平主义者 Phil Zimmermann 开发了 Pretty Good Privacy (PGP),这是第一个向公众提供的软件,它利用 RSA(一种公钥密码系统,稍后将讨论)进行电子邮件加密和签名。Zimmermann 在一位朋友将该程序发布到全球 Usenet 后,受到了美国政府的起诉;后来他因非法武器出口而被 FBI 起诉,因为加密工具被认为是武器(所有指控最终都被撤销)。Zimmermann 后来创立了 PGP Inc.,该公司现在是赛门铁克公司的一部分。

1997 年,PGP Inc. 向互联网工程任务组提交了一份标准化提案。该标准被称为 OpenPGP,并在 1998 年的 IETF 文档 RFC 2440 中定义。最新版本的 OpenPGP 标准在 RFC 4880 中描述,该文档于 2007 年发布。

如今,有许多符合 OpenPGP 标准的产品:最广泛使用的可能是 GnuPG (GNU Privacy Guard,或简称 GPG),它自 1999 年以来由 Werner Koch 开发。GnuPG 是免费的、开源的,并且适用于多个平台。它是一个仅限命令行的工具。

PGP 用于数字签名、加密(和解密,显然,没有人会使用只能加密的软件!)、压缩、Radix-64 转换

在本文中,我们将解释加密和数字签名。

那么什么是加密,它是如何工作的,以及它如何使我们受益?

加密(保密性)

加密是将任何信息转换为密文或不可读形式的过程。一个非常简单的文本加密示例是

Hello this is Knownymous and this is a ciphertext.

Uryyb guvf vf Xabjalzbhf naq guvf vf n pvcuregrkg.

如果您仔细阅读,您会注意到英文字母表的每个字母都转换为英文字母表中接下来的第 13 个字母,因此 13 是这里的密钥,解密它需要用到。这被称为凯撒密码(是的,该方法以朱利叶斯·凯撒的名字命名)。

从那时起,开发了许多加密技术(密码学),例如 Diffie-Hellman 密钥交换 (DH)、RSA。

这些技术可以以两种方式使用

1. 对称密钥算法

在对称密钥算法中,明文使用密钥加密,然后使用相同的密钥解密。这是一种锁和钥匙机制。单个密钥(或完全相同的副本)用于锁定(加密)和打开(解密)储物柜(密文)。但这有一个缺点,为了能够使用这种方法,发送者(用 S 表示)和接收者(用 R 表示)都需要密钥。因此,如果 S 必须发送任何密文,它还需要发送密钥,以便 R 能够解密它。S 可以物理发送(不,对于长距离来说不可行),或者可以将密钥与消息一起发送(不是一个好主意。您会将钥匙和锁放在一起吗?)。

除了密钥传输之外,对称密钥的另一个问题是用户必须向所有不同的用户发送不同密钥的副本,并跟踪每个密钥以与他们中的每个人建立未来的连接。

那么这种算法的使用场景是什么?

虽然对称加密是一种较旧的加密方法,但它比另一种加密(稍后会讲到)更快更有效,后者由于数据大小和繁重的 CPU 使用而给网络带来性能问题。由于对称加密具有更好的性能和更快的速度,因此对称密码学通常用于批量加密/加密大量数据,例如用于数据库加密。在数据库的情况下,密钥可能仅对数据库本身可用以进行加密或解密,因此这是一个不错的选择。此外,对称密码通常用于实现除加密之外的其他密码学原语。加密消息并不能保证消息在加密时不会被更改。因此,通常将消息认证码添加到密文中,以确保接收者会注意到对密文的更改。消息认证码可以从对称密码构造。

纳粹德国在第二次世界大战期间在其所有军事部门广泛使用了相同的算法,使用了一种特殊的加密设备——恩尼格玛密码机。

为了克服对称密钥的缺点,我们还有另一种加密方式

2. 非对称密码学或公钥加密

公钥密码学最早由英国 GCHQ(政府通信总部)的 James Ellis、Clifford Cocks 和 Malcolm Williamson 于 1975 年发现,但该发现被列为机密信息,从未公开。1976 年,研究人员 Whitfield Diffie、Martin Hellman 和 Ralph Merkle 独立做出了同样的发现,并在论文中发表。然后在 1977 年,Ronald Rivest、Adi Shamir 和 Leonard Adleman 通过开发 RSA 密码,提供了公钥密码算法的第一个实际实现。

它使用两个密钥:一个用于加密(公钥),另一个用于解密(私钥)。

这是一张图来解释这一点

Image removed.

对称密钥算法

这里 A 是发送者,B、C、D 是接收者。正如您所看到的,A 将使用密钥 1 与 B 通信,使用密钥 2 与 C 通信,并使用密钥 3 与 D 通信,并且还需要记录哪个密钥用于哪个锁,并且随着接收者数量的增加,密钥会更多,跟踪起来也会更困难。

现在在非对称密钥中,只有两个密钥。让我们通过下图来理解这一点

Image removed.

非对称密钥算法(这里 B、C、D 是发送者,A 是接收者)

这里 A 生成两个密钥(这里是 1 和 2)。A 保密其中一个密钥(这里是 1,在储物柜内),并在网络上、使用社交媒体或任何在线平台(为此目的有公钥服务器)向 B、C、D 公开分发另一个密钥(无需隐藏,或者说,更好地传播这个密钥)。

现在 B、C、D 拥有 A 的密钥 2。因此,现在他们将把他们的消息放入储物柜并使用密钥 2 锁定(加密)它,并将其发送给 AA 将使用储物柜内的密钥 1(可以使用 A 设置的密码或口令打开)打开它。

密钥 1 称为私钥,用于解密消息,而 密钥 2 是公钥,用于加密。

因此,如果您想发送加密电子邮件,您将需要接收者的公钥。在这里,只要私钥不泄露,数据就不会被任何其他人监视。

数字签名(身份验证)

公钥密码学不仅用于保密性(即保护消息,使其只能由预期的接收者读取),还用于身份验证(即验证消息是否来自预期的发送者)和完整性(即确保消息在传输过程中没有被更改)。身份验证和完整性通过在消息后附加数字签名来强制执行。

数字签名是由算法生成的一串位,该算法将哈希函数与密钥结合使用。哈希函数是一个函数,它接受任何长度的消息作为输入,并输出一个固定小长度的字符串,称为摘要,它是输入消息的蒸馏物。哈希函数的显着特征包括:实际上不可能从输出中推导出输入,并且更改输入的仅仅一位会导致完全不同的输出。

数字签名按以下顺序使用哈希代码或消息摘要算法以及公钥签名算法

  1. 发送者创建消息。
  2. 发送软件生成消息的哈希代码。
  3. 发送软件使用发送者的私钥从哈希代码生成签名。
  4. 二进制签名附加到消息。
  5. 接收软件保留消息签名的副本。
  6. 接收软件为接收到的消息生成一个新的哈希代码,并使用消息的签名对其进行验证。如果验证成功,则消息被接受为真实的。
数字签名如何工作

Image removed.

发送者创建要发送的明文消息的 哈希值哈希函数是一种算法,用于将字符字符串转换为通常更短的(SHA-1 创建 40 个字符)固定长度的值,称为 哈希值或消息摘要。然后使用发送者的私钥加密此摘要(记住接收者的公钥用于加密),并与原始明文消息一起发送。这与诸如使用的哈希算法之类的其他信息一起构成了数字签名。

哈希通常比加密快,这就是为什么我们首先哈希消息,然后加密哈希值。

Image removed.

然后接收者使用发送者的公钥解密哈希值,这为他们提供了已解密的哈希值。然后接收者创建接收到的原始消息的哈希值。如果此哈希值与接收到的已解密哈希值相同,则数字签名被认为是已验证的。

现在,如果消息在其传输过程中被更改(即使是一个字符),那么哈希值将完全不同,并且无法验证数字签名。

数字签名通过使用私钥进行加密,使用公钥进行解密(与加密相反)来工作,因为私钥仅与原始发送者(创建公钥的人)在一起,并且没有人可以获得该私钥(显然这就是它被称为私钥的原因)。这验证了原始消息是从同一来源接收的。

现在有一个问题:如果我们发送带有摘要的明文,那么任何人都可以读取消息,那么如何保持机密性呢?

正如我们之前讨论的那样,数字签名仅维护消息的完整性(未被篡改)和真实性(来自同一来源)。我们使用加密来保护机密性。当一起使用时,消息首先由接收者解密(使用私钥),从而获得明文消息。然后,数字签名将此明文用于身份验证,如上所述。

参考文献

RFC 4800 - OpenPGP 消息格式

Enigmail - 密码学导论

Ankur 是 Accuknox 的一名软件工程师。他是一位开源贡献者,在系统软件工程和云原生技术方面拥有经验。目前,他正在从事 eBPF、LSM 和云原生安全方面的工作。他喜欢谈论和撰写有关开源、云安全和操作系统的文章。在 Twitter 上关注他:@Knownymous1

加载 Disqus 评论