学习现代加密方法
毫不奇怪,现代加密方法比刚刚讨论的历史方法更安全。本节中讨论的所有方法目前都在使用,并且被认为相当安全。请注意,DES 是一个例外,但这只是因为它的密钥长度较短,已经被归到不安全算法。
在某些情况下,这些方法背后的算法需要对数学有深入的理解。数论通常构成加密算法的基础。幸运的是,对于我们的目的来说,掌握这些加密算法的确切细节并不重要;重要的是要了解这些加密算法的具体细节。这意味着您不需要很强的数学背景就可以理解本材料。更重要的是对特定加密方法的工作原理及其安全性的总体了解。
对称加密
对称加密是指使用相同的密钥来加密和解密明文的方法。
数据加密标准
数据加密标准(通常称为DES)由IBM于20世纪70年代初开发,并于1976年公开。DES使用对称密钥系统。回想一下我们之前的讨论,这意味着使用相同的密钥来加密和解密消息。DES使用短密钥并依靠复杂的过程来保护其信息。实际的DES算法相当复杂。然而,基本概念如下:
3.最后,对数据进行最后一次转置。
DES使用应用于64位块的56位密钥。实际上有一个64位密钥,但每个字节的一位实际上用于错误检测,只留下56位用于实际密钥操作。
DES是一种Feistel密码,有16轮,每轮有48位轮密钥。轮密钥只是根据密钥调度算法从每轮密码密钥派生的子密钥。DES的一般功能遵循Feistel方法,将64位块分为两半(每半32位;这不是不平衡的Feistel密码),将轮函数应用于一半,然后将该输出与另一半进行异或。
首先要解决的问题是关键时间表。DES如何每轮生成一个新的子密钥?这个想法是采用原始56位密钥并在每一轮中对其进行稍微排列,以便每一轮都应用稍微不同的密钥,但该密钥基于原始密码密钥。为了生成轮密钥,56位密钥被分成两个28位半部分,并且这些半部分在每轮之后循环移位一位或两位。这将为每轮提供不同的子密钥。在每轮算法的轮密钥生成部分(回想一下,这称为密钥调度)中,原始密码密钥的两半(加密的两个端点必须交换的56位密钥)被移动特定的位置、数量。
一旦为当前回合生成了回合密钥,下一步就是对将输入到回合函数中的原始块的一半进行寻址。回想一下,两半都是32位。轮密钥为48位。这意味着轮密钥与其将要应用的半块的大小不匹配。您无法真正将48位轮密钥与32位半块进行异或,除非您只是忽略轮密钥的16位。如果这样做,基本上会使轮密钥变得更短,从而降低安全性,因此这不是一个好的选择。
在与轮密钥进行异或之前,32位的一半需要扩展为48位。这是通过复制一些位来实现的,以便32位的一半变成48位。
这个扩展过程其实很简单。要扩展的32位被分成4位部分。每一端的位都是重复的。如果将32除以4,答案是8。因此,这样的4位分组有8个。如果复制每个分组的结束位,则会在原始32位的基础上添加16位,从而总共提供48位。
同样重要的是要记住,两端的位都是重复的;这将是回合函数稍后的关键项目。也许这个例子将帮助您理解此时发生的情况。让我们假设32位,如下所示:
11110011010111111111000101011001
现在将其分为八个部分,每个部分4位,如下所示:
1111 0011 0101 1111 1111 0001 0101 1001
现在,每一个都有重复的结束位,如下所示:
1111 变为 111111
0011 变为 000111
0101 变为 001011
1111 变为 111111
1111 变为 111111
0001 变为 000011
0101 变为 001011
1001 变为 110011
现在将所得48位字符串与48位轮密钥进行异或。这是每轮中使用的轮密钥的范围。现在它被省掉了,并且在下一轮中,将从56位密码密钥的两个28位半部分派生出另一个48位轮密钥。
现在我们有了XOR运算的48位输出。现在它被分成八个部分,每个部分6位。对于本解释的其余部分,我们将仅关注这些6位部分之一,但请记住,对所有八个部分都执行相同的过程。
6位部分用作s-box的输入。s-box是一个接受输入并根据该输入生成输出的表。换句话说,它是一个替换框,用于替换输入的新值。DES中使用的s-box已发布,第一个如图所示。
图 第一个DESs-box
请注意,这只是一个查找表。两端的2位显示在左列中,中间的4位显示在顶行中。它们被匹配,结果值是s-box的输出。例如,对于我们之前使用的演示数字,我们的第一个块将是111111。因此您会在左侧找到1xxxx1,在顶部找到x1111x。结果值为十进制13或二进制1101。
最后,您生成了32位,它们是轮函数的输出。然后,为了与Feistel结构保持一致,它们与未输入轮函数的32位进行异或,并且交换两半。DES是一种16轮Feistel密码,这意味着该过程重复16次。
关于DES,只剩下两个部分需要讨论。第一个是初始排列,称为IP,然后是最终排列,它是IP的逆。
DES的优势之一是效率。DES的一些实现提供了每秒数百兆字节的数据吞吐率。简单来说,这意味着它可以非常快速地加密大量数据。您可能会认为16个步骤会导致加密速度相当慢;事实上,16个步骤会导致加密速度非常慢。然而,使用现代计算机设备时情况并非如此。DES的问题与所有对称密钥算法都存在相同的问题:如何在不泄露密钥的情况下传输密钥?这个问题导致了公钥加密的发展。
DES的另一个优点是它对文本进行置乱的复杂性。DES使用16个单独的轮对文本进行加扰。这会产生一个很难破解的乱序文本。不再使用DES,因为短密钥大小不再足以抵御暴力攻击。然而,称为Feistel网络或Feistel密码的整体结构是当今仍在使用的许多算法(例如Blowfish)的基础。
正如已经提到的,DES使用的密钥不再被认为足够长。现代计算机可以暴力破解56位密钥。DES中使用的算法实际上是相当不错的。它是第一个广泛使用的Feistel结构,该结构仍然是分组密码的良好基础。
随着计算机变得越来越强大,人们开始寻找DES的替代品。最终,Rijndael密码将用于高级加密标准(AES)并取代DES。在此期间,我们的想法是使用多个DES密钥进行加密。理想情况下,使用三个独立的56位密钥;因此,这个临时解决方案被称为三重DES或3DES。在某些情况下,仅使用两个DES密钥,并且算法交替应用它们。
Blowfish
Blowfish是一种对称分组密码。这意味着它使用单个密钥来加密和解密消息,并一次处理消息的“块”。它使用32到448位的可变长度密钥。密钥大小的这种灵活性使您可以在各种情况下使用它。Blowfish由Bruce Schneier于1993年设计。它已被密码学界广泛分析并获得广泛接受。它也是一种非商业(即免费)产品,因此对注重预算的组织具有吸引力。
仅供参考:分组密码和流密码
分组密码对固定长度的块(通常是64或128位)进行操作。在分组密码中,加密密钥和算法作为一组一次应用于数据块(例如,64个连续位),而不是一次应用于一位。流密码只是将文本视为持续的流,在遇到每个位时对其进行加密。流密码往往比分组密码更快。流密码生成密钥流(用作密钥的位序列)。加密是通过将密钥流与明文相结合来完成的,通常使用按位异或运算。
Twofish
Twofish是一种对称密码,是AES竞赛的五个决赛入围者之一。任何进入最后一轮的算法都是安全的,但由于效率、密钥大小或其他标准的原因而不会被选择。BruceSchneier也是研究该算法的团队的成员。Twofish是Feistel密码,类似于Blowfish和DES。Twofish使用128位块大小和128、192和256位密钥大小。与DES一样,它也有16轮。与Blowfish一样,Twofish没有专利并且属于公共领域,任何人都可以不受限制地使用。
Twofish使用依赖于密钥的s-box,并且具有相当复杂的密钥安排。有四个s-box,每个8位x 8位。密钥实际上被分成两半。一半用作钥匙;另一半用于修改关键相关s-box。
Twofish还使用一种称为美白的过程。密钥白化只是生成第二个密钥并将其与块进行异或。这可以在轮函数之前或之后完成。对于Twofish来说,它是在之前和之后完成的。明文在应用Twofish算法之前进行密钥白化,然后在应用Twofish算法之后再次进行密钥白化。在Twofish文档中,这称为输入白化和输出白化。对于Twofish,128位密钥材料用于输入和输出白化。
Twofish具有大多数其他Feistel密码中没有的某些方面,其中第一个是循环的概念。每两轮视为一个循环。Twofish的设计是这样的:在一个完整的周期(两轮)内,明文的每一位都被修改了一次。第二个是左右半部的异或。右侧的两个32位字略有旋转。一个32位字左移1位;然后在异或之后,另一个32位字向右旋转1位。
AES
高级加密标准(AES)使用Rijndael算法。该算法的开发者建议了该名字的多种替代发音,包括“reign dahl”、“rain doll”和“rhine dahl”。该算法由两名比利时研究人员开发,他们是质子世界国际公司的Joan Daemen和天主教鲁汶大学电气工程系博士后研究员Vincent Rijmen。
AES指定三种密钥大小:128、192和256位。相比之下,DES密钥的长度为56位,而Blowfish允许最大长度为448位。AES使用分组密码。
该算法被广泛使用,被认为非常安全,因此是许多加密场景的不错选择。
对于那些想要了解更多详细信息的读者,这里是AES中使用的过程的总体概述。该算法由几个相对简单的步骤组成,这些步骤在各个轮次中使用。步骤如下所述:
· AddRoundKey:状态的每个字节使用按位异或与轮密钥组合。这是Rijndael应用从密钥调度生成的轮密钥的地方。
· SubBytes:非线性替换步骤,根据查找表将每个字节替换为另一个字节。这是矩阵内容通过s盒的地方。每个s-box都是8位。
· ShiftRows:转置步骤,其中状态的每一行循环移位一定数量的步骤。在此步骤中,第一行保持不变。第二行中的每个字节都向左移动一个字节(最左边环绕)。第三行的每个字节向左移动两位,第四行的每个字节向左移动三位(再次环绕)。
· MixColumns:混合操作,对状态的列进行操作,组合每列中的4个字节。在MixColumns步骤中,状态的每一列都与固定多项式相乘。
考虑到上述步骤,这就是Rijndael密码中执行这些步骤的方式。对于128位密钥,有10轮。对于192位密钥,有12轮。对于256位密钥,有14轮。
· 密钥扩展:第一步是使用Rijndael的密钥计划从密码密钥派生出轮密钥。密钥调度是如何根据发送者和接收者之间交换的加密密钥为每轮生成密钥。
· 初始回合:此初始回合将仅执行AddRoundKey步骤。这只是与轮密钥进行异或运算。第一轮执行一次,然后执行后续轮次。
· 回合:算法的此阶段按以下顺序执行几个步骤:
o 子字节
o 行移
o 混合列
o 添加轮密钥
· 最后一轮:本轮拥有轮次阶段的所有内容,但没有混合列:
o 子字节
o 行移
o 添加轮密钥
在AddRoundKey步骤中,子密钥与状态进行异或。对于每一轮,都会使用Rijndael的密钥时间表从主密钥派生出一个子密钥;每个子密钥的大小与状态相同。
IDEA
国际数据加密算法(IDEA)是另一种分组密码。该特定算法一次处理两个64位数据块,并使用128位密钥。该过程相当复杂,使用密钥生成的子密钥对64位明文块的各个片段进行一系列模运算和异或运算。该加密方案总共使用52个16位子密钥。这些是通过以下过程从128位子密钥生成的:
· 128位密钥被分成8个16位密钥,即前8个子密钥。
· 128位密钥的数字向左移动25位以形成新密钥,然后将其分为接下来的8个16位子密钥。
· 重复第二步,直到生成52个子密钥。加密由八轮加密组成。
Serpent
该算法由Ross Anderson、Eli Biham和Lars Knudsen发明。它被提交给AES竞赛但没有被选中,很大程度上是因为它的性能比AES慢。然而,在AES竞赛之后的几年里,计算能力急剧增加。这导致一些专家重新考虑在现代系统上使用Serpent。
选择分组密码
如果您决定采用分组密码,您会选择哪一种?我们在这里检查了几个,它们都有不同的优点和缺点。没有一个答案适合所有人。选择加密算法涉及几个因素。以下是一些需要记住的事情:
· 如果您加密大量数据,那么加密速度可能几乎与安全性一样重要。
· 如果您拥有标准的业务数据,那么几乎任何众所周知的、公认的加密方法都可能足够安全,并且您可以在决策过程中关注密钥长度和速度等问题。但是,如果您要发送高度敏感的数据,例如研究或军事数据,您应该更加关注安全性,即使以牺牲速度为代价。
· 仅当您需要时,可变长度密钥才很重要。如果您有一些在美国境内使用的加密产品和一些在美国境外使用的加密产品,那么至少需要两个长度。如果您有一些数据需要更严格的加密,即使这意味着速度较慢,而其他数据需要快速但不那么安全,那么可变长度密钥也很重要。
对称方法
除了算法本身之外,还有实现对称算法的方法。有些文本使用术语“模式”而不是方法。其中一些方法旨在提高密码的安全性;其他设计用于将分组密码更改为流密码。下面的列表检查了一些更常见的方法:
· ECB:最基本的加密模式是电子密码本(ECB)模式。消息被分成块,每个块都单独加密。这本质上是使用最初设计的密码,没有任何修改。这种方法的问题在于,如果您多次提交相同的明文,您总是会得到相同的密文。这为攻击者提供了一个开始分析密码以尝试导出密钥的地方。考虑这样一种情况:同一文本块在消息中的某个位置重复。这种情况实际上经常发生。如果你读这一段,你会发现有些词是重复的。“你”这个词出现了四次,“密码”这个词出现了三次,依此类推。
· CBC:使用密码块链接(CBC)模式,每个明文块在加密之前都会与前一个密文块进行异或。这意味着最终密文的随机性显着增加。这比电子密码本模式安全得多,也是最常见的模式。从字面上看,这意味着如果一次又一次重复相同的块,密文块仍然会有所不同。CBC依赖于XOR,这是一个计算上非常简单的操作。您不会注意到性能有任何下降。更实际地说,您应该始终使用CBC而不是ECB。
· PCBC:传播密码块链接(PCBC)模式旨在导致密文中的微小变化在解密和加密时无限传播。这种方法有时称为明文密码块链接。PCBC模式是CBC操作模式的变体。重要的是要记住,PCBC加密模式尚未作为联邦标准正式发布。
· CFB:在密码反馈模式下,先前的密文块被加密,然后将产生的密文与明文进行异或以产生当前的密文块。本质上,它会自行循环,增加所得密文的随机性。虽然CFB与密码块链接非常相似,但其目的有点不同。目标是采用分组密码并将其转换为流密码。输出反馈模式是用于将分组密码转换为同步流密码的另一种方法。
· Galois/Counter模式:Galois计数器模式(GCM)使用带有Galois验证的计数器模式。计数器模式由Whitfield Diffie和Martin Hellman于1979年提出,用于将分组密码转换为流密码。计数器模式与用于身份验证的伽罗瓦域乘法相结合。
琴键拉伸
有时需要加长键以使其更强。此过程通常称为键拉伸。密钥通过算法进行拉伸,或者使其更长。有两种广泛使用的密钥拉伸算法:
· PBKDF2(基于密码的密钥派生函数2)是PKCS #5 v.2.01的一部分。它将一些函数(如哈希或HMAC)与盐一起应用于密码或密码短语以生成派生密钥。(盐的概念稍后在“哈希”部分讨论。)
· bcrypt与密码一起使用,它本质上使用Blowfish算法的派生,转换为哈希算法,对密码进行哈希处理并向其添加盐。
PRNG
您已经看到对称密码都需要密钥。这些是如何生成的?事实上,称为伪随机数生成器(PRNG)的算法用于生成这些密钥。真正的随机数只能由放射性衰变等自然现象产生。这对于加密数据来说并不方便。因此,我们使用产生“足够随机”的数字的算法,这些算法是伪随机数生成器。是什么让PRNG“足够好”?人们想要的属性有以下三种:
· 不相关序列:序列不相关。您不能采用给定的一段数字(例如16位)并用它来预测后续位。
· 长周期:理想情况下,一系列数字(通常是位)不应有任何重复模式。然而,现实是最终会出现一些重复。重复之间的距离(以数字或位为单位)就是周期。周期越长越好。
· 一致性:伪随机数通常以二进制格式表示。1和0的数量应该相等,但它们不需要以任何可辨别的模式分布。随机数的序列应该是均匀且无偏差的。
德国联邦信息安全办公室(BSI)为随机数生成器的质量制定了四项标准:
· K1:包含相同连续元素的概率较低的随机数序列。
· K2:根据指定的统计测试,与“真正的随机”数字无法区分的数字序列。
· K3:任何攻击者都不可能根据任何给定的子序列或序列中任何先前或未来的值进行计算或猜测。
· K4:攻击者应该不可能计算或从生成器的内部状态猜测序列中的任何先前数字或任何先前的内部生成器状态。
中方法
存在多种用于生成伪随机数的算法。本章的目的不是让你精通这些算法;而是让你精通这些算法。然而,您可以通过检查旧的算法(当今的算法并不安全)来深入了解PRNG的功能。这是一种相当简单且易于遵循的方法。以下是中平方法的分步说明:
步骤1。从初始种子(例如,四位整数)开始。
第2步。将数字平方。
步骤3.取中间四位数字。
步骤4。该值成为新的种子。将数字除以10,000。这成为随机数。转到步骤2。
下面是一个具体的例子:
步骤1。x0=1234
第2步。x1:12342=01 5227 56→ x 1 = 5227, R 1 = 0.5227
步骤 3.x 2 : 5227 2 = 27 3215 29→ x 2 = 3215, R 2 = 0.3215
步骤4。x 3 : 3215 2 = 10 3362 25→ x 3 = 3362, R 3 = 0.3362
该过程无限重复,每次都会生成一个新的随机数。每个输出的中间4位是算法下一次迭代的种子。
这是一个非常古老的算法。它是由十三世纪的方济各会修道士首次描述的。然后它被约翰·冯·诺依曼重新引入。它有许多弱点,今天不会被使用。然而,该算法对伪随机数生成器做了很好的介绍,因为它很容易理解,而且坦率地说,如果您有兴趣在程序中实现它,则很容易编写代码。
现代方法
线性同余生成器是一种依赖于线性方程来生成伪随机序列的算法。更具体地说,它取决于分段线性同余方程。分段线性函数本质上只是一个根据输入产生不同结果的线性函数。
Blum Blum Shub算法由Lenore Blum、Manuel Blum和Michael Shub于1986年提出。Blum Blum Shub的格式如下:
Xn+1=Xn2模M
M=pq是两个大素数p和q的乘积(这应该让您想起RSA算法)。在算法的每一步,都会从Xn+1导出一些输出。预测Blum Blum Shub输出的主要问题是基于所谓的“二次残差问题”的难度。简单地说,这个数学问题如下:给定一个合数n,找出x是否为模n的完美平方。事实证明,解决这个问题就像破解RSA公钥密码系统一样困难。换句话说,这在经典计算机上实际上是不可能的。这使得Blum Blum Shub成为一个非常有效的PRNG。
Fortuna不是一个单一的算法,而是一组PRNG,并且它有很多实现该算法的选项。一般方法包含三个主要组成部分:
· 一个生成器,它被播种并产生伪随机数据。
· 熵累加器从各种来源收集随机数据并使用它来重新为生成器播种。
· 具有初始种子值的种子文件。
该算法使用基于任何安全分组密码的生成器。分组密码可以是DES、3DES、AES、Blowfish等。该算法以计数器模式运行。计数器模式生成随机数据流,这将是Fortuna的输出。这是因为计数器模式通常用于将分组密码转换为流密码。由于序列最终可能会重复,因此建议定期更换用于分组密码的密钥。它通过加密计数器的连续值来生成下一个密钥流块。理想情况下,生成每个数字后,算法会生成一个用于下一个PRNG的全新密钥。
公钥加密
公钥加密本质上与单密钥加密相反。对于任何公钥加密算法,一个密钥用于加密消息(称为公钥),另一个密钥用于解密消息(称为私钥)。您可以自由分发您的公钥,以便任何人都可以加密发送给您的消息,但只有您拥有私钥,并且只有您可以解密该消息。键的创建和应用背后的实际数学有点复杂,超出了本书的范围。许多公钥算法在某种程度上依赖于大素数、因式分解和数论。
RSA
RSA方法是一种广泛使用的加密算法。如果不讨论RSA,就无法讨论密码学。这种公钥方法由三位数学家于1977年开发:Ron Rivest、Adi Shamir和Len Adleman。RSA这个名字源自每位数学家姓氏的第一个字母。
RSA的一个显着优点是它是一种公钥加密方法。这意味着无需担心分发加密密钥。然而,RSA比对称密码慢得多。事实上,一般来说,非对称密码比对称密码慢。
创建密钥的步骤如下:
1.生成两个大小大致相等的随机大素数p和q。
2.选择两个数字,以便当它们相乘时,乘积将达到您想要的大小(即2048位、4096位等)。
3.现在将p和q相乘得到n。
4.设n=pq。
5.将每个素数乘以欧拉totient。如果您不熟悉这个概念,欧拉的totient是互质数的总数。如果两个数没有公因数,则它们被视为互质。例如,如果原始数字是7,则5和7互质。碰巧的是,对于素数,这总是减1的数。例如,7有6个与它互质的数(如果你稍微考虑一下,你会发现1、2、3、4,5,6都与7)互质。
6.设m=(p–1)(q–1)。
7.选择另一个号码;拨打此号码e。您希望选择e使其与m互质。
8.找到一个数字d,当它乘以e并模m时,会得到1。(注:模意味着将两个数字相除并返回余数。例如,8模3将得到2。)
9.求d,使得de mod m == 1。
现在您发布e和n作为公钥,并保留d和n作为秘密密钥。
要加密,您只需将消息进行e次方并取模n即可:
= M
e
% n
要解密,您需要获取密文,并将其提高到模n的d次幂:
P = C
d
% n
如果这一切对您来说似乎有点复杂,您必须意识到许多从事网络安全工作的人并不熟悉 RSA 的实际算法(或任何其他与此相关的密码学)。您还可以通过使用小整数演练该算法来更好地了解 RSA。
通常 RSA 使用非常大的整数来完成。为了使数学易于理解,此示例使用小整数(注意:此示例来自维基百科):
1.选择两个不同的素数,例如p = 61 和q = 53。
2.计算n = pq,给出n = 61 × 53 = 3233。
3.将乘积的总数计算为 Φ( n ) = ( p − 1)( q − 1) ,得出 Φ(3233) = (61 − 1)
(53 − 1) = 3120。
4.选择与3120 互质的任意数字 1 < e < 3120。为e选择质数后,我们只需检查e是否不是 3120 的约数。令e = 17。
5.计算d,如前所示,使得de mod m == 1;产生d = 2753。
6.公钥是(n = 3233,e = 17)。对于填充明文消息m,加密函数为m 17 (mod 3233)。
7.私钥是(n = 3233,d = 2753)。对于加密的密文c,解密函数为c 2753 (mod 3233)。
RSA 基于大素数。您可能会想,“难道有人不能获取公钥并使用因式分解来导出私钥吗?” 嗯,假设是的。然而,事实证明,将非常大的数字分解为质因数是相当困难的。不存在有效的算法来做到这一点。“大数字”是指 RSA 可以使用 1024、2048、4096 位和更大的密钥。这些构成了一些巨大的数字。当然,如果有人发明了一种有效的算法,可以将大量数字分解为素因数,那么 RSA 就会死掉。
RSA已经成为一种流行的加密方法。它被认为非常安全,通常用于需要高级别安全性的情况。
Diffie-Hellman
现在您已经了解了 RSA,接下来考虑一些其他非对称算法。最著名的可能是 Diffie-Hellman,它是第一个公开描述的非对称算法。
该加密协议允许两方通过不安全的通道建立共享密钥。换句话说,Diffie-Hellman 通常用于允许各方通过某些不安全的介质(例如互联网)交换对称密钥。它是由 Whitfield Diffie 和 Martin Hellman 于 1976 年开发的。一个有趣的事实是,该方法实际上是由英国情报局的 Malcolm J. Williamson 几年前开发的,但它是机密的。
ElGamal
ElGamal 基于刚刚描述的Diffie-Hellman 密钥交换算法。它由 Taher Elgamal 于 1984 年首次描述。它在 Pretty Good Privacy (PGP) 的某些版本中使用。
MQV
与 ElGamal 一样,MQV(Menezes-Qu-Vanstone)是基于 Diffie-Hellman 的密钥协商协议。它首先由 Menezes、Qu 和Vanstone 于 1995 年提出,并于 1998 年进行修改。MQV 被纳入公钥标准 IEEE P1363。
数字签名算法
数字签名算法(DSA)在 1991 年 7 月 26 日提交的美国专利 5,231,668中有所描述,归属于 David W. Kravitz。它于1993 年被美国政府通过 FIPS 186 采用。尽管任何非对称算法都可以用于数字签名,但该算法就是为此目的而设计的。
椭圆曲线
椭圆曲线算法由 Victor Miller (IBM) 和 Neil Koblitz(华盛顿大学)于 1985 年首次描述。
椭圆曲线密码学的安全性基于以下事实:求随机椭圆曲线元素相对于公知基点的离散对数是困难到不切实际的。
椭圆曲线的大小决定了算法寻找的难度,进而决定了实现的安全性。具有大模数的基于 RSA 的系统所提供的安全级别可以通过更小的椭圆曲线群来实现。实际上有多种 ECC 算法。有 ECC 版本的Diffie-Hellman、ECC 版本的 DSA 等等。
美国国家安全局已认可 ECC(椭圆曲线加密),将基于它的方案纳入其 Suite B 推荐算法集中,并允许使用 384 位密钥来保护机密信息。
数字签名
数字签名使用非对称加密技术,但顺序相反。考虑这样一种情况,其中关注的不是数据机密性,而是验证谁发送了消息。也许你收到老板发来的一封电子邮件,告诉你下周应该带薪休假。您最好验证此消息确实来自您的老板,而不是来自同事恶作剧的欺骗消息。数字签名可以实现这一点。
消息的某些部分(通常是消息的哈希值)使用用户的私钥进行加密(或签名)。当然,由于任何人都可以访问该发送者的公钥,因此此过程对于保密性没有任何作用。但任何收件人都可以使用发件人的公钥验证签名,并确信发件人确实发送了消息。
原文始发于微信公众号(河南等级保护测评):网络安全等级保护:学习现代密码知识
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论