目录
3.5 DES(Data Encryption Standard)
3.1 炒鸡蛋与对称密码
无重要内容。
3.2 本章学习主要内容
- 比特序列运算与XOR运算(异或)
- 一次性密码本
- 对称密码算法:DES、3DES、AES以及其他一些密码算法
- 众多对称密码算法中,到底应该使用哪一种
3.3 从文字密码到比特序列密码
3.3.1 编码
计算机的操作对象是由0和1排列而成的比特序列。将现实世界中的东西映射为比特序列的操作称为编码。如下图:
3.3.2 XOR(异或)
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
- 将明文A用密钥B进行加密,得到(A⊕B)。
- 将密文(A⊕B)用密钥B进行解密,得到明文A。
只要选择一个合适的B,仅仅使用XOR可以实现一个高强度的密码。
能够产生不可预测的比特序列,对于密码技术的贡献是巨大的。这种不可预测的比特序列称为随机数。
3.4 一次性密码本–绝对不会被破译的密码
原理:将明文与一串随机的比特序列进行XOR运算。明文与密钥长度一样。
3.4.4 一次性密码本是无法破译的
一次性密码本无法破译的根源在于,无法确认破译后的字符串是否是正确的明文。
假设对 username 这个字符串进行XOR加密,那么在破译时,需要尝试所有的密钥,那么
破译时,既会出现 username 这个正确的字符串,也会出现比如 aaaaaaaa,bbbbbbbb 这样的规则字符串,也会出现 password 这样有意义的英文单词,也就是说破译后会出现明文中所有可能的字符组合,从中无法判断哪个才是正确的。
3.4.5 一次性密码本为什么没有被使用
- 密钥的配送:密钥的长度和密文是相等的。矛盾点 — 如果能够有一种方法将密钥安全地发送出去,那么岂不是也可以用同样的方法来安全地发送明文了吗?
- 密钥的保存:矛盾点通上面的一样,“保护明文” 和 “保护和明文一样长的密钥”一样矛盾,问题没有得到实质性的解决。
- 密钥的重用:绝对不能重用过去使用过的随机比特序列。
- 密钥的同步:密钥和明文长度一样。如果明文很长,密钥也会很长。会引发密钥同步的问题。
- 密钥的生成:需要生成大量的随机数,必须是真正的随机数,只有那些机密性重过一切的场合才会使用。
综上所述,一次性密码本是一种几乎没有适用性的密码。但是,一次性密码本的思路却孕育出了流密码。
关于流密码,将在第4章详细探讨。传送门——>
关于伪随机数生成器,将在第12章详细探讨。传送门——>
3.5 DES(Data Encryption Standard)
3.5.1 什么是DES
现在 DES 的密文可以在短时间内被破译,因此除了用它来解密以前的密文以外,现在不应该使用DES了。
3.5.2 加密和解密
DES是一种将 “64比特的明文” 加密成 “64比特密文” 的对称密码算法。DES的密钥长度是64比特,其中每隔7比特会设置一个用于错误检查的比特,因此实际上密码长度是56比特。
DES以64比特的明文为一个单位进行加密,这个64比特的单位称为分组,以分组为单位进行处理的密码算法称为 分组密码。DES就是分组密码的一种。
DES每次只能加密64比特的数据,如果要加密的明文较长,就需要对DES加密进行迭代,迭代的具体方式称为 模式。 将在第4章详细探讨。
3.5.3 DES的结构(Feistel 网络)
加密过程:
在 Feistel 网络中,加密的各个步骤称为 轮(round),整个加密的过程就是进行若干次轮的循环。DES是一种16轮循环的 Feistel 网络。
下图中就是 Feistel 网络中加密的一轮:
子密钥指的是本轮加密使用的密钥,在 Feistel 网络中,每一轮都需要使用一个不同的子密钥。
一轮的具体步骤如下:
- 将输入的数据等分为左右两部分
- 将输入的右侧直接发送到输出的右侧
- 将输入的右侧发送到轮函数
- 轮函数根据右侧数据和子密钥计算出一串看上去是随机的比特序列
- 将步骤4中得到的比特序列与左侧数据进行XOR运算,并将结果作为加密后的左侧
从这个过程中可以发现,一轮后右侧的数据没有加密,因此在每轮之间需要将左侧和右侧的数据对调。
如下展示了一个三层的 Feistel 网络加密过程:
解密过程:
我们尝试将一轮加密的输出结果用相同的子密钥重新运行一次,无论轮函数具体是什么,都能够将密文还原为明文。
有多轮的情况也一样,解密时只要按照相反的顺序来使用子密钥就可以了。
Feistel 网络的特点,总结来说:
- 轮数可以任意增加
- 加密时无论使用任何函数作为轮函数都可以正确解密
- 加密和解密可以用完全相同的结构来实现
在AES候选的5个算法中,有3个算法(MAR6,RC6,Twofish)都是使用了 Feistel 网络。
3.6 三重DES(3DES)
3.6.1 什么是三重DES
三重DES是为了增加DES强度,将DES重复三次得到的一种密码算法。缩写为 3SED。
3.6.2 三重DES的加密
明文经过三重DES处理才能变成最后的密文,DES密钥的长度实际上是56比特,因此三重DES的密钥长度就是56X3 = 168比特。 加密 -> 解密 -> 加密
三重DES的过程为什么是:加密 -> 解密 -> 加密?这是为了兼容普通的DES加密,如果三重的3个密钥都相同,三重DES也就等同于普通DES了。
3.6.3 三重DES的解密
解密过程与加密正好相反。
3.6.4 三重DES的现状
目前还被银行等机构使用,但是由于其处理熟读不高,除了特别重视向下兼容性的情况以外,很少被用于新的用途。
3.7 AES的选定过程
3.7.1 什么是AES
AES:是取代其前任标准(DES)而成为新标准的一种对称加密算法。
全世界提供了多个对称密码算法作为AES的候选,最终从这些候选中选出了一种名为 Rijndael 的对称加密算法。
3.8 Rijndael算法
3.8.1 什么是Rijndael
Rijndael 也是分组密码算法。2000年选为标准密码算法——AES。 AES分组长度固定为128比特,密钥长度只有128、192、256这三种。
3.8.2 Rijndael的加密和解密
Rijndael 算法也是多轮的,每一轮中分为4个步骤(SubBytes、ShiftRows、MixColumns、AddRoundKey),Rijndael使用了SPN结构。
加密过程,每一轮中的步骤大致如下:
解密过程:
其中的 InvMixColumns, InvShiftRows, InvSubBytes 分别为 MixColumns, ShiftRows,SubBytes 的反向运算。
更为详细的Rijndael算法介绍,请移步 ——> AES(Rijndael算法)详解
传送门2——>Rijndael密码算法
3.8.3 Rijndael的破译
目前:到现在还没出现针对Rijndael的有效攻击。
对Rijndael来说,每一步都是用数学公式来表达的,这是以前任何密码算法都不具备的性质。如果Rijndael的公式能够通过数学运算来求解,那就意味Rijndael能够通过数学方法进行破译,而这也就为新的攻击方式的产生提供了可能。
不过这还是一种假设。
3.8.4 应该使用哪种对称密码
- DES、3DES已经不安全了,不会再应用到任何新的用途。
- 现在大家应该使用AES(Rijndael),因为它快速、安全,并且能够在各种平台上工作。
AES最终候选算法应该可以作为AES的备份。和Rijndael一样,这些密码算法也都经过了严格的测试,且没发现任何的弱点。