​一篇关于密码学的概念性文章(上)

道!

公众号一篇文章只能5w字,所以只能分两篇。

有没有讲清楚的,有感兴趣想了解的,有遗漏的,敬请留言或者私信。

​一篇关于密码学的概念性文章(上)

1. 引言

在20世纪90年代初,当商业互联网还处于起步阶段时,大多数用户都非常重视安全性。许多人认为增加安全性只是为偏执的人提供安慰,而大多数计算机专业人士意识到安全性提供了我们所有人都需要的一些非常基本的保护。

当时,面向大众的密码学几乎不存在,当然也不是共同讨论的话题。到了世纪之交,互联网在规模和重要性上都有了增长,以至于它成为了全球数十亿人之间基本通信的提供者,是商业、社交互动和越来越多个人信息交换的无处不在的工具——我们甚至有了一种以密码学命名的货币!

安全性和隐私对许多应用程序都有影响,范围从安全的商业和支付到私人通信和保护医疗保健信息。

安全通信的一个基本方面是密码学。但必须注意的是,虽然密码学对确保通信安全极为关键,但它本身并不足以提供全面的安全保障。因此,读者应当理解,本文所讨论的主题仅是实现更高安全级别的众多措施中的第一步。

免责声明:本教程中提到了一些公司、产品和服务。除非另有明确说明,否则此类提及仅作为示例目的,不应被视为作者的推荐或认可。


2. 加密学基本概念

加密学—秘密写作的科学—是一门古老的艺术;最早的加密学文献使用可以追溯到大约公元前1900年,当时一位埃及抄写员在铭文中使用了非标准的象形文字。

一些专家认为,加密学是在写作发明后不久自发出现的,其应用范围从外交信函到战时作战计划。

因此,随着计算机通信的广泛发展,新的加密学形式很快出现也就不足为奇了。在数据和电信中,当通过任何不可信的介质(包括几乎所有的网络,尤其是互联网)进行通信时,都需要加密。

加密学有五个主要功能:

  1. 隐私/保密性:确保除了预期的接收者之外,没有人能够阅读消息。
  2. 认证:证明一个人身份的过程。
  3. 完整性:确保接收者收到的消息与原始消息没有任何改变。
  4. 不可否认性:一种机制,用于证明发送者确实发送了此消息。
  5. 密钥交换:发送者和接收者之间共享加密密钥的方法。

在加密学中,我们从未加密的数据开始,称为明文。明文被加密成密文,反过来(通常)密文将被解密回可用的明文。加密和解密基于所使用的加密方案类型和某种形式的密钥。对于喜欢公式的人来说,这个过程有时被写成:

​一篇关于密码学的概念性文章(上)

其中 ( P = ) 明文,( C = ) 密文,( E = ) 加密方法,( D = ) 解密方法,( k = ) 密钥。

鉴于此,加密可能还有其他一些功能,以及其他一些术语可能会听到:

  • 前向保密(又名完美前向保密):此功能可保护过去的加密会话免受泄露,即使存储消息的服务器被泄露。这是通过为每个会话创建不同的密钥来实现的,以便泄露一个密钥不会威胁到整个通信的安全性。
  • 完美安全:一个系统是牢不可破的,密文不会传达任何关于明文或密钥的信息。要实现完美安全,密钥必须至少和明文一样长,使分析甚至暴力攻击变得不可能。一次性密码本就是这样的一个系统。
  • 可否认认证(又名消息否认):一种方法,确保消息交换的参与者可以确信消息的真实性,但以发送者可以后来向第三方合理否认其参与的方式。

在以下的许多描述中,两个通信方将被称为Alice和Bob;这是加密领域的常见术语,以便于识别通信方。如果有第三和第四方参与通信,他们将分别被称为Carol和Dave。恶意方被称为Mallory,窃听者被称为Eve,可信第三方被称为Trent。

3. 加密算法的类型

加密算法有多种分类方式。为了本文的目的,它们将根据用于加密和解密的密钥数量进行分类,并根据它们的应用和使用进一步定义。本文将讨论的三种类型的算法是(见图1):

  • 对称密钥加密(SKC):对称密钥加密使用单个密钥进行加密和解密;也称为对称加密。主要用于隐私和保密。
  • 非对称密钥加密(PKC):非对称密钥加密使用一个密钥进行加密,另一个密钥进行解密;也称为非对称加密。主要用于认证、不可否认性和密钥交换。
  • 哈希函数:使用数学转换对信息进行不可逆的“加密”,提供数字指纹。主要用于消息完整性。
​一篇关于密码学的概念性文章(上)
图1:三种密码学类型:秘密密钥、公钥和哈希函数。

3.1 对称密钥加密(SKC)

对称密钥密码学方法使用单一密钥进行加密和解密。如图1A所示,发送者使用密钥对明文进行加密,并将密文发送给接收者。接收者应用相同的密钥对消息进行解密,恢复明文。因为加密和解密功能都使用单一密钥,所以秘密密钥密码学也称为对称加密

​一篇关于密码学的概念性文章(上)​一篇关于密码学的概念性文章(上)

在这种密码学形式中,很明显密钥必须为发送者和接收者所知;事实上,这就是对称。当然,这种方法的最大困难在于密钥的分发(稍后在讨论公钥密码学时会详细介绍)。

对称密钥密码学方案通常被归类为流密码块密码流密码每次操作单个比特(字节或计算机字)并实现某种形式的反馈机制,以便密钥不断变化。流密码有几种类型,但这里值得提及两种(见图2)。

自同步流密码计算密钥流中的每个比特,作为密钥流中前n个比特的函数。之所以称为“自同步”,是因为解密过程仅通过知道它在n位密钥流中的位置,就能与加密过程保持同步。一个问题是错误传播;传输中的一个混乱比特将导致接收端的n个混乱比特。

同步流密码以与消息流无关的方式生成密钥流,但在发送者和接收者处使用相同的密钥流生成函数。虽然流密码不会传播传输错误,但它们本质上是周期性的,因此密钥流最终会重复。

好的,来白话的讲讲自同步流密码同步流密码

自同步流密码

想象你正在用一个特殊的密码本给朋友发秘密消息。这个密码本很特别,它里面的密码(也就是密钥流)是根据你已经用过的前n个密码字符来决定的。

  • 如何工作:比如,你决定每次用一个新密码字符时,都看看前面n个字符是什么,然后根据这n个字符来生成下一个密码字符。这样,每次发送消息时,密码都是动态生成的,非常安全。

  • 为什么叫“自同步”:如果你的朋友在接收消息时,不小心漏掉了一个字符或者读错了一个字符,他只需要知道自己在n个字符密码流中的位置,就可以重新同步回来,继续正确解密接下来的消息。就像你在听一首熟悉的歌,即使错过了一句,也能很快跟上节奏。

  • 错误传播问题:但是,如果漏掉或读错了一个字符,接下来的n个字符解密都会出错,因为每个新字符都是基于前n个字符生成的。这就像你在织毛衣时,如果错了一针,接下来的几针都可能跟着错。

同步流密码

再想象一下,这次你有一个更简单的密码本,密码本的密码生成和消息内容无关,而是按照一个固定的规则来生成的。你和你的朋友都知道这个规则。

  • 如何工作:比如,你们约定好,每次发送消息时,都按照一个特定的数学函数来生成密码。这个函数可能是基于时间、日期,或者是一个你们都知道的复杂公式。这样,无论消息内容是什么,密码都是按照这个函数来生成的。

  • 不会传播错误:这次,如果接收消息时漏掉或读错了一个字符,不会影响接下来字符的解密,因为每个密码字符的生成都是独立的,不依赖于前面的字符。

  • 周期性问题:不过,这种密码本有一个问题,就是它是周期性的。因为密码是按照一个固定的规则生成的,所以总有一天,这个规则会重复,密码也会重复。就像一首循环播放的歌,总有一天会从头开始播放。

块密码之所以这样称呼,是因为该方案一次加密一个固定大小的数据块。在块密码中,给定的明文块在使用相同的密钥时总是加密成相同的密文(即,它是确定性的),而相同的明文在流密码中会加密成不同的密文。块加密算法最常见的结构是Feistel密码,以密码学家Horst Feistel(IBM)的名字命名。如图3所示,Feistel密码结合了替代、置换(置换)和密钥扩展的元素;这些特性在密码中创造了大量的“混乱和扩散”(根据Claude Shannon)。

​一篇关于密码学的概念性文章(上)
图3:Feistel密码。(来源:维基共享资源)

用简单易懂的语言来解释块密码Feistel密码

想象一下,你正在给一个朋友发送秘密信息,但你不想让别人知道你在说什么。于是,你决定把信息分成一小块一小块地发送,每次只加密一小块。这种“一小块一小块”地加密信息的方式,就是我们所说的块密码

  • 为什么叫块密码:因为它每次只处理一个固定大小的数据块。就像你切蛋糕一样,每次只切一块固定大小的蛋糕。

  • 确定性:在块密码中,如果你用相同的密钥加密相同的明文块,那么每次得到的密文都是一样的。这就像你用同一个模具做蛋糕,每次做出来的蛋糕形状都是一样的。

  • 与流密码的区别:流密码则是像流水一样,连续不断地加密信息,每次加密的结果都可能不同,即使加密的是相同的信息。而块密码则是每次加密一个固定的块,结果是一致的。

现在,我们来说说Feistel密码,这是一种非常常见的块加密算法结构。

  • 命名由来:Feistel密码是以密码学家Horst Feistel(他曾在IBM工作)的名字命名的。

  • 结构特点:Feistel密码结合了替代、置换(也就是重新排列)和密钥扩展的元素。替代就像是把字母A替换成字母B,置换就像是把字母的顺序打乱,而密钥扩展则是用某种方式把密钥变得更长或更复杂。

  • 混乱和扩散:Feistel密码的设计目的是在加密过程中创造大量的“混乱和扩散”。混乱是指让加密后的信息看起来毫无规律,让人难以猜测原始信息。扩散则是指把原始信息的影响扩散到整个加密后的信息中,这样即使只改变原始信息的一小部分,加密后的信息也会有很大的变化。

  • 图3:图3展示了Feistel密码的基本结构。虽然具体的实现细节可能很复杂,但基本思想就是通过替代、置换和密钥扩展来创造混乱和扩散,从而保护信息的安全性。

Feistel设计的一个优点是加密和解密阶段相似,有时甚至相同,只需要反转密钥操作,从而大大减少了在软件或硬件中实现密码所需的代码或电路的规模。Feistel早期描述这种操作的一篇论文是“密码学和计算机隐私”(Scientific American,1973年5月,228(5),15-23)。

块密码可以以几种模式之一操作;以下是最重要的:

  • 电子密码本(ECB)模式是最简单、最明显的应用:使用密钥对明文块进行加密,形成密文块。因此,两个相同的明文块将总是生成相同的密文块。ECB容易受到各种暴力攻击(因为相同的明文块总是加密成相同的密文),以及删除和插入攻击。此外,密文传输中的一个比特错误会导致整个解密后的明文块出错。
​一篇关于密码学的概念性文章(上)
  • 密码块链接(CBC)模式在加密方案中增加了一个反馈机制;在加密之前,明文与前一个密文块进行异或(XOR)操作,以便两个相同的明文块会以不同的方式加密。虽然CBC可以抵御许多暴力、删除和插入攻击,但密文中的单个比特错误会导致解密后的明文块中的整个块错误,以及下一个解密后的明文块中的比特错误。
​一篇关于密码学的概念性文章(上)
  • 密码反馈(CFB)模式是将块密码实现为自同步流密码。CFB模式允许以小于块大小的单位对数据进行加密,这在某些应用中可能是有用的,例如加密交互式终端输入。例如,如果我们使用一字节CFB模式,每个传入的字符被放置到与块大小相同的移位寄存器中,加密,然后传输该块。在接收端,密文被解密,块中的额外比特(即,超出一字节的所有内容)被丢弃。CFB模式基于前一个密文生成密钥流(初始密钥来自初始化向量[IV])。在这种模式下,密文中的单个比特错误会影响当前块和下一个块。
​一篇关于密码学的概念性文章(上)
  • 输出反馈(OFB)模式是将块密码实现为概念上类似于同步流密码的块密码。OFB通过使用内部反馈机制生成独立于明文和密文比特流的密钥流,防止相同的明文块生成相同的密文块。在OFB中,密文中的单个比特错误会导致解密后的明文中的单个比特错误。
​一篇关于密码学的概念性文章(上)
  • 计数器(CTR)模式是块密码的一个相对较新的补充。像CFB和OFB一样,CTR模式以流密码的方式操作块;像ECB一样,CTR模式独立操作块。然而,与ECB不同,CTR对不同的块使用不同的密钥输入,以便两个相同的明文块不会产生相同的密文。最后,每个密文块在加密消息中有特定的位置。因此,CTR模式允许块并行处理——从而在并行处理和多个处理器可用时提供性能优势——但不会受到ECB的暴力、删除和插入攻击的影响。
​一篇关于密码学的概念性文章(上)

今天在使用的对称密钥密码学算法—或者,至少是重要的,即使没有在使用——包括:

  • 数据加密标准(DES):最知名和研究最深入的秘密密钥密码学方案之一,DES由IBM在20世纪70年代设计,并由国家标准局(NBS)[现为国家标准技术研究所(NIST)]在1977年采用,用于商业和非机密政府应用。DES是一种Feistel块密码,使用56位密钥操作64位块。DES有一套复杂的规则和转换,专门设计用于快速硬件实现和慢速软件实现,尽管这一点今天并不重要,因为计算机处理器的速度比二十年前快了几个数量级。DES在某种程度上是基于Feistel早期的一种密码,称为Lucifer,一些来源报道,它有112位密钥。这被拒绝了,部分是为了将算法适应到一个芯片上,部分是因为国家安全局(NSA)。NSA还提出了一些对DES的调整,许多人认为是为了削弱密码;然而,20世纪90年代的分析表明,NSA的建议实际上加强了DES,包括通过改变S盒的设计移除了一个数学后门(见Bruce Schneier的“DES的遗产”[2004])。2021年4月,NSA解密了一篇有趣的历史论文,标题为“NSA走出壁橱:因曼时代公共密码学的辩论”,发表在1996年春季的Cryptologic Quarterly上。

    DES在《美国国家标准X3.92》和三项联邦信息处理标准(FIPS)中定义,所有这些都在2005年被撤回:

    关于DES、3DES和DESX的更多细节后面会聊聊。

    • 三重DES(3DES):一种DES变体,使用多达三个56位密钥,并对块进行三次加密/解密;3DES也在FIPS PUB 46-3中描述,并在20世纪90年代末和21世纪初作为DES的临时替代品。
    • DESX:由Ron Rivest设计的变体。通过在加密前将64个额外的密钥位组合到明文中,有效地将密钥长度增加到120位。

    • FIPS PUB 46-3:DES(归档文件)

    • FIPS PUB 74:实施和使用NBS数据加密标准的指南

    • FIPS PUB 81:DES操作模式 关于DES漏洞的信息可以从电子前沿基金会获得。两个重要的变体加强了DES:

  • 高级加密标准(AES):1997年,NIST启动了一个非常公开的、4年半的过程,为美国政府应用开发一个新的安全密码系统(与25年前采用DES的非常封闭的过程相反)。结果,高级加密标准在2001年12月成为DES的官方继任者。AES使用一种称为Rijndael的秘密密钥方案,这是一种由比利时密码学家Joan Daemen和Vincent Rijmen设计的块密码。该算法可以使用可变块长度和密钥长度;最新的规范允许任何组合的128、192或256位密钥长度和128、192或256位块长度。NIST最初在2000年10月选择了Rijndael,正式采用作为AES标准是在2001年12月。FIPS PUB 197描述了一个使用128、192或256位密钥的128位块密码。AES也是NESSIE批准的协议套件的一部分。(另见表3中的CRYPTEC和NESSIE项目条目)。

    AES过程和Rijndael算法也会在后面描述。

  • CAST-128/256:CAST-128(又名CAST5),在请求评论(RFC)2144中描述,是一种类似DES的替代置换密码算法,使用128位密钥操作64位块。CAST-256(又名CAST6),在RFC 2612中描述,是CAST-128的扩展,使用128位块大小和可变长度(128、160、192、224或256位)密钥。CAST以其开发者Carlisle Adams和Stafford Tavares的名字命名,并在国际上可用。CAST-256是AES过程中第一轮算法之一。

  • 国际数据加密算法(IDEA):由Xuejia Lai和James Massey编写的秘密密钥密码系统,于1992年获得Ascom专利;是一个使用128位密钥的64位SKC块密码。

  • Rivest密码(又名Ron的密码):以Ron Rivest的名字命名的一系列SKC算法。

    • RC1:在纸上设计但从未实现。
    • RC2:一个64位块密码,使用可变大小的密钥,旨在替代DES。它的代码没有公开,尽管许多公司已经获得许可在他们的产品中使用RC2。在RFC 2268中描述。
    • RC3:在开发过程中被发现是可破解的。
    • RC4:一个使用可变大小密钥的流密码;它在商业密码产品中广泛使用。RC4的一个更新版本,称为Spritz(另见这篇文章),由Rivest和Jacob Schuldt设计。关于RC4(和一点Spritz)的更多细节可以在第5.13节下找到。
    • RC5:一个块密码,支持多种块大小(32、64或128位)、密钥大小和对数据的加密次数。在RFC 2040中描述。
    • RC6:一个基于RC5的128位块密码,是对RC5的改进;RC6是AES第二轮算法之一。
  • Blowfish:由Bruce Schneier发明的对称64位块密码;针对32位处理器和大容量数据缓存进行了优化,它在Pentium/PowerPC级机器上的速度明显快于DES。密钥长度可以从32位变化到448位。Blowfish可以免费使用,旨在替代DES或IDEA,已经在许多产品中使用。

  • Twofish:一个使用128、192或256位密钥的128位块密码。旨在高度安全和高度灵活,非常适合大型微处理器、8位智能卡微处理器和专用硬件。由Bruce Schneier领导的团队设计,并是AES过程中第二轮算法之一。

  • Threefish:一个大区块密码,支持256、512和1024位区块和与区块大小相匹配的密钥大小;根据设计,区块/密钥大小可以以128位的增量增长。Threefish只使用XOR操作、加法和64位字的旋转;设计理念是,采用许多计算上简单的轮次的算法比采用高度复杂——尽管数量较少——的轮次的算法更安全。Threefish的规范是Skein哈希函数家族文档的一部分。

  • Anubis:Anubis是由Rijndael设计者之一Vincent Rijmen共同设计的块密码。Anubis是一个块密码,对128位区块执行替代置换操作,并使用128到3200位(以32位增量)的密钥。Anubis的工作方式非常像Rijndael。尽管提交给了NESSIE项目,但它没有被最终纳入。

  • ARIA:一个使用128、192和256位密钥的128位块密码,根据密钥大小,在12、14和16轮中加密128位区块。由来自韩国学术机构、研究所和联邦机构的大量研究人员在2003年开发,并随后被命名为国家标准。在RFC 5794中描述。

  • Camellia:一个由日本电信电话公司(NTT)和三菱电机公司(MEC)于2000年共同开发的密钥密码块密码算法。Camellia与AES有一些共同的特点:128位块大小,支持128、192和256位密钥长度,适合在常见的32位处理器以及8位处理器(例如,智能卡、密码硬件和嵌入式系统)上进行软件和硬件实现。也在RFC 3713中描述。Camellia在IPsec中的应用在RFC 4312中描述,在OpenPGP中的应用在RFC 9580中描述。Camellia是NESSIE协议套件的一部分。

  • CLEFIA:在RFC 6114中描述,CLEFIA是一个使用128、192和256位密钥长度(与AES兼容)的128位块密码。CLEFIA算法最初由索尼公司在2007年发布。CLEFIA是在AES之后设计的新一代轻量级块密码算法之一,提供高性能的软件和硬件实现,以及在硬件中的轻量级实现。

  • FFX-A2和FFX-A10:FFX(格式保持、基于Feistel的加密)是一种格式保持加密(FPE)方案,设计使得密文与明文具有相同的格式。FPE方案用于加密社会安全号码、信用卡号码、有限大小的协议流量等;这意味着,例如,一个加密的社会安全号码仍然是一个九位数字字符串。FFX理论上可以加密任意长度的字符串,尽管它旨在用于小于AES-128(2128点)的消息大小。FFX版本1.1规范描述了FFX-A2和FFX-A10,它们旨在用于8-128位二进制字符串或4-36位十进制字符串。

  • GSM(全球移动通信系统,最初为Groupe Spécial Mobile)加密:GSM移动电话系统使用几种流密码进行空中通信隐私。A5/1是在1987年为欧洲和美国使用而开发的,A5/2是在1989年开发的,是一个更弱的算法,打算在欧洲和美国之外使用。然而,在1994年“秘密”规格泄露后,两个密码都被发现存在重大缺陷,A5/2已经停止使用。最新版本A5/3使用了KASUMI块密码。注意:不幸的是,尽管A5/1已经被反复“破解”(例如,参见2009年的“秘密代码保护手机通话放松”和2011年的“手机窃听现在比以往任何时候都更容易、更便宜”),但这种加密方案仍然被广泛使用,甚至在3G和4G移动电话网络中。据报道,这种方案的使用是国家安全局(NSA)能够轻松解码移动电话网络上的语音和数据通话的原因之一。

  • GPRS(通用分组无线服务)加密:GSM移动电话系统使用GPRS进行数据应用,GPRS使用多种加密方法,提供不同级别的数据保护。GEA/0根本不提供加密。GEA/1和GEA/2是专有的流密码,分别使用64位密钥和96位或128位状态。GEA/1和GEA/2目前被网络服务提供商最广泛使用,尽管两者都被报道破解。GEA/3是一个使用64位密钥的128位块密码,被一些运营商使用;GEA/4是一个使用128位密钥的128位时钟密码,但尚未部署。

  • KASUMI:一个使用128位密钥的块密码,是第三代合作伙伴计划(3gpp,原名通用移动电信系统UMTS)的一部分。KASUMI是新兴移动通信系统中消息内容和信令数据的机密性和完整性算法。

  • KCipher-2:在RFC 7008中描述,KCipher-2是一个使用128位密钥和128位初始化向量的流密码。使用简单的算术操作,该算法通过高效的实现提供快速的加密和解密。KCipher-2已用于工业应用,特别是日本移动健康监控和诊断服务。

  • KHAZAD:KHAZAD是一个所谓的传统块密码,操作64位块,类似于旧的块密码如DES和IDEA。KHAZAD使用八轮替代和置换,使用128位密钥。

  • KLEIN:设计于2011年,KLEIN是一个轻量级、64位块密码,支持64、80和96位密钥。KLEIN是为高度资源受限的设备(如无线传感器和RFID标签)设计的。

  • 轻量级加密设备(LED):设计于2011年,LED是一个轻量级、64位块密码,支持64和128位密钥。LED是为RFID标签、传感器网络以及其他内存或计算能力受限的设备设计的。

  • MARS:MARS是由IBM开发的块密码,是AES开发过程中的五个最终候选算法之一。MARS使用128位块和128到448位的可变密钥长度。MARS文件强调了算法设计的高速、高安全性,以及在各种计算设备上有效实现该方案的能力。

  • MISTY1:在三菱电机公司开发,是一个使用128位密钥和64位块的块密码,以及可变数量的轮次。为硬件和软件实现而设计,并且对差分和线性密码分析有抵抗力。在RFC 2994中描述,MISTY1是NESSIE套件的一部分。

  • Salsa和ChaCha:Salsa20是由Daniel Bernstein为eSTREAM项目提出的流密码。Salsa20使用基于32位(整个词)加法、按位加法(XOR)和旋转操作的伪随机函数,即加-旋转-异或(ARX)操作。Salsa20使用256位密钥,尽管也存在128位密钥变体。2008年,Bernstein发表了ChaCha,一个与SSalsa20相关的新密码家族。ChaCha20最初在RFC 7539中定义(现已废止),与Poly1305认证器一起被互联网工程任务组(IETF)协议采用,最著名的是用于IPsec和互联网密钥交换(IKE),根据RFC 7634,以及传输层安全(TLS),根据RFC 7905。2014年,谷歌采用了ChaCha20/Poly1305用于OpenSSL,它们也是OpenSSH的一部分。RFC 8439取代了RFC 7539,并为ChaCha20密码和Poly1305消息认证代码提供了实现指南,以及结合的CHACHA20-POLY1305带关联数据的认证加密(AEAD)算法。

  • 安全快速加密例程(SAFER):由James Massey设计的一系列块密码,用于软件实现,使用64位块。1993年发布的SAFER K-64使用了64位密钥,1994年发布的SAFER K-128使用了128位密钥。在发现弱点后,发布了新版本,分别使用40、64和128位密钥的SAFER SK-40、SK-64和SK-128。1998年的SAFER+使用了128位块,是AES项目的不成功候选者;2000年的SAFER++提交给了NESSIE项目。

  • SEED:一个使用128位块和128位密钥的块密码。由韩国信息安全局(KISA)开发,并被采纳为韩国国家标准加密算法。也在RFC 4269中描述。

  • Serpent:Serpent是AES最终候选算法之一。Serpent支持128、192或256位密钥和128位块大小,是一个32轮替代-置换网络,操作一个由四个32位字组成的块。Serpent开发人员在算法设计中选择了高安全边际;他们确定16轮足以对抗已知攻击,但为了未来证明算法,需要32轮。

  • SHACAL:SHACAL是一对基于安全哈希算法(SHA)的块密码,SHA本质上是一个压缩算法。作为哈希函数,SHA反复调用压缩方案来改变数据块的状态。虽然SHA(像其他哈希函数一样)是不可逆的,但通过维护适当的状态信息,压缩函数可以用于加密。SHACAL-1基于SHA-1,使用160位块大小,而SHACAL-2基于SHA-256,使用256位块大小;两者都支持从128到512位的密钥大小。SHACAL-2是NESSIE块密码之一。

  • Simon和Speck:Simon和Speck是NSA在2013年提出的一对轻量级块密码,为高度受限的软件或硬件环境设计。(例如,根据规范,AES需要2400个门等效,而这些密码需要不到2000个。)虽然两个密码家族在硬件和软件中都表现良好,但Simon针对硬件设备进行了高性能优化,Speck针对软件性能进行了优化。两者都是Feistel密码,并支持十种块和密钥大小组合:

  • Skipjack:与Clipper芯片一起提出的SKC方案,作为从未实施的Capstone项目的一部分。尽管算法的细节从未公开,但Skipjack是一个使用80位密钥和每个64位块32次迭代周期的块密码。由NIST和NSA提出的Capstone作为公共和政府使用的标准的项目,遭到了密码学界的强烈反对,主要是因为Skipjack的设计是分类的(加上Clipper芯片的密钥托管要求)。

  • SM4:以前称为SMS4,SM4是一个使用128位密钥和32轮处理一个块的128位块密码。2006年解密后,SM4用于中国国家标准无线局域网(LAN)认证和隐私基础设施(WAPI)。SM4曾是电气和电子工程师协会(IEEE)802.11i标准关于无线局域网安全机制的提议密码,但尚未被IEEE或国际标准化组织(ISO)接受。SM4在《无线网络SMS4加密算法》(由Whitfield Diffie和George Ledin翻译,2008年)中有描述,并在SM4(密码)页面上。SM4由中国国家密码管理局发布为GM/T 0002-2012:SM4(2012)。

  • 微小加密算法(TEA):由Roger Needham和David Wheeler开发的一系列块密码。TEA最初于1994年开发,使用128位密钥、64位块和64轮操作。为了纠正TEA中的某些弱点,1997年发布了扩展TEA(XTEA),又名Block TEA。为了纠正XTEA中的弱点并增加多功能性,1998年发布了修正块TEA(XXTEA)。XXTEA也使用128位密钥,但块大小可以是32位字的任何倍数(最小块大小为64位,或两个词),轮数是块大小的函数(~52+6*words),如表1所示。

​一篇关于密码学的概念性文章(上)
表1. Tiny Encryption Algorithm (TEA) 选项。
  • TWINE:由NEC工程师在2011年设计,TWINE是一个轻量级、64位块密码,支持80和128位密钥。TWINE的设计目标包括在硬件实现中保持小的占用空间(即,少于2000个门等效)和在软件实现中的小内存消耗。

3.2 公钥密码学

公钥密码学-非对称算法

公钥密码学被认为是过去300-400年来密码学领域最重要的新发展。现代公钥密码学(PKC)最初由斯坦福大学的教授马丁·赫尔曼(Martin Hellman)和他的研究生惠特菲尔德·迪菲(Whitfield Diffie)在1976年公开描述。他们的论文描述了一个双密钥加密系统,在这个系统中,两方可以在不安全的通信信道上进行安全通信,而不需要共享秘密密钥。

公钥密码学依赖于所谓的单向函数的存在,或数学函数,这些函数容易计算,而它们的逆函数相对难以计算。

让我给你两个简单的例子:

  1. 乘法与因式分解:假设你有两个质数,3和7,你需要计算它们的乘积;几乎不需要时间就可以计算出那个值,即21。现在假设,相反,你有一个是两个质数乘积的数,21,你需要确定那些质数因子。你最终会找到解决方案,但是与计算乘积只需要几毫秒相比,因式分解将需要更长的时间。如果我们从大约有400位数字的质数开始,问题将变得更加困难,因为乘积将有大约800位数字。

  2. 指数运算与对数:假设你将数字3提升到6次方;同样,计算[3^6 = 729]相对容易。但是如果你从数字729开始,需要确定两个整数x和y,使得[log_x 729 = y],找到这两个值将需要更长的时间。

虽然上述例子是微不足道的,但它们确实代表了公钥密码学中使用的两对功能,即乘法和指数运算的容易性与因式分解和计算对数的相对困难性。公钥密码学中的数学“技巧”是找到一个单向函数的陷阱门,使得在知道某些信息的情况下,逆计算变得容易。

通用的公钥密码学使用两个数学上相关的密钥,尽管知道其中一个密钥但不允许某人轻易地确定另一个密钥。一个密钥用于加密明文,另一个密钥用于解密密文。这里的重要一点是,应用哪个密钥并不重要,但两个密钥都需要才能使过程工作(见图1B)。因为需要一对密钥,这种方法也被称为非对称加密

在公钥密码学中,其中一个密钥被指定为公钥,可以像所有者希望的那样广泛地公布。

另一个密钥被指定为私钥,永远不会透露给另一方。

在这个方案下发送消息是直接的。假设爱丽丝想给鲍勃发送一条消息。爱丽丝使用鲍勃的公钥加密一些信息;鲍勃使用他的私钥解密密文。这种方法也可以用于证明谁发送了一条消息;例如,爱丽丝可以使用她的私钥加密一些明文;当鲍勃使用爱丽丝的公钥解密时,他知道爱丽丝发送了消息(认证)并且爱丽丝不能否认发送了消息(不可否认性)。

今天用于密钥交换或数字签名的公钥密码学算法包括:

  • RSA:这是第一个也是最常用的公钥加密算法,它的名字来源于麻省理工学院的三位数学家——罗纳德·李维斯特、阿迪·沙米尔和伦纳德·阿德曼,正是他们开发了这种算法。现在,RSA被广泛应用于各种软件中,可以用来交换密钥、制作数字签名或加密小块数据。RSA的加密块和密钥大小都可以调整。要生成RSA密钥对,我们需要一个非常大的数字n,这个数字是由两个按照特定规则选择的质数相乘得到的。这两个质数可能都有100位或更多位数,所以得到的n的位数大约是质因数的两倍。公钥信息包括n和n的一个因数的某种变形。攻击者仅凭这些信息是无法找出n的质因数(也就是私钥)的,这就是RSA算法如此安全的原因。

(有些人误以为RSA的安全性在于分解大质数的难度,这其实是个误会。事实上,无论是大质数还是小质数,都只有两个因数!)现在,计算机分解大数的能力越来越强,像RSA这样的加密算法也面临着越来越大的挑战。但是,如果我们用两个大小相近的质数来生成一个大数,那么目前就没有什么算法能在短时间内找到这两个质因数。比如,2005年,人们花了一年半的时间和50多年的计算量才分解了一个200位数的质因数。2009年,克莱因容格等人报告说,他们用两年的时间,动用了数百个系统,才分解了一个768位(232位数)的RSA-768模数。他们估计,分解一个1024位的RSA模数可能需要一千倍的时间。尽管如此,他们还是建议在2013年前逐步淘汰1024位的RSA。(您可以查阅维基百科上的“整数分解”条目了解更多信息。)不过,RSA的一个优势是,用户可以轻松增加密钥大小,从而保持算法的安全性。另外,RSA的专利在2000年9月就已经到期了,但这似乎并没有影响RSA的受欢迎程度。关于RSA的详细示例,我将在后面介绍。

  • Diffie-Hellman:在RSA算法发布后,Diffie和Hellman提出了他们自己的算法。Diffie-Hellman仅用于秘密密钥密钥交换,不用于认证或数字签名。

  • 数字签名算法(DSA):在NIST的数字签名标准(DSS)中指定的算法,为消息认证提供数字签名功能。在FIPS PUB 186-4中描述。

  • ElGamal:由Taher Elgamal设计,ElGamal是一个类似于Diffie-Hellman的公钥密码学系统,用于密钥交换。ElGamal在一些较新版本的Pretty Good Privacy (PGP)以及GNU Privacy Guard (GPG)和其他密码系统中使用。

  • 椭圆曲线密码学(ECC):基于椭圆曲线的公钥密码学算法。ECC可以在小密钥的情况下提供与RSA和其他公钥密码学方法相当的安全级别。它是为了具有有限计算能力或/和内存的设备设计的,如智能卡和PDAs。参考资料包括Certicom的椭圆曲线密码学页面和在线ECC教程页面。另见RFC 6090,用于回顾基本的ECC算法,以及椭圆曲线数字签名算法(ECDSA),了解ECC用于数字签名的详细信息。

  • 基于身份的加密(IBE):IBE是Adi Shamir在1984年首次提出的一个新颖方案。它是一个基于公钥密码学的密钥认证系统,公钥可以从基于用户身份的唯一信息中派生出来,允许两个用户在没有事先关系的情况下交换加密消息。在2001年,Dan Boneh(斯坦福大学)和Matt Franklin(加州大学戴维斯分校)基于椭圆曲线和一个称为Weil配对的数学结构,开发了一个实用的IBE实现。同年,Clifford Cocks(GCHQ)也描述了另一种基于复合群中二次剩余的IBE解决方案。RFC 5091:基于身份的密码学标准(IBCS)#1描述了使用Boneh-Franklin(BF)和Boneh-Boyen(BB1)基于身份的加密的IBE实现。关于基于身份的加密的更多细节可以在下面的第5.16节中找到。

  • 公钥密码学标准(PKCS):一套可互操作的公钥密码学标准和指南,由RSA数据安全公司设计。(这些文件不再容易获得;本节中的所有链接都来自archive.org。)

  • PKCS #1:RSA密码学标准(也是RFC 8017)
  • PKCS #2:并入PKCS #1。
  • PKCS #3:Diffie-Hellman密钥协议标准
  • PKCS #4:并入PKCS #1。
  • PKCS #5:基于密码的密码学标准(PKCS #5 V2.1也是RFC 8018)
  • PKCS #6:扩展证书语法标准(正在被X.509v3取代)
  • PKCS #7:密码学消息语法标准(也是RFC 2315)
  • PKCS #8:私钥信息语法标准(也是RFC 5958)
  • PKCS #9:选定的属性类型(也是RFC 2985)
  • PKCS #10:认证请求语法标准(也是RFC 2986)
  • PKCS #11:密码学令牌接口标准
  • PKCS #12:个人信息交换语法标准(也是RFC 7292)
  • PKCS #13:椭圆曲线密码学标准
  • PKCS #14:伪随机数生成标准不再可用
  • PKCS #15:密码学令牌信息格式标准
  • Cramer-Shoup:IBM的R. Cramer和V. Shoup在1998年提出的一个公钥密码学系统。

  • 密钥交换算法(KEA):Diffie-Hellman的一个变体;被提议作为NIST/NSA Capstone项目的密钥交换方法。

  • LUC:由P.J. Smith设计的一个公钥密码学系统,基于卢卡斯序列。可以使用整数因式分解用于加密和签名。

  • McEliece:一个基于代数编码理论的公钥密码学系统。

八卦一下

题外话:公钥密码学的发明者是谁?

虽然我将公钥密码学归类为双密钥系统,但这只是为了便于理解;公钥密码学方案真正的核心在于它允许两方在通信可能被窃听的情况下交换秘密。

Diffie和Hellman无疑是第一个公开发表的公钥密码学方案的提出者,他们在1976年11月的IEEE信息论交易期刊上发表的经典论文《密码学的新方向》中详细描述了他们的方法。Diffie-Hellman方案的核心思想是,相对于执行指数运算,找到对数要困难得多。这一方案实际上是现代公钥密码学的先驱,并且确实采用了两个密钥。随后,Rivest、Shamir和Adleman在他们的论文《一种获取数字签名和公钥密码系统的方法》中进一步扩展了这一思想,该论文发表于1978年2月的ACM通信(CACM)上。当然,他们的方法基于这样一个事实:找到两个大质数的乘积比找出一个大数的质因数要容易得多。

值得一提的是,Diffie和Hellman将Ralph Merkle视为首次描述了一个公钥分配系统的人,该系统允许两方共享秘密,尽管它并不完全是一个双密钥系统。Merkle Puzzle的工作原理是,Alice创建大量加密的密钥,并将它们全部发送给Bob,Bob随机选择一个,并通知Alice他选择了哪一个。窃听者(Eve)虽然能看到所有的密钥,但无法确定Bob选择了哪个密钥(因为Bob用选定的密钥加密了回应)。在这种情况下,Eve破解的努力是Bob选择密钥努力的平方。虽然这个差异可能看起来不大,但通常已经足够了。Merkle显然在1974年在加州大学伯克利分校的一门计算机科学课程中描述了他的方法,但当时很难被人们理解;因此,他感到沮丧并放弃了这门课程。不过,他后来提交了论文《通过不安全的渠道进行安全通信》,该论文于1978年4月在CACM上发表;Rivest等人的论文甚至提到了Merkle的这项工作。虽然Merkle的方法并不是第一个发表的,但他经常被认为是第一个有这个想法的人。

另外,有一个不为人知的秘密是,英国政府通信总部(GCHQ)的一个团队在20世纪70年代初就已经首次开发了公钥密码学。由于工作的机密性,GCHQ一直保持着原始备忘录的机密状态。然而,在1997年,GCHQ改变了态度,因为他们意识到继续保持沉默并没有什么好处。文件显示,GCHQ的数学家James Ellis在1969年就开始研究密钥分配问题。到1975年,James Ellis、Clifford Cocks和Malcolm Williamson已经解决了公钥密码学的所有基本细节,但他们却不能公开谈论自己的工作。(当然,他们也被禁止挑战RSA专利!)直到1999年,Ellis、Cocks和Williamson才开始在《WIRED》杂志的一篇突破性文章中获得他们应有的荣誉。与此同时,国家安全局(NSA)声称早在1966年就已经知道这种类型的算法。

3.3 哈希函数

哈希函数,也称为消息摘要和单向加密,本质上是不使用密钥的算法(图1C)。相反,基于明文计算出一个固定长度的哈希值,使得无法恢复明文的内容或长度。哈希算法通常用于为文件内容提供数字指纹,常用于确保文件未被入侵者或病毒更改。哈希函数也常被许多操作系统用于加密密码。因此,哈希函数提供了一种确保文件完整性的机制。

哈希函数还设计成这样:输入的微小变化会在哈希值中产生显著差异,例如:

Hash string 1: The quick brown fox jumps over the lazy dog
Hash string 2: The quick brown fox jumps over the lazy dog.
MD5 [hash string 1] = 37c4b87edffc5d198ff5a185cee7ee09
MD5 [hash string 2] = 0d7006cd055e94cf614587e1d2ae0c8e
SHA1 [hash string 1] = be417768b5c3c5c1d9bcb2e7c119196dd76b5570
SHA1 [hash string 2] = 9c04cd6372077e9b11f70ca111c9807dc7137e4b
RIPEMD160 [hash string 1] = ee061f0400729d0095695da9e2c95168326610ff
RIPEMD160 [hash string 2] = 99b90925a0116c302984211dbe25b5343be9059e

让我再次强调,哈希是一种单向加密过程。你不能仅通过哈希值来“解密”并找到创建它的原始字符串。尽管许多网站,如CrackStation、Hashes.com、MD5 Online、md5thiscracker、OnlineHashCrack和RainbowCrack,可能声称或暗示可以做到这一点,但实际上并非如此。

请注意,这些网站是通过搜索数据库和/或使用彩虹表来寻找一个能产生特定哈希值的合适字符串。但重要的是,这种方法并不能确切保证你找到的字符串就是最初产生该哈希值的字符串。这是一个至关重要的区别。

假设你想要破解某人的密码,而该密码的哈希值被存储在服务器上。你确实可以通过找到一个能产生相同哈希值的字符串来“成功”破解,但这样的成功是有局限性的。因为你无法证明这个字符串就是用户的真实密码,它可能只是一个“等效密钥”或“碰撞密钥”。

今天常用的哈希算法包括:

消息摘要(MD)算法:一系列面向字节的算法,它们从任意长度的消息中产生一个128位的哈希值。

  • D2 (RFC 1319):为内存有限的系统设计,如智能卡。(MD2已根据RFC 6149被归为历史状态。)
  • MD4 (RFC 1320):由Rivest开发,与MD2类似,但专为软件中的快速处理而设计。(MD4已根据RFC 6150被归为历史状态。)
  • MD5 (RFC 1321):也是由Rivest开发,在MD4中报告潜在弱点后;这个方案与MD4类似,但由于对原始数据进行了更多的操作,所以速度较慢。尽管德国密码学家Hans Dobbertin在1996年展示了MD5算法的几个弱点("MD5压缩的密码分析"),MD5仍在许多产品中得到实现。(MD5的更新安全考虑可以在RFC 6151中找到。)

安全哈希算法(SHA):NIST的安全哈希标准(SHS)算法,描述在FIPS PUB 180-4中。NIST哈希算法的状态可以在他们的“哈希函数政策”页面上找到。

  • SHA-1算法生成一个160位的哈希值,它最初是作为FIPS PUB 180-1和RFC 3174的标准发布的。尽管SHA-1在2013年底被NIST(美国国家标准与技术研究院)弃用,但它至今仍被广泛使用。

  • SHA-2算法最初在FIPS PUB 180-2中进行了描述,并最终被FIPS PUB 180-3(以及后续的FIPS PUB 180-4)所取代。SHA-2包含了SHS(安全哈希标准)中的五个算法:除了SHA-1之外,还有SHA-224、SHA-256、SHA-384和SHA-512。这些算法可以分别生成224位、256位、384位或512位长度的哈希值。对于长度小于2^64位的消息,SHA-2建议使用SHA-1、SHA-224和SHA-256,并采用512位的块大小;而对于长度小于2^128位的消息,则建议使用SHA-384和SHA-512,并采用1024位的块大小。此外,FIPS PUB 180-4还引入了截断哈希的概念,即SHA-512/t,这是一个通用名称,指的是基于SHA-512算法但已被截断为t位的哈希值。其中,SHA-512/224和SHA-512/256有具体的描述。SHA-224、-256、-384和-512算法也在RFC 4634中进行了描述。

  • SHA-3是当前的SHS算法。尽管SHA-2算法尚未受到任何成功的攻击,但NIST认为拥有一个使用不同算法的SHA-2替代品将是谨慎之举。因此,在2007年,NIST启动了SHA-3竞赛来寻找这个替代品;提交的算法列表可以在“The SHA-3 Zoo”网站上找到。2012年,NIST宣布,在审查了64份提交后,获胜者是Keccak(发音为“catch-ack”),这是一个基于海绵函数的哈希算法家族。NIST版本的Keccak算法可以支持256位和512位的哈希输出大小。

RIPEMD:一系列消息摘要,最初来自RIPE(RACE完整性原语评估)项目。RIPEMD-160由Hans Dobbertin、Antoon Bosselaers和Bart Preneel设计,并针对32位处理器优化,以取代当时的128位哈希函数。其他版本包括RIPEMD-256、RIPEMD-320和RIPEMD-128。

eD2k:以EDonkey2000网络(eD2K)命名,eD2k哈希是给定文件的MD4哈希列表的根哈希。根哈希用于点对点文件传输网络,文件被分成块;每个块都有自己的MD4哈希与之关联,服务器维护一个包含所有块哈希列表的文件。根哈希是哈希列表文件的哈希。

HAVAL(可变长度哈希):由Y. Zheng、J. Pieprzyk和J. Seberry设计,这是一个具有多个安全级别的哈希算法。HAVAL可以创建128、160、192、224或256位长度的哈希值。更多细节可以在Zheng、Pieprzyk和Seberry的"HAVAL – A one-way hashing algorithm with variable length output"(AUSCRYPT ’92)中找到。

Skein哈希函数家族:Skein哈希函数家族在2010年NIST哈希函数竞赛中被提出。Skein由于只使用了几个简单的计算原语,所以速度快,安全,非常灵活 – 根据规范,它可以用作直接哈希、MAC、HMAC、数字签名哈希、密钥派生机制、流密码或伪随机数生成器。Skein支持256、512和1024位的内部状态大小,以及任意输出长度。

SM3:SM3是一个256位哈希函数,操作在512位输入块上。作为中国国家标准的一部分,SM3由中国国家密码管理局发布为GM/T 0004-2012:SM3密码哈希算法(2012)和GB/T 32905-2016:信息安全技术 – SM3密码哈希算法(2016)。更多信息也可以在SM3(哈希函数)页面上找到。

Tiger:由Ross Anderson和Eli Biham设计,Tiger旨在安全,高效地在64位处理器上运行,并轻松替换MD4、MD5、SHA和SHA-1在其他应用程序中。Tiger/192产生一个192位的输出,与64位架构兼容;Tiger/128和Tiger/160分别产生128位和160位长度的哈希,以提供与上述其他哈希函数的兼容性。

Whirlpool:由V. Rijmen(Rijndael的共同发明者)和P.S.L.M. Barreto设计,Whirlpool是NESSIE竞赛认可的两个哈希函数之一(另一个是SHA)。Whirlpool操作在小于2256位长度的消息上,并产生一个512位的消息摘要。这个哈希函数的设计与MD5和SHA-1非常不同,使其对那些成功的攻击类型免疫。

读者可能会对HashCalc感兴趣,这是一个基于Windows的程序,使用十几种算法计算哈希值,包括MD5、SHA-1及其几个变体、RIPEMD-160和Tiger。计算哈希值的命令行实用程序包括Dan Mares的sha_verify(Windows;支持MD5、SHA-1、SHA-2)和md5deep(跨平台;支持MD5、SHA-1、SHA-256、Tiger和Whirlpool)。

关于哈希碰撞的题外话

有时,人们对哈希函数存在误解,有些资料声称不可能有两个文件拥有相同的哈希值。这在理论上,甚至在实际中都是不准确的。以一个提供128位哈希值的哈希函数为例,那么存在[2^{128}]种可能的哈希值。然而,文件的可能性是无限的,且[∞ gg 2^{128}](即无限远大于[2^{128}])。因此,必然存在多个文件——事实上,是无限多的文件!——它们拥有相同的128位哈希值。虽然这在理论上是正确的,但在实践中,由于哈希算法被设计为处理有限大小的消息(如上所述),这种情况并不常见。例如,SHA-1、SHA-224和SHA-256分别产生160位、224位和256位的哈希值,并且它们处理的消息长度被限制在小于[2^{64}]位;而SHA-384和SHA-512(SHA-2家族的一部分)则处理长度小于[2^{128}]位的消息。尽管如此,希望你能理解我的观点——即使你不理解,也要知道存在多个文件拥有相同的MD5或SHA-1哈希值的情况。

困难之处在于,不是找到两个具有相同哈希值的文件,而是找到一个与给定文件具有相同哈希值的第二个文件。以这个例子来说明:一个人的头发通常不超过约150,000根。由于地球上有超过70亿人,我们知道有很多人的头发数量是相同的。因此,找到两个头发数量相同的人相对简单。但更难的是,选择一个人(比如你,读者),然后找到另一个头发数量与你完全相同的人。

这与生日悖论有些相似。从概率上讲,如果你随机选择大约23人的一组人,那么其中两个人共享同一个生日的概率大约是50%(如果一组有70人,这个概率会上升到99.9%)。然而,如果你在23人的一组中随机选择一个人,然后尝试找到与这个人生日相同的人,那么找到匹配的概率只有大约6%;你需要一组253人,才有50%的概率与随机选择的人共享生日(要达到99.9%的概率,则需要超过4,000人的一组)。

因此,尝试创建一个与给定哈希值匹配的文件以强制产生哈希碰撞是非常困难的——这也是哈希函数在信息安全和计算机取证领域得到广泛应用的原因。然而,早在2004年,研究人员就已经发现可以对MD5、SHA-1等哈希算法发起实际的碰撞攻击。如今,MD5和SHA-1被认为已经相当不安全。对这个问题感兴趣的读者可以进一步阅读以下资料:

  • AccessData. (2006年4月). MD5碰撞:对计算机取证的影响。AccessData白皮书。
  • Burr, W. (2006年3/4月). 加密哈希标准:我们的未来之路?IEEE安全与隐私杂志,4(2),88-91。
  • Dwyer, D. (2009年6月3日). SHA-1碰撞攻击现已达2^52。SecureWorks研究博客。
  • Gutman, P., Naccache, D., & Palmer, C.C. (2005年5/6月). 当哈希碰撞发生时。IEEE安全与隐私杂志,3(3),68-71。
  • Kessler, G.C. (2016). MD5文件哈希碰撞对数字取证成像的启示。数字取证、安全与法律杂志,11(4),129-138。
  • Kessler, G.C. (2016). SHA-1文件哈希碰撞对数字取证成像的进一步影响:后续实验。数字取证、安全与法律杂志,11(4),139-148。
  • Klima, V. (2005年3月). 找到MD5碰撞——笔记本上的小把戏。
  • Lee, R. (2009年1月7日). 法律非科学:计算机证据与MD5哈希的可采性。SANS计算机取证博客。
  • Leurent, G. & Peyrin, T. (2020年1月). SHA-1已成笑柄:首个SHA-1选定前缀碰撞及其对PGP信任网的影响。Real World Crypto 2020会议。
  • Leurent, G. & Peyrin, T. (2020年1月). SHA-1已成笑柄(论文):首个SHA-1选定前缀碰撞及其对PGP信任网的应用。
  • Stevens, M., Bursztein, E., Karpman, P., Albertini, A., & Markov, Y. (2017). 首个完整的SHA-1碰撞实例。
  • Stevens, M., Karpman, P., & Peyrin, T. (2015年10月8日). 首个SHA-1自由启动碰撞实例。密码学电子印刷档案,论文编号2015/967。
  • Thompson, E. (2005年2月). MD5碰撞及其对计算机取证的影响。数字调查杂志,2(1),36-40。
  • Wang, X., Feng, D., Lai, X., & Yu, H. (2004年8月). 哈希函数MD4、MD5、HAVAL-128和RIPEMD的碰撞实例。Wang, X., Yin, Y.L., & Yu, H. (2005年2月13日). 对SHA-1的碰撞搜索攻击。

关于哈希函数的更多信息,请参阅David Hopwood的消息摘要算法页面和Peter Selinger的MD5碰撞演示页面。想了解2005年左右哈希碰撞的历史背景,请查阅RFC 4270。

2015年10月,SHA-1自由启动碰撞被宣布;详见Bruce Schneier和攻击开发者的报告(以及上文提到的Stevens等人(2015)的论文)。2017年2月,在谷歌安全博客和Centrum Wiskunde & Informatica的Shattered页面上宣布了首个SHA-1碰撞。另见上文列出的Stevens等人(2017)的论文。

哈希函数的某些扩展被广泛应用于各种信息安全和数字取证领域。

滚动哈希基于输入的固定长度“滑动窗口”计算一系列哈希值。例如,可能在文件的第1至第10个字节上计算一个哈希值,然后在第2至第11个字节、第3至第12个字节等上计算。

模糊哈希是一个研究密集型领域,旨在生成代表两个输入相似性的哈希值。模糊哈希用于检测文档、图像或其他文件在内容上的接近度。关于此话题的深入讨论,请参见Jesse Kornblum的“模糊哈希”一文。

哈希函数的输出是确定性的,即相同输入总是产生相同哈希值。然而,由于哈希函数的单向性,无法从哈希值推导出原始输入。这一特性使哈希函数非常适合用于验证数据完整性和存储密码。

尽管哈希函数在安全性方面非常有用,但也存在局限性。例如,虽然对于强哈希函数而言,找到哈希碰撞(即两个不同输入产生相同哈希值)在计算上是不切实际的,但碰撞仍有可能发生。此外,随着计算能力的提升和更高效攻击方法的发展,曾经被认为安全的哈希函数可能变得不再安全。

为提高安全性,建议使用最新的哈希算法(如SHA-3),并定期更新和替换旧哈希函数。此外,为增强密码存储的安全性,建议结合使用哈希函数和盐值(一种随机数据),与密码一起进行哈希处理,以防止使用彩虹表等技术进行攻击。

总之,哈希函数是现代信息安全基础设施的关键组成部分,但选择和使用时需谨慎,以确保数据的安全性和完整性。

3.4. 为什么需要三种加密技术?

那么,为什么有这么多不同类型的密码学方案呢?我们为什么不能只用一种来完成所有需要做的事情呢?

答案是每种方案都针对某些特定的密码学应用进行了优化

例如,哈希函数非常适合确保数据的完整性,因为对消息内容的任何更改都会导致接收者计算出的哈希值与发送者在传输中放置的哈希值不同。由于两个不同的消息产生相同的哈希值的可能性非常低,因此数据的完整性得到了高度的信心保证。

另一方面,对称密钥加密非常适合加密消息,从而提供隐私和保密性。发送者可以基于每条消息生成一个会话密钥来加密消息;当然,接收者需要相同的会话密钥才能解密消息。密钥交换当然是公钥加密的一个关键应用。

非对称加密也可用于确保消息的不可否认性和用户认证。如果接收者能够获得用发送者私钥加密的会话密钥,那么可以确定只有这个发送者才能发送这条消息。理论上,公钥加密也可以用来加密信息,但通常不这么做,因为对称密钥加密算法的执行速度通常比公钥加密算法快1000倍。

​一篇关于密码学的概念性文章(上)

图4展示了如何将所有这些功能整合在一起,形成一个包含数字签名和数字信封的安全传输方案。在这个例子中,Alice是消息的发送者,Bob是接收者。

数字信封由两部分组成:加密的消息和加密的会话密钥。Alice使用对称密钥加密技术,用随机生成的会话密钥来加密她的消息。然后,她用Bob的公钥来加密这个会话密钥。这样,加密的消息和会话密钥一起构成了数字信封。Bob收到后,用他的私钥解密会话密钥,然后用它来解密消息。

数字签名的创建过程分为两步。

首先,Alice计算她消息的哈希值;然后,她用她的私钥来加密这个哈希值。当Bob收到数字签名后,他用Alice的公钥解密数字签名,以获取Alice计算的哈希值。

接着,Bob对Alice的原始消息(他已经解密了的消息)应用哈希函数。如果得出的哈希值与Alice提供的不一致,Bob就知道消息在传输过程中被篡改了;如果哈希值相同,Bob就可以确信他收到的消息与Alice发送的消息是一致的。

这个方案还提供了不可否认性,因为它证明了Alice确实发送了消息。如果Bob使用Alice的公钥解密得到的哈希值显示消息未被更改,那么只有Alice才能创建这个数字签名。Bob也有证据证明他是预期的接收者;如果他能正确解密消息,那就意味着他正确地解密了会话密钥,也就是说他拥有正确的私钥。

这个图故意展示了一个密码系统,其中会话密钥只用于一次会话。即使这个会话密钥被破解,也只会泄露这一次会话的内容;下一次会话的会话密钥与这次会话的密钥无关,就像这次的密钥与上一次的无关一样。这被称为完美前向保密性;你可能因为一次会话密钥的泄露而失去一次会话,但你不会失去所有的会话。(这在2014年的OpenSSL漏洞Heartbleed中是一个问题。)

这里描述的系统基本上是使用接收者的公钥来加密秘密会话密钥。虽然这个通用方案运作良好,但在实践中可能会引起一些不兼容的问题。2022年初发布的RFC 9180描述了构建**混合公钥加密(HPKE)**过程的新方法。HPKE专门设计为简单、可重用和面向未来。

3.5 密钥长度的重要性

在1998年的一篇行业文献中,一位作者声称,由于1998年的计算机速度比1975年快了1000倍,因此56位的密钥不再像1975年那样为DES(数据加密标准)提供足够的保护。

因此,作者接着说,我们在1998年需要的是56,000位的密钥,而不是56位的密钥,以提供足够的保护。然后得出结论,因为56,000位的密钥是不切实际的,我们应该接受我们必须使用弱加密的事实(这是错误的!)。这里的主要错误是作者没有考虑到每当密钥长度增加一位时,可能的密钥值数量就会翻倍;因此,57位的密钥的值是56位密钥的两倍(因为[2^{57}]是[2^{56}]的两倍)。实际上,一个66位的密钥将比56位的密钥多出1024倍的值。

但这确实引发了一个关键问题:“密钥长度如何影响保护水平的重要性?”

在密码学领域,大小确实至关重要。密钥越长,破解加密数据块的难度就越大。大密钥之所以能提供更多的保护,原因几乎不言而喻:计算机使得通过暴力破解方法(而非攻击加密算法本身的数学基础,这些数学基础通常是公开的)来攻击密文变得相对容易。在暴力破解攻击中,攻击者会尝试每一个可能的密钥,并将其应用于密文。如果某个密钥产生的明文有意义,那么该密钥就可能是一个合法的候选密钥。这种攻击方式正是电子前沿基金会(EFF)攻击DES算法的基础。

直到大约1990年代中期,暴力破解攻击还超出了攻击者社区预算范围内计算机的处理能力。然而,到了那个时候,强大的计算能力已经变得普遍且易于获取。像个人电脑(PC)这样的通用计算机已经被用于执行暴力破解攻击。对于拥有充足预算的严肃攻击者,如一些大公司或政府机构,他们可以利用现场可编程门阵列(FPGA)或特定应用集成电路(ASIC)技术来构建专用芯片,这些芯片在破解加密密钥方面比PC更快、成本更低。例如,AT&T优化的可重配置单元阵列(ORCA)FPGA芯片的成本约为200美元,但它每秒能测试3000万个DES密钥,而一个仅售10美元的ASIC芯片每秒能测试2亿个DES密钥;相比之下,一台PC每秒可能只能测试数万个密钥。如今,分布式攻击已成为常态,它利用多达数万个强大的CPU的力量,试图暴力破解加密密钥。

​一篇关于密码学的概念性文章(上)​一篇关于密码学的概念性文章(上)

表2——源自1996年的一篇论文,该论文探讨了为何40位密钥的出口本质上不具备加密性,以及DES算法的寿命已所剩无几。此表揭示了在不同时间和财务资源条件下,攻击者需要多大的DES密钥大小来确保数据安全。这些信息绝非纸上谈兵;任何安全系统的核心原则之一,就是要明确你的保护对象以及潜在威胁源!该表直观地表明,即便是对于最不精通的攻击者来说,40位密钥也几乎毫无防护力。相反,56位密钥在多数情况下相当坚固,除非你面临来自某些大型公司或政府机构的严重间谍活动威胁。但请注意,即便是56位密钥,其价值也在明显下降,且表中所示时间为最坏情况下的预估。

那么,多大的密钥才算足够安全呢?DES算法于1975年问世,至世纪之交仍在广泛使用,几乎跨越了25年的时光。如果我们以此为设计标准(即,期望使用寿命超过20年),并依据摩尔定律(计算能力大约每18个月翻一番)进行推算,那么密钥长度需增加14位(即,安全强度提升超过16,000倍)才能满足需求。1975年DES算法提出时采用的是56位密钥;到了1995年,为提供同等保护需70位密钥;而到了2015年,则需85位密钥。

对于对称密钥加密(SKC)而言,256位或512位的密钥在一段时间内可能足够安全,因为这样的长度使我们在暴力破解攻击面前保持领先地位。但请注意,虽然较大的密钥确实更好,但并非越大越好;例如,将公钥加密(PKC)密钥长度扩展至当前2048位或4096位以上,并不会显著增加必要的保护。密码系统的安全性主要取决于密钥管理,而非密钥本身的强度。

上述大部分讨论及表格内容,均基于M. Blaze、W. Diffie、R.L. Rivest、B. Schneier、T. Shimomura、E. Thompson和M. Wiener于1996年发表的论文《为提供足够的商业安全而需要的对称密码的最小密钥长度》。

当前最有效的大数分解方法首先利用数学数域筛技术找到一定数量的关系,随后通过矩阵操作来求解一个线性方程组,从而得出两个素数因子。筛选步骤实际上包含了大量可以并行处理的操作;然而,求解线性方程组则需要借助超级计算机的力量。实际上,为了找到1999年2月RSA-140挑战的解决方案——即分解一个140位十进制数(对应二进制约为465位)的素数——首先需要200台计算机在互联网上协同工作约4周的时间来完成第一步,接着再需要一台Cray计算机耗时100小时并占用810MB的内存来完成第二步。

1999年初,RSA领域的知名人物Shamir介绍了一种新机器的概念,据称这种机器能将大数分解的速度提高2到3个数量级。尽管他没有提供详细的计划,也没有人知道是否已有此类机器被建造出来,但TWINKLE(即The Weizmann Institute Key Locating Engine,魏茨曼研究所密钥定位引擎)的概念预示着可能会出现一种专门的硬件,其成本约为5000美元,但处理能力却相当于100到1000台个人计算机。然而,在建造这样的机器之前,似乎还有大量的工程细节有待解决。此外,这种硬件只改进了筛选步骤;矩阵操作并未通过这一设计得到优化,而且这一步的复杂性会随着密钥长度的增加而迅速增长,无论是在处理时间还是内存需求方面都是如此。尽管如此,这个计划在概念上已经将512位密钥纳入了可能被分解的范围。尽管大多数公钥密码(PKC)方案允许使用1024位甚至更长的密钥,但Shamir声称,512位RSA密钥“已经足以保护今天互联网上95%的电子商务活动。”(更多信息,请参见Bruce Schneier于1999年5月15日发布的Crypto-Gram。)

同样值得注意的是,虽然强大的密码学技术无疑更加优越,但长密钥可能会破坏数据文件的随机性。Shamir和van Someren在《“与存储的密钥玩捉迷藏”》一文中指出,新一代病毒可能会被编写出来,这些病毒能够识别出用长密钥加密的文件,从而使它们更容易被入侵者发现,进而更容易受到攻击。

最后,自二战以来,美国政府一直对密码产品的出口实施严格控制。直到1990年代中期,出口到北美以外地区、使用超过40位密钥长度的密码产品都是被禁止的,这使得这些产品在市场上,特别是电子商务市场上几乎毫无价值;而今天,密码产品已经可以在互联网上广泛获取,且没有任何限制。美国商务部工业安全局维护了一个加密常见问题解答(FAQ)网页,提供了关于当前加密注册状态的更多信息。

在这个文章中,偶尔撤点八卦也挺好,提供一些历史背景或许能对您有所帮助。在1990年代中期,美国商务部仍将密码学视为军火范畴,并对包含密码的任何产品的出口实施限制。

因此,1995年时的浏览器,如Internet Explorer和Netscape,都推出了两个版本:一个国内版,配备128位加密(仅限美国下载),以及一个出口版,仅提供40位加密。许多密码学家认为,这些出口限制应当被取消,因为它们仅针对美国产品,似乎是由那些认为只有美国才懂得如何构建强大密码算法的政策制定者所设立,从而忽视了1990年代在澳大利亚、加拿大、以色列、南非、英国等地正在进行的密码学研究工作。这些限制最终在1996年或1997年被废除,但显然,当时仍普遍存在一种观念,认为美国的密码算法是唯一强大的算法。

这一点从Bruce Schneier在2016年6月的一篇博客标题“CIA局长John Brennan假装外国密码学不存在”中便可见一斑。如今,密码学无疑已成为一项国际性的研究领域;值得注意的是,上面提到的许多国家都已经开发出了各种密码算法,其中,NIST(美国国家标准与技术研究院)采用的高级加密标准便是源自比利时密码学家的算法,这不过是众多实例中的一个。更多证据,请参见Schneier在2016年2月进行的全球加密产品调查。

在相关话题上,公钥密码方案(PKC)可用于多种目的,包括密钥交换、数字签名、身份认证等。在采用公钥密码方案进行对称密钥交换(SKC)的系统中,公钥密码的密钥长度被设定为能够抵御某一选定级别的攻击。

通过该系统交换得到的对称密钥的长度,也必须至少具备同等级别的攻击抵御能力。因此,**这样一个系统必须确保其三个参数——系统强度、对称密钥强度和公钥强度——相互匹配。**关于这个话题的更详细讨论,请参见“用于交换对称密钥的公钥强度确定”(RFC 3766)。

4. 信任模型

**密码学的安全使用需要信任。**虽然对称密钥密码学可以确保消息的机密性,哈希码可以确保完整性,但没有信任,这一切都无法工作。在对称密钥密码学(SKC)中,Alice和Bob必须共享一个密钥。公钥密码学(PKC)解决了密钥分发问题,但Alice如何真正知道Bob就是他所说的那个人呢?仅仅因为Bob拥有公钥和私钥,并声称自己是“Bob”,Alice如何知道一个恶意的人(Mallory)不是在冒充Bob呢?

不同的密码学方案采用了多种信任模型。本节将探讨其中的三种:

  1. PGP的信任网络:由Pretty Good Privacy(PGP)用户使用,他们持有自己的一组受信任的公钥。
  2. Kerberos:一种使用受信任的第三方的对称密钥分发方案。
  3. 证书:允许一组受信任的第三方相互认证,并且通过暗示,认证彼此的用户。

这些信任模型在复杂性、普遍适用性、范围和可扩展性方面各不相同。

4.1 PGP信任网络

Pretty Good Privacy是一种基于公钥方法广泛使用的私人电子邮件方案。PGP用户维护一个本地密钥环,包含所有他们已知和信任的公钥。用户使用所谓的“信任网络”来确定密钥的可信度。​一篇关于密码学的概念性文章(上)

图5展示了GNU Privacy Guard(GPG)软件生成的PGP格式密钥链,这是遵循OpenPGP标准的一种实现。这个密钥链包含了我信任的一些人的公钥,但请注意,这些密钥是与他们的电子邮件地址关联的,而不是他们的名字。

PGP的信任网络是这样工作的:比如Alice想要获取Bob的公钥。她可以直接向Bob索要,或者从PGP密钥服务器上下载。这些服务器可能是知名的密钥库,或者是Bob自己维护的。实际上,Bob的公钥可能存在于多个地方。(比如,我的公钥可以在Gary Kessler的网站找到,或者在几个公共PGP密钥服务器上找到。)Alice需要决定她是否信任这些来源提供的Bob的公钥。

如果Carol声称她有Bob的公钥并愿意分享给Alice,Alice如何确定这个公钥是真实的,以及Carol是否真的在帮助Alice,而不是在给Alice一个让Mallory能解密信息的假公钥呢?这个问题的答案取决于Alice对Carol的信任程度。如果Alice信任Carol,并且Carol确信她提供的公钥是Bob的,那么Alice可能会选择信任这个公钥。但信任不是自动传递的;即使Carol信任Dave,并且Dave有Bob的公钥,这并不意味着Alice也信任Dave。

关键在于Alice决定信任谁,这是她个人的判断。PGP并没有规定用户应该如何确定他们是否应该信任另一个用户。无论如何,只有当用户的密钥链中包含正确的公钥时,才能进行公钥加密和签名。

这个就是我目前使用最多的方案。

4.2 Kerberos

Kerberos 是互联网上广泛使用的认证协议,由麻省理工学院的 Project Athena 开发,名字来源于希腊神话中守卫地狱入口的三头犬。

Kerberos 采用 客户端/服务器架构,提供用户到服务器的认证服务,而不是主机到主机的认证。在这个模型中,安全性和认证基于对称密钥技术,网络上的每个主机都有自己的对称密钥。如果每个主机都必须知道所有其他主机的密钥,那显然难以管理,因此网络上有一个安全、受信任的主机,称为密钥分发中心(KDC),它知道所有主机(或至少网络的一部分,称为领域内的某些主机)的密钥。这样,当新节点加入网络时,只有KDC和新节点需要用节点的密钥进行配置;密钥可以通过物理方式或通过其他安全方式分发。

​一篇关于密码学的概念性文章(上)
图6:Kerberos 架构。

Kerberos服务器/KDC 有两个主要功能,称为认证服务器(AS)票据授权服务器(TGS)。建立应用程序客户端和应用程序服务器之间经过认证的会话的步骤如下:


    1. Kerberos客户端软件Kerberos服务器的AS功能建立连接。AS首先认证客户端是否是它声称的那个人。然后,AS为客户端提供这个登录会话的秘密密钥(TGS会话密钥)和票据授权票证(TGT),允许客户端与TGS交谈。票据有一个有限的生命周期,以便定期重复认证过程。

    1. 客户端现在与TGS通信,以获得应用程序服务器的密钥,以便它(客户端)可以建立到它想要的服务的连接。客户端向TGS提供TGS会话密钥TGTTGS响应一个应用程序会话密钥(ASK)和应用程序服务器的秘密密钥的加密形式;这个秘密密钥从未以任何其他形式在网络上发送。

    1. 客户端现在已经认证了自己,并且可以通过提供Kerberos票据应用程序会话密钥和加密的应用程序服务器秘密密钥来向应用程序服务器证明其身份。应用程序服务器以类似加密的信息响应,以向客户端认证自己。此时,客户端可以发起预期的服务请求(例如,TelnetFTPHTTP或电子商务交易会话建立)。
sequenceDiagram
participant Client as Kerberos客户端
participant AS as 认证服务器(AS)
participant TGS as 票据授权服务器(TGS)
participant Server as 应用程序服务器

Note over Client,Server: Kerberos认证过程

Client->>AS: 请求认证(AS_REQ)
AS->>Client: 发送TGS会话密钥和TGT(AS_REP)
Client->>TGS: 使用TGS会话密钥和TGT请求服务(TGS_REQ)
TGS->>Client: 发送ASK和加密的应用程序服务器秘密密钥(TGS_REP)
Client->>Server: 提供Kerberos票据、ASK和加密的应用程序服务器秘密密钥
Server->>Client: 响应加密信息以认证服务器

Note right of Client: 客户端现在可以发起服务请求

这个协议的当前版本是Kerberos V5(在RFC 1510中描述)。虽然它们的操作细节、功能能力和消息格式不同,但上述概念概述基本上适用于两者。一个主要的区别是Kerberos V4只使用DES来生成密钥和加密消息,而V5允许使用其他方案(尽管DES仍然是最广泛使用的算法)。

4.3 公钥证书和证书颁发机构

在电子商务应用中,证书证书颁发机构(CA)对于密码学的广泛应用至关重要。尽管结合对称和公钥密码学可以解决业务问题,但密码学本身无法解决客户和供应商在快速变化的电子商务关系中必须存在的信任问题

例如:

  • 一个网站如何获得另一方的公钥?
  • 收件人如何确定公钥是否真的属于发件人?
  • 收件人怎么知道发件人是否在使用他们的公钥进行合法操作?
  • 公钥何时过期?
  • 如果密钥被泄露或丢失,如何撤销密钥?

证书的基本概念对我们来说很熟悉,比如驾驶执照、信用卡或潜水证书,它们向他人证明我们的身份,表明我们被授权做的事情,有一个到期日期,并确定颁发证书的权威机构。

尽管听起来复杂,但实际上并非如此。以驾驶执照为例。我有一个由成都颁发的许可证确立了我的身份,表明我可以操作的车辆类型,以及我在操作时必须佩戴矫正镜片的事实,确定颁发机构。

当我在其他省份开车时,各地的其他管辖区都承认成都颁发这个“证书”的权威,并信任它包含的信息。当我离开国内时,一切都变了。当我在其他国家时,他们将不接受这个许可证。这个类比代表了证书信任链,即使是证书也携带证书。

对于电子交易的目的,证书是数字文件。证书的特定功能包括:

  1. 建立身份:将公钥与个人、组织、公司职位或其他实体关联或绑定。
  2. 分配权限:根据这个证书确定持有者可以或不可以采取的行动。
  3. 保护机密信息(例如,加密会话的对称密钥以确保数据机密性)。

通常,证书包含一个公钥、一个名称、一个到期日期、颁发证书的权威的名称(因此,为用户的身份担保)、一个序列号、任何相关的政策描述证书是如何颁发和/或证书如何使用的信息、证书颁发者的数字签名,可能还有其他信息。

​一篇关于密码学的概念性文章(上)
图7:VeriSign Class 3 证书。

图7显示了一个典型的缩写证书。这是一个在浏览器中找到的典型证书,在这种情况下,是Mozilla Firefox(MacOS)。虽然这是由VeriSign颁发的证书,但许多根级证书都与浏览器一起提供。当浏览器连接到一个安全网站时,Web服务器将其公钥证书发送到浏览器。然后浏览器检查证书的签名是否与它存储的公钥匹配;如果有匹配,证书被认为是有效的,并且通过这个证书验证的网站被认为是“受信任的”。

最广泛接受的证书格式是由国际电信联盟电信标准化部门(ITU-T)建议的X.509。X.509是一个在世界范围内使用的规范,任何符合X.509的应用程序都可以共享证书。今天的大多数证书都符合X.509版本3,并包含以下信息:

  1. 版本号
  2. 证书序列号
  3. 签名算法标识符
  4. 颁发者的名称和唯一标识符
  5. 有效期(或操作)期限
  6. 主题的名称和唯一标识符
  7. 主题公钥信息
  8. 标准扩展
    • 证书适当使用定义
    • 密钥使用限制定义
    • 证书策略信息
  9. 其他扩展
    • 特定于应用程序的
    • 特定于CA的

证书颁发机构是公钥的存储库,可以是任何颁发证书的机构。例如,公司可能向其员工颁发证书,学院/大学向其学生颁发证书,商店向其客户颁发证书,互联网服务提供商向其用户颁发证书,或者政府向其选民颁发证书。

当发送者需要接收者的公钥时,发送者必须从接收者的CA获取该密钥。如果发送者和接收者由同一个CA颁发证书,那么该方案是直接的。如果不是,发送者如何知道要信任外国CA呢?一位行业人士曾就信任问题发表评论:“你要么天生就有信任,要么信任是被授予的。”因此,一些CA将因其声誉而被信任,如AT&T Services、Comodo、DigiCert(前身为GTE Cybertrust)、EnTrust、Broadcom(前身为Symantec,前身为VeriSign)和Thawte运营的CA。反过来,CA与其他CA形成信任关系。因此,如果用户向外国CA查询信息,用户可能会要求查看建立“信任链”回到用户的CA列表。

在选择CA时,一个主要特点是他们的身份识别政策和程序。当用户生成密钥对并将公钥转发给CA时,CA必须检查发送者的身份,并采取任何必要步骤以确保请求确实来自广告中的发送者。不同的CA有不同的身份识别政策,因此会被其他CA以不同的方式信任。身份验证只是CA的认证实践声明(CPS)和政策的一部分;其他问题包括CA如何保护其照顾的公钥,如何撤销丢失或泄露的密钥,以及CA如何保护其自己的私钥。

最后,CA并非不受攻击,证书本身也可能被伪造。最早的此类事件之一发生在世纪之交;在2001年1月29日和30日,两个VeriSign Class 3代码签名数字证书被颁发给一个欺诈性地声称自己是微软员工的个人(CERT/CC CA-2001-04和Microsoft Security Bulletin MS01-017 – Critical)。多年来问题一直在继续;有关此问题的好文章可以在“Another Certification Authority Breached (the 12th!)”和“How Cybercrime Exploits Digital Certificates.”中找到。

作为解决这个问题的部分方式,互联网安全研究小组(ISRG)设计了自动化证书管理环境(ACME)协议。ACME是一种通信协议,通过自动化CA和希望获得证书的Web服务器之间的交互,简化了部署公钥基础设施(PKI)的过程。更多信息可以在Let’s Encrypt网站找到,这是ISRG提供的基于ACME的CA服务。

4.4 总结

上述段落讨论了三种截然不同的信任模型,很难说哪一种模型优于其他模型;选择哪一种取决于你的具体需求。然而,目前密码学中最大且增长最快的应用之一是电子商务(e-commerce),这个词本身就需要一个明确的定义。

PGP的信任网络易于维护,非常贴近用户作为个体的实际情况。然而,这种模型有其局限性;一个人能可靠地存储和维护多少公钥?如果你在一台没有你的密钥链的“错误”的计算机上想要发送消息怎么办?如果密钥被泄露,撤销密钥的难易程度如何?PGP可能也不适合电子商务场景,即在短时间内完全陌生的人之间需要安全通信。

Kerberos解决了PGP信任网络的许多问题,因为它是可扩展的,能够覆盖非常大的范围。然而,它要求Kerberos服务器在任何交易之前必须先了解所有客户端系统,这使得它对于电子商务中常见的“即兴”客户端/服务器关系来说是不切实际的。

证书和CA的集合构成了一个公钥基础设施(PKI)。在互联网的早期,每个主机都必须维护一个其他主机的列表;**域名系统(DNS)**引入了分布式数据库的概念,这是互联网能够增长的关键因素之一。PKI将在电子商务和公钥密码学领域发挥类似的重要作用。

虽然证书和PKI的好处最常与电子商务联系在一起,但PKI的应用要广泛得多,包括安全电子邮件、支付和电子支票、电子数据交换(EDI)、安全传输域名系统(DNS)和路由信息、电子表格和数字签名文档。实现一个单一的“全球PKI”还有很长的路要走,这是当今工作最终目标,因为国际电子商务正在改变我们做生意的方式,就像互联网改变了我们沟通的方式。

原文始发于微信公众号(TrustZone):​一篇关于密码学的概念性文章(上)

版权声明:admin 发表于 2024年10月6日 上午12:01。
转载请注明:​一篇关于密码学的概念性文章(上) | CTF导航

相关文章