打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
科普 | 密码学极速入门

2019-10-31 09:55·闪念基因


密码学的目标:

机密性、完整性、身份认证和不可否认性。

机密性:确保数据在存储或传输中保持秘密状态

完整性:保证数据在传输中不被篡改

身份认证:对声明的系统用户进行身份验证

不可否认性:为接收者提供了担保,保证消息确实来自发送者而不是来自伪装者。

现代密码学基础知识:

1、对称密钥算法

加密和解密使用相同的密钥,密钥需要事先分发给所有参与通信的成员。当密钥长度足够长时,破解比较困难。缺点如下:

需要解决密钥分发问题。需要事先采用安全的方式共享加密密钥。

未解决不可否认性。任意拥有密钥的人都可以加密,无法分辨加密消息来自于谁。

密钥需要经常更新。每当有成员离开用户组时,所有涉及这个成员的密钥都需要更新。

DES算法:美国政府1977年公布,DES是一个64位的分组密码,实际使用的密钥长度为56位。

3DES算法:由于现代密码分析技术和超级计算能力提升,DES算法已经不在安全。DES的修改版本三重数据加密算法3DES能够使用相同的算法实现更安全的加密。

AES算法:2000年10月,美国国家标准和技术协会NIST宣布Rijndael分组密码替换DES成为新的加密算法标准。AES密码准许使用三种密钥长度:128位,192位,256位。

常见的对称密码算法

算法                                     分组大小(位)        密钥大小(位)

DES                                                64                    56

3DES                                              64                112或168

AES                                               128           128、192、256

Rijndael                                         可变          128、192、256

Twofish                                          128                 1-256

Blowfish(通常在SSH中使用)        64         32-448

IDEA                                               64            128

2、非对称密钥算法

非对称密钥算法也叫公钥算法,有效的解决了对称密钥算法的很多痛点。在这个系统中,每个用户都有两个密钥,一个在所有用户间共享的公钥,一个是只有用户自己知道的私钥。

三种非对称密码算法的密钥长度

密码算法                   密钥长度

RSA                           1088

DSA                           1024

ECC                            160

3、散列函数

散列函数具有一个非常简单的用途,就是它们接收一个可能很长的消息,然后根据消息内容生成唯一的输出值,以此来确保消息是否被篡改。

散列算法记忆表

算法名称

哈希值的长度(位)

HAVAL一种MD5变种

128、160、192、224、256

HMAC

可变

MD2

128

MD4

128

MD5

128

SHA-1

160

SHA-224

224

SHA-256

256

SHA-384

384

SHA-512

512

4、数字签名

数字签名的应用有两个明显的作用:

向接收方保证:消息确实来自声明的发送者,并且实施了不可否认性

向接收方保证:消息在发送方和接收方之间进行传输过程中不会被改变。

 签名过程

验签过程

5、公钥基础设施(PKI)

公钥基础设施PKI使得原本互不相识的双方间通信变得更加容易。由可信证书颁发机构CA签发证书来对用户的公钥做身份证明。

数字证书为通信双方提供了保证,保证正在通信的人确实具有他们所宣称的身份。数字证书本质上是个人公钥的认可副本。当用户验证证书确实是由可信证书颁发机构(CA)发布时,他们就相信这个公钥是合法的。数字证书X.509国际标准包含以下数据:

 序列号(来自证书建立者)

签名算法标识符

发布者姓名(发布证书的证书授权机构的身份标识)

有效期

主体的名字

主体的公钥

上海安当技术有限公司致力于开发身份认证、数据加密类产品,依托集中化、跨平台的密钥管理系统,专注于为金融、政府、企业等客户提供更加安全,便捷的身份认证管理和数据加密解决方案。公司主要产品及服务简称为4S:身份认证服务平台(Authentication Service Platform),密钥管理平台(Key Safe Platform),硬件加密机(Hardware Security Module),数据加密集成服务(Data Security Integration)。 

————————————————

版权声明:本文为CSDN博主「安当加密」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/m0_61703951/article/details/121470520


-广受欢迎的加密通讯工具——OpenSSL,其中的部分代码-

关于密码学的内在原理,一直被认为是少数专家或数学家才能涉足的领域,其中的技术细节在大多数人看来就像变魔术一样。考虑到现代密码学的复杂程度,我们可以理解为什么很多人对密码学存在这些误解;但不了解密码学,可能会做出很多弊大于利的决定,比如英国的加密禁令提案(Encryption Ban),澳大利亚的援助和访问法案(Assistance and Access Bill)等。

在本篇指南中,我们会帮助大家掌握学习密码学所需的入门知识、对不同密码学体系的发展历程进行简介,并对当前三个最流行的密码学领域——流密码、分组密码、公钥密码,进行快速上手指导。

密码(Ciphers)

“密码”(Cipher)指的是对消息进行加密或解密的算法,也是密码学的基石。加密算法 (E) 使用密钥 (k) 对消息 (m) 进行加密,并生成密文 (c);类似地,解密算法 (D) 使用密钥 (k) ,对密文 (c) 进行解密。如下列所示:

-加密算法 'E' 及解密算法 'D' -

上述过程也意味着,一种算法要想被称为“密码”(算法),还必须满足以下的一致性方程特性,确保密文可以被解密。

式子表明着如果你使用密钥 K 对消息进行加密,也能使用密钥 K 对密文进行解密,并得到与原来消息一摸一样的输出。

其中一种最古老、最简单的密码就是凯撒密码(Caesar Cipher)——直接从字母表中选取特定位置,替换掉原消息中的字符。

-凯撒密码出现于公元 50 年,凯撒大帝使用字母表跳三位的字来替换原来的消息内容,用于军事通讯-

下面的例子就是经过后三位字符替换过后的密文形式(上面一行为原文,下面一行为密文):

凯撒密码可以用下列式子表示:

虽然这种做法符合我们对密码的定义,但是它非常不安全。只要攻击者知道密文是以这种方式加密,就能通过尝试另外 25 种组合进行破译;即使攻击者不知道密文使用了凯撒密码,他们也能够观察到密文中的规律进行破译。

虽然这种做法符合我们对密码的定义,但是它非常不安全。只要攻击者知道密文是以这种方式加密,就能通过尝试另外 25 种组合进行破译;即使攻击者不知道密文使用了凯撒密码,他们也能够观察到密文中的规律进行破译。

在进一步介绍更安全的加密算法之前,我们得先聊聊什么是 Xor 运算。

XOR(异或运算)

Xor 运算 ,又称为 “异或门”,是一种布尔变量逻辑判断,能接收 1 或 0 作为输入:如果输出 1 则表示两个输入不同;输出 0 则表示两个输入相同。 下图的真值表列出了经过异或运算后,所有可能的输入输出组合:

异或运算也经常用符号 ⊕ 来表示:

0 ⊕ 0 = 0

0 ⊕ 1 = 1

1 ⊕ 0 = 1

1 ⊕ 1 = 0

关于异或逻辑,以下有几点重要的特性:

  1. 异或运算结合律:a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c

  2. 对自身进行异或运算结果为 0 : a ⊕ a = 0

  3. 对 0 求异或,结果为自身:a ⊕ 0 = a

根据上述异或运算的规则,我们知道 a ⊕ b ⊕ a 等同于 a ⊕ a ⊕ b,也等于 0 ⊕ b,运算结果为 b。要注意的是,这些异或运算特性只适用在 1 和 0 ,因此对不同 进制 的数字进行异或运算之前,需要先将其转换为二进制。例如:

87 ⊕ 73 = 1010111b ⊕ 1001001b = 0011110b = 30

接着,我们可以开始介绍第一种安全密码了。

一次性密码

Frank Miller 在1882 年提出了一次性密码(One-time pad)的概念——加密:将消息和私钥进行异或运算得到密文;解密:将密钥和密文进行异或运算得到原消息,这个过程类似于前面提到的 a ⊕ b ⊕ a = b 。一次性密码的定义如下所示:

该密码的一致性方程也很容易证明:

一次性密码非常容易上手,假设我们要加密一串字段“Message”,首先可以通过 ASCII 字符集 将“Message”转换为二进制数据(由 1 和 0 组成)。

现在,我们需要一组 56 位随机二进制数(私钥)来对明文进行异或运算,该私钥随机程度越高越好!

-从 random.org 生成的随机数-

我们将明文和私钥的每一位进行异或运算。

运算后的结果就是我们的密文了!要解开密文也很简单,我们只需要将密文和刚才生成的私钥进行异或运算,并转码回 ASCII ,就能得到原消息。

这种密码简单易用,而且还有个很有意思的特点。一次性密码具有所谓的完全保密性,这意味着从数学角度来说,攻击者不可能从密文(m⊕k 的结果)推得任何原消息的内容,当然也不可能破译。

既然我们已经有了简单易用,且不可能破译的密码,为什么我们还会想用其他的密码呢?根本原因在于,一次性密码虽然很有效,但是他有一些重大的缺陷。

第一个缺陷是,不论我们想要加密什么样的消息,都需要有和原消息一样长或是更长的私钥用于加解密。而且为了让密文接收者能够解密密文,需要有绝对安全的通信方法把私钥给到接收者;这就形成一个悖论,如果有这种安全通道,那不如直接把原消息发过去得了。

第二个缺陷可以从 “一次性密码” 的名称中发现。针对不同消息,同一个私钥每回只能使用一次;如果对多个消息重复使用同一个私钥,其引发的问题可以从数学推导上看出。

假设我们有两条消息 m1 和 m2 ,分别使用相同的私钥 k 进行加密(使得我们的系统变成 “二次性密码”)。通过异或运算,我们会得到以下密文:

从上图,我们可以从密文 C1⊕ C2 得到 m1⊕ m2 。对于攻击者来说,他们就能基于这种关联性,通过各种统计分析、频率分析、模式匹配,或是使用 2006 年提出的自然语言处理方法 ,来获得原消息的内容。我不会深入解释存在这种关联性具体造成的危害(感兴趣的可以看 这里 深入了解),这里只是形象的说明当同一个私钥被使用的次数越多(“三次”、“四次”……?),密码的安全性就越低。

现在我们已经具备 XOR 加密和一次性密码的基础知识,是时候了解其他更实用的加密方法了。

流密码(Stream Ciphers)

一次性密码具有非常好的安全性,这意味着手上只有密文的情况下,攻击者不可能进行破译。但是好的安全性基于长度大于等于原消息的私钥,这使得一次性密码并不实用,因为如果加解密双方有很好的方法来传递消息和私钥,他们直接传递消息就好,没必要进行加密。

为了让一次性密码更加实用,我们引入 “流密码” 的概念。流密码的核心思想是——以“伪随机”密钥替代一次性密码中的 “随机” 密钥,伪随机密钥产生自 密码学安全 伪随机数生成器( CSPRNG ,Cryptographically Secure Pseudo-random number generator )。要注意的是,CSPRNG 不同于一般的伪随机数生成器,因为 CSPRNG 产生的数据必须和真实随机数看起来没有区别才行。

CSPRNG 是一种算法(或函数),能产生一长串数字,类似于随机数的性质。因为随机数很难生成,所以 CSPRNG 要依靠种子(seed)来决定初始状态及将来产生的数;CSPRNG 从相对较小的起始种子生成海量的随机数(例如从 128 bit 的种子生成几 GB 的随机数)。如果起始种子是已知的,则随后产生的所有数都是已知的,也就是说 CSPRNG 具有确定性;这也导致CSPRNG 产生的数,其随机程度完全取决于种子的随机程度。

为了让一次性密码更加实用,我们可以根据所需长度,使用伪随机数生成器的输出替换原来的私钥;这样的话只要传递初始种子就可以了。因为 CPRNG 具有确定性,使用相同种子能得到相同输出(也就能得到相同的 key 用来加解密)。

为了更好理解,我们先看看原来的一次性密码:

使用伪随机数生成器的输出 G(K),替换原来的私钥 K:

使用伪随机数生成器的输出 G(K),替换原来的私钥 K:

(注:图例中只是其中一种流密码,称为同步流密码。还有一种方法称为 “ 自同步流密码 ”,使用密文中的前几位数计算出密钥中的每一位。)

替换后的私钥可以远远短于要加密的消息,使得分配及管理私钥更为方便,进一步改善了一次性密码不实用的问题。但这种做法也带来了新的问题:

将原来完全随机的私钥替换为安全随机数生成器的输出,会导致私钥长度比原消息短,使得我们的密码不再具有完全保密性。因此流密码的安全性取决于我们的伪随机数生成器的不可预测性。如果可以预测 CSPRNG 的输出,则可以获得明文消息。以下是大家熟知的一些使用弱流密码的密码系统:

802.11b WEP:WEP 是一种给 WiFi 数据做加密的算法,它使用的流密码称为 RC4 。因为流密码中不能一直使用同个密钥,所以长期使用的密钥包含一个每次都会变动的值 “IV”;然而 “IV”只有 24 位,也就是说加密超过 5000 条消息后,就会有五成的概率出现相同的密钥。

CSS:DVD Forum 使用内容扰乱系统(CSS, Content Scramble System)来管理 DVD 的数字版权,使得仅有获得授权的应用才能访问 DVD 内容。CSS 使用 40 位的密钥,而 40 位的密钥空间较小,可以相对快速地暴力破解。(尽管密钥是 40 位,但考虑到 CSPRNG 的技术特点,只要猜出 17 位组合后,系统便可能被完全破解。)

现在我们也掌握了流密码的知识,可以进一步讨论下一个密码系统——分组密码。

分组密码(Block Ciphers)

分组密码是另一种能用于加解密数据的方法。分组密码包含两种算法:E 用于加密,D 用于解密,同时也用到了密钥 K 。

分组密码的核心在于,要加密的明文和输出的密文长度始终相同,为一固定量。该固定量称为 “block size”(译者注:不要与区块链语境下的 “block size” 搞混哦;后文将该词译为 “消息大小”),大小取决于所使用的分组密码算法。另外,私钥 K 的长度被称为密钥大小,也是固定量。常见的两种分组密码分别是 3DES 及 AES —— 3DES 具有 64 位的消息大小和 168 位的密钥; AES 具有 128 位的消息大小和 128 、192 或 256 位的密钥。

因为分组密码把可能的区块映射到其他的每一个区块,所以也被称为 “用密钥完成的置换”(Keyed Permutations) 或是 “伪随机置换”(Pesudorandom Permutations)。非常重要的一点是,私钥决定了输入的区块和相关密文区块的映射关系,而且是一对一排列的,所以只要知道私钥就能解密密文。

第一个比较重要的分组密码是 1970 年代 IBM 开发的数据加密标准( DES ),但 DES 并不安全,很快就被 3DES 取代;紧接着 3DES 又被 1997 年开发的高级加密标准( AES )所取代。AES 是在国家标准与技术研究所( National Institute of Standards and Technology )的要求下制定的标准化分组密码。 AES 是当今使用的最常见的分组密码,重要性大大超过 DES 和 3DES ,所以我将着重介绍 AES 。

在我解释 AES 到底是怎么运作之前,先提醒一下我会跳过很多技术细节,如果有人对这深入这方面领域有兴趣,可以从 这里 获得你想要的。

AES 及大部分分组密码,都是通过迭代进行运作的,输入的文本消息会使用连续的密钥以迭代的方式进行加密。第一步是获得一个密钥 K,密钥一般是 128 位、192 位或 256 位的,在这里我们只演示 128 位的 AES;然后拿该密钥推导出一系列的 Round Keys 来加密我们的消息。

上图例子中,我们输入 128 位(16 字节)的密钥,并通过 Rijndael 密钥方法 将密钥扩展成 11 个 16 字节的子密钥。接着,AES 将原消息放入轮次函数 R(k n , m) 进行独立加密计算,每次计算把扩展出来的轮次密钥 k n 及消息状态 m 作为输入,总共进行 10 次。

因为 AES 只能用在 128 位的消息上,因此我们把输入的消息 m 表示成 4x4 矩阵的单字节单元,同时也能把轮次密钥 表示成 4x4 的矩阵,这样就可以对消息及其中间状态进行异或运算了。

首先,输入的消息和第一个轮次密钥进行 XOR ,再通过字节替代( ByteSub )、行位移( ShiftRows )、列混淆( MixColumns )等运算,输出转变后的消息状态作为结果(这些步骤会在后面做解释)。接着我们使用不同的轮次密钥重复上述这些步骤 10 次,唯一的不同点在于最后一次的计算不包含列混淆( MixColumns )。最终的消息状态和第十一个轮次密钥(k 10 )进行异或计算,得到最后的输出。下面简述了每一轮次的计算中包含的三种步骤:

字节替代( ByteSub ):根据替换表,将消息状态矩阵中的每一个字节,替换为相应的字节。

-在 AES 使用的替换表中,每一个字节单元以 16 进制表示。如,字节 9a 会替换为 b8 -

行位移( ShiftRows ):定量移动每一行。第一行不移动,第二行左移一位,第三行左移两位,第四行左移三位。

列混淆( MixColumns ):对消息状态中每一列进行线性变换。

目前为止,我们已经能使用 AES 来加密数据。然而,你可能很快能发现 AES 的局限性——没办法在只用一次 AES 的情况下,对超过 128 位(或 16 字节)的消息进行加密。要对超过 16 字节的消息进行加密,我们需要引入 模式加密( Modes of operation ) 概念。


操作模式

一次性加密超过 128 位比特明文的方法(或者说操作模式)有许多种,其中最简单的就是电子密码本模式(Electronic Codebook),或者简称 ECB 。

ECB

ECB 是分组密码当中加密大数据量明文时最简单的操作模式。在 ECB 方法中,直接把明文消息分割成 16 比特的区块,然后用密钥分别加密这些小区块。为了保证每一个区块都有 16 比特,有时需要对明文进行拓充。举例来说,一则 28 比特的明文消息需要额外增加 4 个比特,以生成两个 16 比特大小的区块。当明文消息被分割成不同的小区块后,使用密钥对各区块分别进行加密操作。

-电子密码本模式的加密过程-

虽然电子密码本过程非常容易理解,但它的简单带来了突出的问题。正是因为间隔分明的明文区块会产生同样间隔分明的密文区块,因此很容易从中识别出特定的模式。举例来说,先看一下这张经过 ECB 加密模式处理过的点阵图。

可以看到在加密之后包含统一信息的区域依然没有改变,因此很容易识别出原始图像的大致模式。为了解决这一安全隐患,我们需要一种更安全的操作模式。

译者注:此处还需提醒的是,安全的加密算法,都必须是 “概率性的”,即对同一明文消息,每次加密产生的密文都应是不同的。这是为了保证在 “选择明文攻击(Chosen Plaintext Attack)” 下的安全性(CPA-secure)。确定性算法是无法实现 CPA-secure 的。

CBC

密码分组链接模式(Cipher Block Chaining,简称 CBC)的工作流程与 ECB 十分相似,但加入了一些改动。在每一个明文区块进行加密操作之前,它首先要和前一个区块的密文进行异或计算,从而保证每一个明文区块的独特性。至于第一个明文区块,则需要和一个随机生成的初始化向量进行异或计算。

-密码分组链接(CBC)模式的加密过程-

同样用上面那张点阵图作为图像加密的例子,可以很直观地看到加密结果的安全性大大提高。

本文介绍了两种主要的操作模式,如果对其它操作模式感兴趣,可以阅读 这篇文章 。

以上就是分组密码学入门的全部内容,下面我们来介绍本文中最后一个重要的密码学概念。

公钥密码

目前为止我们介绍的加密技术都属于 对称性加密 ( Symmetric Encryption )的范畴,意味着在加密和解密数据的过程中只使用一个密钥。而对于公钥密码,或者说 非对称加密 ( Asymmetric Encryption ),则使用由 “公钥”(Public Keys)和 “私钥”(Private Keys)组成的 密钥对 ,以支持在不可信信道中的加密通信。下文将详细解释这一过程。

公钥密码常用于服务器或者设备之间的加密通信,被广泛应用在邮件收发或是网页浏览中。不过为了行文方便,在下文中我们用 “Alice” 和 “Bob” 指代用户。

我们假设有两个用户:Alice 还有 Bob,他们相互收发消息。虽然这里只介绍了两位用户之间的消息交换,但这个例子可以套用到网页浏览、电子邮件收发以及其它安全消息交换的场景中。

在上图这个简单的场景下, Alice 和 Bob 可以自由通信。但是假如我们在会话中加入一个窃听者呢?这个窃听者能够窃取 Alice 和 Bob 之间收发的消息数据,但无法篡改数据。

-这个 “攻击者” 可能是在不安全 WiFi 网络环境下的其它用户、互联网提供商或者网络管理员-

在这个场景下,攻击者可以接触到用户收发的所有数据,但无法对数据进行篡改。因此加入了攻击者后, Alice 和 Bob 之间无法传递敏感或机密的消息。

看到这里,也许会想到上文中的 对称加密 ,但实际上对称加密并不能解决这一问题。

可以看到对称加密基本毫无效果,因为攻击者可以轻易窃听到通信所采用的密钥,然后用该密钥解密消息。Alice 和 Bob 其实应该采用公钥密码,下面我们就来深入探讨一下这个问题。

什么是公钥密码?

公钥密码要求每个用户都创建一对密钥:一个公钥以及一个私钥。公钥可以随意传播分发,而私钥则只能保管在密钥所有者手中。在公钥密码的通信系统中,任何人都能用收信人的公钥对消息进行加密,但只有手握私钥的收信人才能解密消息。

正是因为这样,当 Bob 想要向 Alice 发送一则加密消息时,它可以在发送前使用 Alice 的公钥对消息进行加密。Alice 在收到消息后再用她的私钥解密。(具体的技术细节稍后解释)

之所以转向非对称加密,有一点是因为用于解密消息的私钥永远不会暴露,更不会在通信信道中分发传播(译者注:即避免了对称密码机制必须面对的密钥交换问题)。如下图所示,非对称加密技术可以一定程度上解决前面提到的窃听者问题:

即使攻击者能窃听 Alice 和 Bob 之间的所有信息,由于缺少用于解密消息的私钥,他们也无法从中获取任何信息。

虽然非对称加密很大程度解决了窃听者问题,但这又引发了我们对另一个主要安全隐患的担忧。目前为止,我们的假设都限定攻击者仅能接收消息,而无法对数据进行篡改。但去掉这个限制,假设在我们的威胁模型中攻击者能够篡改传输的数据,那他们依然能成功实施 中间人攻击 。如果 Alice 和 Bob 在进行普通的邮件收发,那攻击者就可能伪装成邮局;如果二人进行计算机网络通信,攻击者则会充当互联网服务提供商,或者有办法访问网络通信所使用的设备。

在上图中,攻击者会扣下 Alice 的公钥,并把自己的公钥传递给 Bob。那当 Bob 想要向 Alice 发送加密信息时,实际用来加密的反而是攻击者的公钥。攻击者也因此能轻松读出本来发给 Alice 的消息,甚至能篡改消息后再发给 Alice 。

中间人攻击之所以可行,是因为目前系统存在两个重大缺陷。一是缺乏数据完备性(Integrity),即系统没有核验数据是否被篡改过的手段,二是不具备可靠性(Authenticity),即无法判定消息是由某个特定的用户发送而来的。这两个重大缺陷可以通过 数字签名 和 数字证书认证机构 来修复。

数字签名

数字签名技术是用来保障消息不被篡改的一种手段,它同时可以确保数据是由正确的发信人生成的。正如上文提到那样,只有用某个人的私钥才能解出对应公钥加密过的消息,这个道理反过来也成立。利用某个人私钥加密过的消息同样只能用该用户的公钥进行解密,所以如果 Alice 向 Bob 发送一条由 Alice 私钥加密过的消息,Bob 就需要用 Alice 的公钥进行解密,也正因如此就保证了该消息至少是由某个有权限使用 Alice 私钥的人发出的。这个过程就是我们经常提到的 “签名”。(译者注:作者这里的措辞虽然是 “加密” 和 “解密”,但更合适的用词应该是 “签名” 和 “验签”;这个过程不像加密那样是为了达成 “机密性”,而是为了保证 “身份同一性”。)

虽然可以直接签名整条消息,但要是仅对消息的密码学哈希进行签名,无疑可以简化这一过程,从而大大提升效率。将签名过的消息哈希加到消息体内,就能确保数据自创建后没有被篡改过(译者注:即如果篡改了是能够验证出来的)。

(需要提醒大家,此处描述为重度缩减版。上面提到的 “用私钥进行加密” 和 RSA 算法十分接近,但在 Diffie-Hellman 或者 ECC 系统中,则使用了像 ECDSA 一类的签名算法,它跟 RSA 完全不同)

不过这只把我们的问题向前推进了一小步。Bob 虽然现在可以确定收到的消息被之前通信对象的私钥加密过,同时消息没有被篡改,但他依然不能确定前面收到的公钥真的属于 Alice 。为了解决这一问题,我们需要引入数字证书认证机构(Certificate Authorities)。

数字证书认证机构

数字正式认证机构是一个发起数字签名并发布某一用户或实体对应公钥的受信任第三方。

上图证书使用了数字认证机构的私钥完成签名,因此所有用户都能验证由该数字认证机构签发的证书。因此对另一个用户的信任问题转移到了 CA 密钥的有效性上。

在实际工程中,数字证书最广泛的应用场景是保障安全的网站流量。当用户访问一个使用了 HTTPS 的网站时,可以在浏览器上查看它的数字证书。

这个系统需要信任由数字认证机构签发的数字证书,因此计算机等设备会预置一个可信清单,记录可信的数字认证机构以及它们的公钥。

-Windows 10 系统中部分预置的根 CA-

对于一篇入门科普文,本文的篇幅已经足够长了,因此我不会再细致地介绍公钥密码系统的具体流程和技术细节。对这方面感兴趣的读者,可以阅读这篇讲述 RSA 这个同时完成了保密和签名系统的内在原理的文章。

流/分组密码和公钥密码的一个显著差异在于,流/分组密码对单个的比特或字节进行操作,而公钥密码需要对数字进行处理。这就意味在公钥密码中,消息在进行加密前需要先转换为数字。也正因如此,在面对一些数据量大的消息时,公钥密码并不够高效。为了弥补这一缺陷,我们可以将对称加密和非对称加密结合,以提高利用收信人公钥进行大量数据加密时的效率。

PGP 就使用了这样的一种方法。首先使用随机生成的密钥对消息进行分组加密,然后使用收信者的公钥对数据量相对较小的密钥进行加密。这样以来,密文消息就被关联到了随机生成的密钥上。

由于分组密码可以快速加密大量数据,同时采用非对称密码加密数据量相对小的密钥,因此可以在保证安全的前提下大大提高系统的效率。这种做法完全适用公钥密码系统,因为只有掌握私钥的收信人才能解出用于解密消息的密钥。

接下来学啥呢?

非常感谢你能坚持阅读到这里,干货到此为止。现在你已经对流密码、分组密码以及公钥密码有了足够的了解,在赞叹密码学今天的发展成果之余也有基础开启新的学习道路。

对于想进一步深入的读者,我强烈推荐学习斯坦福的在线课程 Cryptography I Course ,它很好讲述了密码学中的技术和理论概览。另一个不得不提的资源是这本 Crypto 101 ,它介绍了密码学中在多个领域的灵活运用,以及如何发现密码系统的常见漏洞。对于有兴趣在真实世界中利用编程手段实践密码攻防的读者,我强烈推荐 Cryptopals 挑战 。

(完)

原文链接: https://medium.com/dataseries/a-crash-course-in-everything-cryptographic-50daa0fda482

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
密码学基础
密码学入门科普(加密、签名、证书、HMAC、CA、PKI) · 语雀
现代密码学
《密码学系列》——分组密码
密码学及公钥基础设施入门 | Linux 中国
从凯撒密码到公钥加密的兴起,数学中同余运算是如何发挥作用的?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服