当前位置 : 主页 > 编程语言 > 其它开发 >

对称密码(共享密钥密码)

来源:互联网 收集:自由互联 发布时间:2022-05-30
对称密码 DES 三重DES AES 用相同的密钥进行加密和解密 计算机的操作对象不是文字,而是由0和1排列而成的比特序列。无论是文字、图像、声音、视频还是程序,在计算机中都是用比特序
对称密码 DES 三重DES AES 用相同的密钥进行加密和解密

计算机的操作对象不是文字,而是由0和1排列而成的比特序列。无论是文字、图像、声音、视频还是程序,在计算机中都是用比特序列来表示的。
加密就是指明文的比特序列转换为密文的比特序列,将现实世界中的东西映射为比特序列的操作称为编码,将每个字母逐一进行编码,编码规则就是ASCII。

XOR 一个比特的XOR

0 XOR 0 = 0 (0与0的XOR结果为0)
0 XOR 1 = 1 (0与1的XOR结果为1)
1 XOR 0 = 1 (1与0的XOR结果为1)
1 XOR 1 = 1 (1与1的XOR结果为0)

比特序列的XOR

01001100 XOR 10101010 = 11100110
与加法运算不同,XOR不需要进位

一次性密码本的加密

一次性密码本(one-time pad)即便是用暴力破解法遍历整个密钥空间,一次性密码本也绝对无法被破译。一次性密码本是一种非常简单的密码,它的原理是“将明文与一串随机的比特序列进行“XOR运算”。将明文night字符串通过ASCII进行编码将产生一串比特序列。night的ASCII码如下图所示:

通过掷硬币的方式生成密钥并与明文的ASCII码进行XOR运算,如下图所示:

经上图操作即可得到用于传输的比特序列。

一次性密码本的解密

解密就是加密的反向运算,用米温和密钥进行XOR运算,就可以反推得到明文。

一次性密码本是无法破译的

这里所说的无法破译不是指在现实的时间内难以破译,而是指即便拥有一种运算能力无穷大的计算机,依然无法破译。假设对一次性密码尝试暴力破解,总有一天会尝试到加密是相同的密钥,也能得到明文night。但是得到该字符串时,无法确认这就是正确的明文!在整个破译过程中我们会得到其他类似的答案,规则的不规则的。大量的正确组合,但是无法从中辨认哪个才是正确的明文。该密码由维纳于1917年提出,又称维纳密码(Vernam cipher),无法破译由香农(E.Shannon)于1949年通过数学方法加以证明。故一次性密码本是无条件安全的,在理论上是无法破译的。

一次性密码本未被普及的原因

密码的配送:最大的问题是密钥的配送上,密钥与秘文是分立的,无法安全的传输密钥。
密码的保存:该加密方法只是讲“保护明文”变为“保护和明文一样长的密钥”。
密码的重用:不能重复使用同一个随机比特序列,否则一旦丢失将可破译以往所有密文。
密钥的同步:明文与密钥的长度文件大小一致,导致传输成本的增加,并且在通信过程中不允许错位,否则无法解密。

密钥的生成

在一次性密码本中,需要生成大量的随机数,这里的随机数并不是通过计算机程序生成的伪随机数。综上,一次性密码本是一种几乎没有实用性的密码,但是随之是流密码(stream cipher)的出现。流密码是用的不是真正的随机比特序列,而是为随机数生成器产生的比特序列。流密码是用的不是真正的随机比特序列。但是只要使用高性能的伪随机生成器,就能够构建出强度较高的密码系统。

DES

DES(Data Encryption Standard)是1997年美国联邦信息处理标准(FIPS)中所采用的一种对称密码(FIPS 46-4)。

加密和解密

DES是一种将64比特的明文加密成64比特的秘文的对称密码算法,他的密钥长度是56比特,严格来说DES的密钥长度是64比特,由于每隔7比特会设置一个用于错误检查的比特,因此实质上其密钥长度是56比特。DES是以64比特的明文(比特序列)为一个单位来进行加密的,这个64比特比特的单位称为分组。一般来说,一份组为单位进行处理的密码算法称为分组密码(block cipher)。DES每次只能加密64比特的数据,如果要加密的明文比较长,就需要对DES加密进行迭代(反复),而迭代的具体方式就称为模式(mode)。

DES的结构(Feistel网络)

DES的基本结构式由Horst Feistel设计的,因此也称为Feistel网络、Feistel结构、Feistel密码。在Feistel网络中,加密的各个步骤称为,整个加密过程就是进行若干次轮的循环。下图就是Feistel网络中一轮的计算流程。DES是一种16轮循环的Feistel网络。

图中上面的两个方框表示Feistel网络中一轮的输入(明文)。输入的数据被等分为左右两半分别进行处理。在图中,左半部分写作“左侧”,右半部分写作“右侧”。下面的两个方框表示本轮的输出(密文)。输出的左半部写作“加密后的左侧”,右半部分写作“右侧”。中间的“子密钥”指的是本轮加密所使用的密钥。在Feistel网络中,每一轮都需要使用一个不同的子密钥。由于子密钥只在一轮中使用,他只是一个局部密钥,因此才称为子密钥(subkey)
轮函数的作用是根据“右侧”和子密钥生成对“左侧”进行加密的比特序列,它是密码系统的核心。将轮函数的输出与“左侧”进行XOR运算,其结果就是“加密后的左侧”。也就是,用XOR将轮函数的输出与“左侧”进行了合并。而输入的“右侧”则会直接成为输出的“右侧”。
总结:
1)、将输入的数据等分为左右部分;
2)、将输入的右侧直接发送到输出的右侧;
3)、将输入的右侧发送到轮函数;
4)、轮函数根据右侧数据和子密钥,计算出一串看上去是随机的比特序列。
5)、将上一步得到的比特序列与左侧数据进行XOR运算,并将结果作为加密后的左侧。
但是存在一个缺陷,“右侧”根本没有被加密,因此我们需要用不同的子密钥对一轮的处理重复若干次,并在每两轮处理之间将两侧的数据对调。
关于解密操作只要按照相反的顺序来使用子密钥就可以完成,而根据Feistel网络本身的结构,在加密和解密事都是完全相同的。

Feistel网络的性质

1)、论数可以任意增加
2)、加密是无论使用任何函数作为轮函数都可以正确解密;
3)、加密和解密可以用完全相同的结构来实现;

差分分析与线性分析

差分分析是一种针对分组密码的分析方法。理论上,即便明文只改变一个比特,密文的比特排列也应该发生彻底的改变。于是通过分析密文改变中所产生的偏差,可以获得破译密码的线索。
线性分析也是一种密码分析方法。理论上,如果密文具备足够的随机性,则任选一些明文和密文的对应比特进行XOR并计算其结果为零的概率应该为1/2。如果能够找到大幅偏移1/2的部分,则可以借此获得一些与密钥有关的信息。使用线性分析法,对于DES只需要247组明文和密文就能完成破解,相比需要尝试256个密钥的暴力破解来说,所需的计算量得到了大幅减少。
差分分析和线性分析都有一个前提,假设密码破译者可以选择任意明文并得到其加密的结果,这种攻击方式称为选择明文攻击(Chosen Plaintext Attack, CPA)。以AES为代表的现代分组密码算法,在设计上已经考虑了针对差分分析和线性分析的安全性。

三重DES

三重DES(triple-DES)是为了增加DES的强度,将DES重复3次所得到的一种密码算法也称为TDEA(Triple Data Encryption Algorithm),通常缩写为3DES。

三重DES的加密


明文经过三次DES处理才能变成最后的密文,由DES密钥的长度实质上是56比特,因此三重DES的密钥长度就是56x3=168比特。
从上图中我们可以发现,三重DES并不是进行三次DES加密(加密->加密->加密),而是加密->解密->加密的过程。在加密算法中加入解密操作让人感觉很不可思议,实质上这个方法是IBM设计出来的,目的是为了让三重DES能够兼容普通的DES。
当三重DES中所有的密钥都相同时,三重DES也就等同于普通的DES了,这是因为在前两部加密->解密之后,得到的就是最初的明文。因此,以前用DES加密的密文,就可以通过这种方式用三重DES来进行解密。也就是说,三重DES对DES具备向下兼容性。如下图所示:

三重DES的解密

三重DES解密的过程和加密正好相反,是以密钥3、密钥2、密钥1的顺序执行解密->加密->解密的操作。

AES

AES(Advanced Encryption Standard)是取代其前任标准(DES)而成为新标准的一种对称密码算法。全世界的企业和密码学家提交了多个对称密码算法作为AES的候选,最终在2000年从这些候选算法中选出了一种名为Rijndael的对称密码算法,并将其确定为了AES。

什么是Rijindael

Rijindael的分组长度和密钥长度可以分别以32比特为单位在128比特到256比特的范围内进行选择。不过在AES的规格中,分组长度固定为128比特,密钥长度只有128、192和256比特三种。

Rijndael的加密和解密

和DES一样,Rijndael算法也是由多个轮构成的,其中每一轮氛围SubBytes、ShiftRows、MixColumns和AddRoundKey共四个步骤。DES使用Feistel网络作为其基本结构,而Rijndael没有使用Feistel网络,而是使用了SPN结构。Rijndael的输入分组为128比特,16字节。首先,需要逐个字节地对16字节的输入数据进行SubBytes处理。所谓SubBytes,就是以每个字节的值(0~255的任意值)为索引,从一张拥有256个值的替换表(S-Box)中查找出对应值的处理。就是讲一个1字节的值替换成另一个1字节的值。这个步骤用语言来描述比较麻烦,类似于简单替换密码。

SubBytes之后需要进行ShiftRows处理。这已不是将以4字节为单位的行(row)按照一定的规则向左偏平移,且每一行平移的字节数是不同的。下图所示为ShiftRows中对其中一行进行处理的情形。

ShiftRows之后需要进行MixVolumns处理。这已不是对一个4字节的字节行比特运算,将其变为另外一个4字节值。下图所示为MixColumns中对其中一列(column)进行处理的情形。

最后需要将MixColumns的输出与轮密钥进行XOR,即进行AddRoundKey处理。下图所示为AddRoundKey中对其中一个字节进行处理的情形。到这里,Rijndael的一轮就结束了。实际上,在Rijndael中需要重复进行10~14轮计算。

通过上面的结构我们可以发现输入的所有比特在一轮中都会被加密。和每一轮都只加密一半输入的比特的Feistel网络相比,这种方式的优势在于加密所需要的轮数更少。此外,这种方式还有一个优势,即SubBytes、ShiftRows和MixColumns可以分别以字节、行和列为单位进行并行计算。在Rijndael的加密过程中,每一轮所进行的处理为:
SubBytes->ShiftRows->MixColumns->AddRoundKey
而在加密是,则是按照相反的顺序来进行的,即:
AddRoundKey->MixColumns->ShiftRows->SubBytes

小结

本篇介绍了对称密码、DES、三重DES、AES和其它一些密码算法。
使用一些密钥空间巨大,且在算法上没有弱点的对称密码,就可以通过密文来确保明文的机密性。巨大的密钥空间能够抵御暴力破解,算法上没有弱点可以低于其他类型的攻击。上述密码算法都只能讲一个固定成都的明文长度超过分组长度时,就需要对密码算法进行迭代。

上一篇:SQL笔记——开端
下一篇:没有了
网友评论