第五章 剖析非对称加密
对称算法提供快速、高效的加密,同时确保数据机密性。然而,双方必须共享相同的密钥。在本章中,我们将讨论另一种主要的加密形式:非对称加密(或称公钥加密)。我们将了解非对称加密是如何被开发出来,以解决安全交换共享密钥的问题,随后又发展出其他优势。您将理解获取共享密钥的两种方式:使用加密算法或使用密钥协商协议(如Diffie-Hellman)。我们还将概述使用Diffie-Hellman如何有助于提供完美前向保密(因为每次会话的加密密钥都是临时生成且独立的,即使攻击者未来设法得到了服务器的长期私钥,由于无法恢复出过去每次会话所使用的临时密钥,也就无法解密过去的任何通信内容。服务器的长期私钥在这里的作用主要是对本次会话的临时公钥进行签名,以验证身份,而不参与共享密钥的生成。这样就既实现了身份认证,又保证了前向安全)。
接着,我们将介绍公钥加密的其他用途,例如保护电子邮件和创建数字签名。我们将发现使用标准(如公钥密码学标准PKCS)如何有助于实现不同供应商产品之间的互操作性。为了理解提供安全算法所需的条件,我们将探讨非对称加密的一些密码学要求。然后,我们将概述一些公钥加密算法,如Rivest、Shamir、Adleman(RSA)加密和椭圆曲线密码学(ECC)。我们将讨论Phil Zimmermann对隐私的热情如何推动了Pretty Good Privacy(PGP)的开发。尽管使用PGP涉及成本,但我们将看到GNU Privacy Guard(GPG)可以提供免费的替代方案。最后,我们将概述数字签名的工作原理,并了解它们如何确保消息的真实性、完整性和不可否认性。
在本章中,我们将涵盖以下主要主题:
 认识非对称加密的需求
 理解密码学要求
 比较公钥算法
 使用数字签名

意识到非对称加密的必要性
我们使用对称加密来保护数据通信,它使用单一共享密钥。使用对称加密时,最佳实践是定期更换密钥,以防其被破解。因此,我们需要在必要时安全地生成密钥并将其分发给双方。由于对称加密使用共享密钥,问题依旧在于:双方如何安全地获得相同的密钥?答案是使用一种同时结合了对称加密和非对称加密的混合系统。
非对称加密的组成部分(如明文、密文和加密算法)与对称加密相似。然而,非对称加密并非使用相同的共享密钥,而是使用两个密钥:一个公钥和一个私钥,如下图所示:

这两个密钥在数学上相关联,由非对称加密算法(如RSA或ECC)生成。在本节中,我们将逐步讲解使用非对称加密交换共享密钥的过程。然而,我们也将学习密钥协商协议Diffie-Hellman算法如何让双方生成相同的共享密钥,并有助于确保完美前向保密。最后,我们将回顾 PKCS(公钥密码学标准),这是一套为促进不同供应商产品互操作性而制定的标准。让我们从讲解在交换共享密钥时如何使用非对称加密开始。

安全地交换密钥
当双方需要通过网络(例如互联网)进行安全通信时,通常需要使用某种形式的加密。例如,若使用传输层安全协议(TLS)传输网页内容等交易数据,双方会使用对称加密。在传输任何数据之前,他们需要交换用于加密数据的共享密钥。
交换密钥主要有两种方式,概述如下:使用非对称算法(如RSA或ECC)进行加密或者通过Diffie-Hellman流程进行密钥协商。双方会在交易前商定使用的方法。例如,在TLS会话期间,该流程在握手阶段确定。让我们从使用公钥加密开始,逐一了解这些方法。

使用公钥加密交换密钥
Alice和Bob需要安全地相互通信。为了共享密钥,他们将使用一种非对称加密算法。在开始此过程之前,Bob首先需要生成一个密钥对,然后将公钥发送给Alice。
为说明此过程,我们想象Alice将共享密钥放进一个网球中。Alice随后将网球加密并通过互联网发送给Bob,Bob将从中提取出用于数据传输的密钥。该过程如下图所示:

流程逐步说明如下:

  1. 始于发送方(Alice)处持有共享密钥。
  2. 将共享密钥放入网球中。
  3. 使用 Bob 的公钥和加密算法对网球进行加密。
  4. 将共享密钥发送给接收方(Bob)。
  5. 使用 Bob 的私钥和解密算法对密文进行解密。
  6. 从网球中提取共享密钥。
  7. 最终,共享密钥呈交给接收方(Bob)。
    现在,双方可以使用对称加密进行安全通信了。接下来,让我们看看双方如何通过 Diffie-Hellman 协议生成共享密钥。
    Diffie-Hellman概要
    数学家 Whitfield Diffie 和 Martin Hellman 是两位在20世纪70年代致力于公钥技术开发的科学家。他们于1976年发表了Diffie-Hellman协议,该协议至今仍在多种应用中使用。
    与使用非对称加密交换共享密钥不同,Diffie-Hellman是一种密钥协商协议。该协议旨在让参与通信的双方独立生成相同的共享密钥(在以下图表中表示为 SS),用于双方之间的会话。生成共享密钥的过程需要使用私有变量和公共变量,如下图所示:

验证:x mod p=r, 左边代入得 右边代入 二项式展开:
得出
注意:在实际应用场景中,选择的数值会远大于此处的示例。但为便于理解,本例将使用较小的数字。
选择变量
通信双方各自需要选择一些公共变量和一些私有变量。
公共变量:Alice和Bob首先商定两个质数P和g,这些值无需保密。概述如下:
• 质数值 P:出于安全原因,实践中 P 是一个大质数。当今常见 P的使用大于2000位。
• 基数值 g:基数g的值较小,且必须小于P。
出于示例目的,我们选择以下公共变量:
• P=23 g=7
私有变量:Alice和Bob随后各自私下选取两个随机整数(整数),该整数必须小于P。概述如下:
• Alice的私有整数,记作a
• Bob的私有整数,记作b
出于示例目的,我们选择以下私有变量:Alice的a=5,Bob的b=4。
一旦变量选定,即可使用这些变量计算共享密钥。Diffie-Hellman过程使用模运算,其中模是除法后的余数。
计算共享密钥
使用变量,将按以下步骤生成共享密钥:

  1. Alice 计算 并将值A=16807发送给Bob。
  2. Bob 计算 并将值B=2401发送给Alice。
  3. Alice 计算 。
  4. Bob 计算 。
    共享密钥是8。现在双方拥有了相同的共享密钥,双方都可以使用该共享密钥通过对称加密安全地交换数据。
    使用Diffie-Hellman协议有助于确保完美前向保密。一个主要原因是每次会话都可以按需生成新密钥,无需保留公私密钥对。这一强大特性有助于改进数据安全过程,因为它确保即使有人获得了服务器的私钥,也无法破解会话密钥。我们将在第9章“探索 IPsec 和 TLS”中了解更多关于完美前向保密的内容。
    重要的是要理解,Diffie-Hellman算法并非用于加密;其作用是让双方生成相同的共享密钥。如需了解更多,请访问:https://tools.ietf.org/html/rfc2631(中文译文:RFC2631 中文翻译 中文RFC RFC文档 RFC翻译 RFC中文版)。
    一旦公钥密码学使获取共享密钥成为可能,科学家们认为创建标准以确保应用程序之间的互操作性变得非常重要。接下来,我们看看PKCS如何帮助弥合不同供应商与应用程序之间的鸿沟。

概述 PKCS
当行业完全接纳公钥密码学并开始认识到其在各应用程序当中的潜在用途后,一致性的需求便显而易见。20世纪90年代初,RSA安全公司与多位行业领导者共同制定了一套标准。若得到实施,这些标准将实现不同供应商产品之间的互操作性。PKCS最初包含15项标准。然而,随着时间的推移,其中一些标准已被合并到其他标准中,或者已被弃用不再使用。
部分标准包括:
• PKCS #1 定义了 RSA加密标准的规则和结构,包括生成公钥、私钥、数字证书以及数字签名方案。
• PKCS #3 提供了使用 Diffie-Hellman 密钥协商协议的方法论,并对部分参数给出了具体说明,以便生成合适的密钥长度。
• PKCS #10 定义了来自证书颁发机构(CA)的X.509证书的结构。证书必须包含公钥、主题的可分辨名称等组件,并使用CA的数字签名进行验证。注:我们将在第8章“使用公钥基础设施”中了解更多关于 X.509 证书的内容(RFC2986 中文翻译 中文RFC RFC文档 RFC翻译 RFC中文版)。
PKCS不断更新以跟上数据安全标准的当前技术发展。在研究一项标准时,请确保您拥有最新的RFC(Request for Comments)。例如,查看当前PKCS #1 RFC: 8017 地址:https://tools.ietf.org/html/rfc8017 时(中文译文:RFC8017 中文翻译 中文RFC RFC文档 RFC翻译 RFC中文版),在左上角您会看到以下声明:Obsoletes: 3447 (取代: 3447)。当撰写新标准时,RFC会通过声明Obsoleted by: XXX(被XXX取代)来指明其取代的下一版本,其中XXX代表新的标准。
现在我们已了解如何使用非对称加密安全地交换共享密钥,接下来让我们看看生成公私密钥对时的要求。

理解密码学要求
当使用非对称加密时,我们需要一种能够生成数学上相关联的密钥对的算法。在本节中,我们将探讨使用非对称算法的一些密码学要求,查看一个生成密钥对的示例,讨论管理公钥和私钥的重要性,最后介绍非对称加密的一些用途。让我们从生成密钥对的一些要求开始。
设计强算法
坚固物体具有抗破解性,例如坚不可摧的堡垒。加密算法也不例外,我们需要它能抵御暴力破解攻击,并持续提供数据的机密性和完整性。设计强大的非对称算法时的一些考虑因素包括:
• 必须能轻松生成数学上相关联的公私钥对。
• 即使拥有公钥也难以(或不可行)确定私钥。
• 即使拥有公钥也难以(或不可行)在没有私钥的情况下确定明文。
• 任一密钥均可用于加密,而另一方则用于解密,反之亦然。
既然您已理解强算法的参数要求,现在让我们看一个生成密钥对的示例。
生成密钥对
有多个应用程序可用于生成密钥对。然而,为了让您了解真实的公钥和私钥形态,我们将使用PGP在iGolder网站上生成一个密钥对。如果您想同步操作,请访问:https://www.igolder.com/pgp/
进入 iGolder 网站后,您将看到一些选择,如 PGP 密钥生成器、PGP 加密工具和 PGP 解密工具。本次操作请选择 PGP 密钥生成器 (PGP Key Generator)。在该页面,您需要输入以下变量来创建密钥对:
邮箱地址 (Email Address): 输入一个虚构的邮箱地址,这不会影响流程。本次操作我们使用 Roxy@Kiddikatz.com
PGP 密钥口令/密码短语 (PGP-Key Password / Passphrase): 输入一个虚构的密码短语。本次操作我们使用ongetarikettenits。
输入这两个变量后,点击生成PGP密钥。随后您将看到生成的私钥和公钥对。以下就是您可以分享给所有人的公钥!

若想使用此密钥对加密文本,需要将其保存到您的系统中。iGolder网站也提供文本加密功能,可访问:https://www.igolder.com/pgp/encryption/
如您所见,生成密钥对和加密数据非常简便。但如何保存和共享这两个密钥呢?密钥管理是处理非对称加密时的另一重要概念。
如果您想使用密钥对来对文本进行加密,则需要将其保存到您的系统中。iGolder网站也提供了一个功能,您可以通过访问 https://www.igolder.com/pgp/encryption/来加密文本块。
如您所见,生成密钥对和加密数据非常简便。但如何保存和共享您的两个密钥呢?密钥管理是处理非对称加密时的另一重要概念。接下来让我们探讨这个概念。
管理密钥
非对称加密的一个重要概念是拥有两个密钥。如前所述,适用以下原则:
公钥是公开的,所有人都能看到。私钥必须保持私密性。对于网页上的交易,密钥管理由操作系统处理。对于其他用途,例如使用GPG实现邮件安全或在比特币钱包中管理加密货币,则可能需要个人自行管理密钥。接下来我们讨论存储私钥时的一些考量。
存储私钥
个人应保护其私钥免遭泄露或盗用。如果某人的密钥丢失或被盗,可能会引发严重后果,例如:该个体将无法解密使用公钥加密应用程序(如PGP)加密的邮件。恶意方可能访问其数据,或者在某种情况下获取加密货币钱包的内容。因此,任何私钥都需要安全存储。一种选择是使用专用设备,例如通用串行总线(USB)令牌。另一种选择是将密钥存储在智能卡上,并使用指纹等生物识别技术来保护该卡。与必须保密的私钥相反,使用非对称加密时,我们可以自由地与他人共享公钥。让我们概述分发、发布和存储公钥的几种方式。
发布公钥
公钥的设计宗旨是让任何人都能获取。您可以将公钥存储在密钥服务器上、通过电子邮件发送,甚至发布在博客或网站上。例如,PGP的创建者 Phil Zimmermann 在此处发布他的公钥:https://philzimmermann.com/text/PRZ_keys.txt
共享密钥很简单,然而,信任密钥的真实性则是另一重担忧。我们将在本章后面的“信任公钥”部分探讨信任问题。接下来我们介绍非对称加密的一些用途。

使用非对称加密
科学家们在非对称加密发展后不久就意识到,拥有一对密钥进行操作具有强大的功能。多年来,非对称加密已演变为多种用途,包括以下方面:
• 交换共享密钥
• 保护电子邮件
• 生成区块链
• 创建数字签名
当我们思考非对称加密时,会发现它可以用于多种不同的应用场景。然而,我们并不使用非对称加密在网络上传送和接收数据。原因是非对称加密的效率不高。一些非对称算法密钥较长——例如,RSA的密钥长度可在1024到4096位之间。许多人认为,较长的密钥长度在进行数据加密和解密时会影响处理速度。
此外,与对称加密相比,非对称加密更加资源密集型。对称加密通常使用异或 (XOR) 或左循环移位等基础运算;而相比之下,非对称加密使用乘法和除法运算,执行时间可能长达对称加密的1000倍。这就是为什么大多数加密系统采用混合方式,即同时使用对称和非对称加密。现在您已了解使用非对称加密的价值。接下来,让我们看看一些非对称加密算法。

比较公钥算法
我们理解了创建强算法所需的条件,也看到了使用密钥对的价值。在本节中,我们将介绍几种公钥算法,例如RSA和ECC。我们还将了解PGP和GPG如何轻松保障电子邮件安全。最后,我们将讨论使用公钥时确保信任的方法。让我们从概述RSA如何保障数据安全开始。

概述RSA
1977年,Ron Rivest、Adi Shamir 和 Len Adleman 开发了RSA算法,这是一种广为人知并被多种应用采用的加密算法。RSA使用多种加密密钥长度,包括:1024位、2048位和4096位。该算法可用于在对称加密中发送共享密钥,也可用于加密文档和创建数字签名。让我们逐步了解使用RSA计算公私钥的过程。
计算密钥
我们将介绍用于计算密钥的RSA公式。
第一步,算法选择两个大质数:
• 质数:p
• 质数:q
通过将这两个质数相乘计算 N:
• N = p * q
计算 N 的欧拉函数值 φ(N),其公式为:
• φ(N)=(p−1)(q−1)
注意:如果p和q是两个质数,则乘积p∗q的欧拉函数值为:(p-1)*(q-1)。欧拉函数:小于n的正整数中与n互质数的数目。如果n可以分解成2个互质的整数之积,那么n的欧拉函数等于这两个因子的欧拉函数之积。
选择e(公钥),需满足:e > 1 且与 φ(N) 互质。
选择d(私钥),需满足:d*e mod φ(N)=1。
注:选择d时,算法会验证该值。验证方式是将公钥乘以私钥,再将乘积除以欧拉函数值,确保余数为1。了解公式后,让我们使用实际数值计算密钥:
• 质数 p: 167 q: 173
• N = p * q = 28891
• N 的欧拉函数值 φ(N) =28552
• 选择 e(公钥) = 23
• 选择 d(私钥) = 6207
• 加密: 解密:
RSA被认为是一种安全的算法。这是因为破解加密内容极其困难,它要求能够将大质数因式分解还原到其他密钥(通过因式分解N求出p和q,并计算私钥d)。我们保留这一广泛使用的特殊算法;然而,另一种替代方案是ECC。接下来,让我们看看使用ECC涉及到哪些内容。

可视化椭圆曲线
椭圆曲线是一种数学函数,使用公式 ,其中x和y是某个有限域内的整数。曲线的参数是a和b。在标准的二维x,y坐标系中绘图时,a和b的值将创建出曲线,如下图所示:

在上图中,我们看到几个关键要素:
1.若任意绘制一条直线,其与曲线相交的点不会超过三个。
2.处理椭圆曲线密码算法(ECC)时,所有运算都保持在有限域(或最大值)内,该值代表密钥长度。椭圆曲线关于x轴对称。
注:曲线的形状会随a和b的值而改变。在线椭圆曲线生成器请访问:https://www.desmos.com/calculator/ialhd71we3
由于椭圆曲线的对称性,曲线一侧的任意点都可在另一侧找到对称点。如下图所示,点 b与 c、d与 e互为对称点:

每个点代表图上的一个坐标。我们将使用这些点,因为ECC密码方案中的主导运算是点乘法。让我们看看其工作原理。
如图示,曲线内存在多个点(例如b,c,d,e)。在大型椭圆曲线上,点的数量会多得多。起始需要一个基点a(或生成元),它将生成代表私钥的值。生成元将连接到曲线上的另一个点(称为点连接),此过程可重复多次。算法会将生成元(图示为 a)与图中的不同点进行连接。如下图所示,a→b, a→c和a→d的连接方式:

点加操作:A+B=C A+C=D A+D=E

3p+3p=(3p)2=6p 2p+2p+2p=(2p)3=6p 满足交换律 ECDHE密钥交换算法:

您可以将点a与图中存在的任意其他点进行任意次数的连接,但所有连接必须保持在最大值(即域大小)的范围内。ECC中的私钥即是生成元a与图中另一个点进行连接的次数 (n)。由于最大值代表了密钥长度,增大密钥长度会扩展可工作空间。扩展的空间将增加点的数量,并降低他人推导出私钥的可能性。
椭圆加密过程 Q=KP:
1、 选一条椭圆曲线Ep(a,b),并取椭圆曲线上一点作为基点P。
2、 选定一个大数k作为私钥,并生成公钥Q=kP。
3、 加密:选择随机数r,将消息M生成密文C。密文是一个点对,即C=(rP,M+rQ)。
4、 解密:M+rQ-k(rP) =M+r(kP)-k(rP)=M
点加计算:

若 则
若 则
即使知道a的位置以及生成曲线的函数,要找出私钥数值仍极为困难。由于曲线上可能存在天文数字般的点数量,ECC几乎无法被破解。因此,ECC是一种强算法,下文将展开讨论。

提供强算法
ECC诞生于1985年,当时数学家Neal Koblitz和Victor S.Miller提出了使用曲线加密数据的方法。但直到2004年,ECC才真正成为公认的加密算法。
科学家们发现ECC有多项优势,其中之一是它能使用显著更小的密钥长度。相较于RSA密钥长度可能高达4096位,使用384位密钥的ECC已被认为极其安全。更小的密钥带来更高的整体效率和更低的存储需求。当ECC用于TLS证书时,可缩短握手所需时间,最终减少处理开销、加速网页加载并降低带宽要求。这种高效性使ECC成为小型设备(如移动设备、物联网设备及智能卡)的理想选择,这些设备通常处理能力和存储空间有限。
TLS证书,通常也称为SSL证书,是一种数字证书它的核心功能是:
身份认证:证明一个网站(或服务器)的真实身份,防止用户访问到假冒的钓鱼网站。
分发公钥:服务器将包含公钥的TLS证书发送给客户端,客户端(如浏览器)用它来加密数据或验证签名。
当您的浏览器访问一个HTTPS网站时,服务器会将其TLS证书发送给浏览器进行验证。
TLS握手过程:

TLS的握手工作流程如下:

  1. 客户端和服务端打招呼,并将自己支持的TLS版本、加密套件、生成的随机数等发送给服务端
  2. 服务端打招呼,确认支持的TLS版本以及选择的加密套件并且也生成一个随机数给客户端,接着服务端将证书和公钥发送给客户端。
  3. 客户端生成第三个随机数-预主密钥,并将收到的公钥进行加密后再发送。
  4. 收到加密后的预主密钥用自己的私钥进行解密,双方安全的得到预主密钥。
  5. 客户端与服务端用预主密钥和两个随机数计算出会话密钥,后续会话只使用这个会话密钥对数据进行加密,也就是对称加密。
    ECDHE算法是一种基于椭圆曲线的密钥交换算法,优点是每次握手都会生成一个新的密钥,即使有人能够破解一个会话的密钥,也无法用这个密钥破解其他会话的通信,这就是所谓的前向保密性。
    ECC作为保障数据安全的复杂方法正日益普及,它在提供强大的安全保障性的同时,使用的密钥更小。既然我们已了解一些非对称加密算法,接下来让我们看一个应用公钥加密技术的实例——专为保护电子邮件安全而设计的PGP。

PGP
多年来已制定多项法律,要求供应商提供一种方法,允许政府和执法机构访问加密数据。方法包括构建后门或提供解密工具。1991年,美国政府制定了数项法律以允许访问加密数据。作为回应,技术领袖兼远见者菲尔·齐默尔曼(Phil Zimmermann)开发了PGP,使得个人能够控制谁可以查看他们的信息。
PGP是一种非对称加密算法,用于加密和保护电子邮件及文档。PGP提供非对称加密算法的所有功能:密钥交换、加密和数字签名。当在电子邮件客户端中使用PGP时,对用户是透明化操作的。只要通信双方交换了各自的公钥,发送方就能轻松使用公钥对邮件进行加密,而接收方则可以使用其私钥解密该邮件。
逐步讲解过程
Alice需要安全地发送一份文档给Bob。为此,Alice和Bob将使用PGP加密来保护消息,如下图所示:

过程逐步说明如下:

  1. 始于发送方(Alice)处输入明文(数据)。
  2. 使用Bob的公钥和加密算法对明文进行加密。
  3. 将密文发送给接收方(Bob)。
  4. 使用Bob的私钥和解密算法对密文进行解密。
  5. 最终,明文(或数据)呈交给接收方(Bob)。
    PGP最初是免费产品;然而,它现在已成为商业产品。存在替代方案,包括:
    • OpenPGP:其开发旨在本质上与PGP相似,可在此处找到:https://www.openpgp.org/
    • GPG:同样源自PGP标准,可在此处找到:https://gnupg.org/
    上述方案均可用于保护您的电子邮件安全。GPG包含应用程序(例如轻量级电子邮件客户端Claws),让您可以开始使用GPG安全地发送和接收邮件。
    使用PGP和GPG等软件时,您将生成一个公私钥对。您需要与他人共享您的公钥,因为发送和接收邮件时将使用该公钥。恶意行为者可能冒用另一个实体的密钥进行欺骗,使他人误以为该密钥属于他人。我们必须意识到这一点,并理解使用公钥时的一个主要担忧是我们对密钥所赋予的信任级别。接下来我们将讨论这一点。

信任公钥
公钥生成后并不会自动经过认证,也没有人真正知道公钥是否属于指定的人员。因此,用户必须验证其公钥确实归属于自己。如前所述,公钥是公开给所有人的。然而,并没有一种天然的方法能确保该密钥属于将密钥发送给您或共享到密钥服务器的那个人。因此,当在互联网上与实体通信并处理公钥时,我们必须解决的一个重要概念是信任问题。有两种方式解决信任问题:信任网(Web of Trust)和证书(certificates)。接下来我们看看使用公钥时如何利用信任网。

使用信任网
菲尔·齐默尔曼在开发PGP之后引入了信任网。其方法是:我们寻找一个可信任的介绍人(trusted introducer),例如在较小团体中由大家信任的个人来确认公钥是否可信任。
我们使用这个示例:您在薪资部门工作。您的经理告知所有人,本部门将改用GPG进行电子邮件通信。软件安装完毕后,每个人都创建了自己的密钥对,并将各自的公钥发送给经理。然后经理将分配信任级别。
通常,公钥将具有以下信任级别之一:
• 未知(Unknown):密钥起始状态。取决于某人分配更高信任级别的意愿,由他们来更改此状态。
• 不信任(None):不信任此密钥,因为密钥所有者过去签名密钥不正确。
• 有限信任(Marginal):设置为与您远程认识(可能是熟人)的人。
• 完全信任(Full):可以信任此密钥,通常是您自己的密钥或您亲眼见证创建过程的密钥。
信任网在亲密环境中对公钥签名有效,但在更大、不可信的环境中,我们需要另一种选择。接下来我们将讨论在互联网交易中使用证书来确保信任。

使用证书提供信任
在互联网上,我们使用公钥基础设施(Public Key Infrastructure, PKI)。在 PKI中,证书颁发机构(Certificate Authority, CA)生成数字证书,用于在服务器(例如Web服务器)和客户端之间安全分发密钥。签名证书可确保数字交易中每个实体的身份认证。我们将在第 8 章“使用公钥基础设施”中了解更多关于 PKI 的内容。
正如我们所看到的,有一些常见的非对称加密算法,包括RSA、Diffie-Hellman和ECC。还有其他一些算法。在未来几年中,我们很可能会看到更多非对称加密算法的开发,以满足我们不断变化的技术环境的需求。
正如我们所了解到的,非对称加密有若干用途,其中包括创建数字签名。让我们来探讨一下。

使用数字签名
数字签名是一种密码学技术,它利用非对称加密为发送方和接收方提供多种服务。它并非加密整个数字文档,而只加密消息的哈希值,因此其占用空间更小。
在本节中,我们将看到数字签名如何确保消息的认证性、完整性和不可否认性。随后,我们将逐步讲解该过程,以便您了解在创建签名时如何达成所有这些目标。让我们从如何提供三个核心安全服务开始。

提供核心安全服务
由于互联网的广泛匿名性,许多人认为需要有一种以数字格式创建和签署文档的方法。该方法旨在解决能够在互联网上完成交易而无需物理签名或“湿签名”(即某人实体在文件上做标记)的问题。
2000年,美国政府签署生效了《全球和国内商业电子签名法》,使在文件上使用数字签名合法化。数字签名的概念解决了几个问题。其一是它提供消息认证性。接下来我们来讨论这一点。

1.确保认证性
当与互联网上的实体打交道时,保证认证性尤为重要,因为这能让双方确信消息源自授权来源。数字签名通过使用哈希消息认证码(Hashed Message Authentication Code, HMAC)来保证认证性。为创建HMAC,我们使用安全哈希函数(如SHA-256),该函数接受一个可变长度的输入并生成一个固定长度的输出。然后,该哈希值(也称为消息摘要)使用发送方的私钥进行加密,以生成数字签名。一旦接收方获得消息,即使用发送方的公钥解密HMAC。这验证了消息确实来自发送方,而非冒名顶替者。
HMAC:结合散列函数和密钥,使用密钥对消息进行哈希运算,生成固定长度的哈希值。HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC,如果将来设计出新的单向散列函数,也同样可以使用。计算公式:
其中||为连接操作 ipad=00110110(0x36)opad=01011100(0x5c)不断循环直至达到散列函数分组长度
另一个至关重要的服务是消息完整性。让我们看看这是如何实现的。

2.保证完整性
提供消息完整性可确保数据不会以意外或未经授权的方式被篡改、丢失或破坏。HMAC不仅提供消息认证,也用于确保数据完整性。在签署消息之前,会生成文档的哈希值并将其附加到消息中。消息的任何微小变动都会产生一个完全不同的哈希值。接收方收到消息后,会重新生成文档的哈希值,并与消息中附加的哈希值进行比较。若两者相同,则验证消息未被篡改。
数字签名还提供另一项服务:不可否认性。我们来回顾一下这一概念。

3.确保不可否认性
两个人在互联网上完成交易时,很容易伪造电子邮件或声称未发送过某条消息。不可否认性这一概念可防止一方否认曾参与通信。通过使用数字签名,发送方必须使用其私钥对消息进行签名。这一行为确保了不可否认性,因为签名将提供证据,证明消息是由特定实体发送的。
既然我们已经了解了数字签名能提供哪些服务,接下来看看生成数字签名涉及哪些步骤。

创建数字签名
为了创建数字签名,发送方将使用其私钥,如下图所示:

  1. 我们始于发送方(Alice)一侧的消息。
  2. 算法生成消息的哈希值。
  3. 使用 Alice 的私钥和加密算法对哈希值进行加密。
  4. 消息发送给接收方(Bob)。
  5. (签名部分的)哈希值被取出,并使用Alice的公钥和解密算法对其进行解密,这确保了消息认证性。
  6. 算法再次生成消息的哈希值。
  7. 两个哈希值进行比较。如果匹配,我们就能确信完整性未被破坏。
    数字签名可以在远小于加密整个消息的占用空间下,提供认证性和完整性的保证,并防止抵赖。

RSA 数字签名:
Alice签名: Bob验证:
小结
在本章中,我们看到了非对称加密如何解决了在数据交易中安全共享密钥的问题。我们比较了两种实现方法:使用公钥加密或使用密钥协商协议Diffie-Hellman算法。我们还看到了像PKCS这样的标准如何确保不同供应商产品之间的互操作性。
现在,您理解了一些创建强算法所需的要求,以及有效管理公钥和私钥的重要性。我们看到了非对称加密的多种用途,包括密钥交换、保护电子邮件、生成区块链和创建数字签名。
然后我们比较了几种非对称算法,例如RSA、PGP和ECC。我们也认识到在使用公钥时有两种主要方法来提供信任:一种是互联网等大型环境中的证书颁发机构(CA),另一种是办公室等较小环境中的信任网(Web of Trust)。最后,我们了解了公钥加密如何用于创建数字签名,以提供认证性、完整性和不可否认性保障。
在下一章中,您将了解哈希算法是一种单向函数,它接受可变长度的输入并产生固定长度的输出。我们将识别哈希算法的一些理想属性。然后我们将回顾在信任网(Web of Trust)中使用的一些常见哈希算法。

1.___是一种密钥协商协议,其设计目的是让通信双方生成会话中将使用的相同共享密钥。
a. PGP b. Diffie-Hellman
c. GPG d. Rivest Shamir Adleman(RSA)

2.PKCS___定义了来自CA的X.509证书的结构,包含公钥、可识别名称和CA的数字签名等组件。
a. #1 b. #5
c. #7 d. #10

3.___支持多种加密密钥长度,包括1024位、2048位和4096位。
a. DES b. ECC
c. RSA d. AES

4.大多数加密系统属于___类型,同时采用对称和非对称加密技术。
a. 混合型(hybrid) b. ElGamal
c. 公钥 d. 椭圆曲线

5.在ECC加密算法中,主要运算是___乘法。
a. Diffie b. ElGamal
c. 点 d. 证书

6.___通过在亲密环境中为公钥分配信任级别来发挥作用。
a. 认证海洋 b. ElGamal
c. 点状系统 d. 信任网(Web of Trust)

7.数字签名通过使用___来确保认证。
a. 点状系统 b. HMAC
c. RSA芯片 d. 椭圆曲线芯片