非常好的密码学系列视频导论 自行扶梯
本文介绍DES3DESAES算法,发现密码学这东西的套路是一环一环的,粗略的回顾一下费斯特(feistel cipher)加密公式,加密过程:
m=(L0,R0)
For each round : i=1,2,3,4…..n
Li=Ri-1
Ri=Li-1⊕Functions(Ri-1,Ki )
进过n轮迭代之后,得出
c=(Ln,Rn)
k指的是subkey ,解密过程:
i=n,n-1,n-2….1
Ri-1 = Li
Li-1 = Ri ⊕ Functions (Ri-1,Ki )

把上一篇密码学后面三个小章节回顾一下,好了,开始写一篇关于对称密码学的
stream cipher
block cipher
feistel cipher

对称加密简介

一句话,加密解密使用同一把密钥,其他百度。


#### DES加密


Data Encryption Standard,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准,至今暴力破解仍然是对 DES 最有效的攻击手法。
> 有一段撕逼情节,主角是美国国家标准局(National Bureau of standards )和美国国家安全局(National Security Agency)。DES 雏形是 IBM 提出,经过 NSA 的修改后成为如今的 DES 。

DES 属于block cipher
区块大小是 64 bit
key 的长度是 56 bit
加密轮数 16轮
每轮的 key 长度是 48 bit
DES 的核心安全保障在于 Substitution-box 操作,也就是常说的 S 盒。IBM 的提案里面的 key 是128 bit ,经过 NSA 修改了 S 盒之后,就变成了 56 bit 。
> 是的,Key 变短了,那么安全性会变化么?还有就是 NSA 改了之后,会不会有后门?密码学中规定,算法的流程和算法过程需要对全部人公开。

DES 类似 Feistel cipher 架构,算法操作流程大概是这样的:
DES 属于block cipher,先把数据等分成左边和右边,这里先假设数据不需要填充,刚刚好是 64 bit 的大小,那么会有:
64 bit = 32 bit + 32 bit = L0 + R0
先看看简单的左半边,直接就是 : Li = Ri-1,
右半边是:
Ri = Li-1 ⊕ Functions (Ri-1,Ki ) ,简单说明就是先经过从32 bit 扩充到 48 bit,然后做一个⊕的运算,得出的结果依然是 48 bit,此时有八组的S-box,完成之后进入P-box,最终出来的是32 bit的数据。

刚刚需要异或运算的情况,是这样:

key 先做简单的切割转换,压缩之后的结果参与运算,同时,key 会继续参加一下次的迭代运算。
好的,以上S-box、P-box、key的压缩等等所有的流程都是公开的,S-box 和 P-box 其实只是做重新排列,S-box的表在网上可以查到。原本 6X8=48bit 的数据,经过 S-box 之前变成了 4X8=32 bit ,令人佩服的是,S-box的设计真的很巧妙,下面是八组 S-box 中的 S1 :

标准一点的图示就是这样的:

Triple DES

Triple DES 也叫做 3DES,由于计算机性能的发展,DES原本56 bit 的 key 总不能一直用下去,虽然至今没有出现什么大问题。

Q1 :
Triple DES的Key长度是 112 bit 还是 168 bit ? 没错,Triple DES 只需要两把Key做运算,也就是112 bit

我们来做一次高中的数学证明题,已知:
对称加密算法中,加密和解密的Key是一样,则存在推论一:
m = Dk (Ek(m))
c = Ek (Dk(c))
根据对称加密算法的性质,可知推论二:
m ≠ Dk2 (Ek1(m))
c ≠ Ek2 (Dk1(c))
假设Triple DES 使用了三把不同的Key,就会有:

由推论二得知,把Ek3替换成Ek1,并不影响加密效果

所以Triple DES 完全可以只用两把Key就可实现加密,好处在于减少计算量,降低协商密钥的难度,而且向下兼容原本的 DES,当一端使用 DES,另一端使用 Triple DES 的时候,只需要这样:

Q2 :
既然只用了两把key,为什么不叫 Double DES

假设我们就用了Double DES ,那么就会存在下面两个公式:
c = Ek2 (Ek1(m))
m = Dk1 (Dk2(c))
如果上面两个公式,采用暴力破解的话,需要尝试 2112次,基于对称加密算法的性质,我们的公式可以变成这样:
Dk2(c) = Ek1(m)
转换之后的公式,暴力破解就变成了需要尝试256次,和 DES 没有区别。

Q3 :
Triple DES 怎么就解决了 Double DES 的问题?


同样的,左边的两条公式可以转换成右边的两条公式,且上文 Q1 已经证明,key3 可以当作是 Key1,所以转换之后,等式依然成立。此时暴力破解需要尝试的次数为2112

AES

Advanced Encryption Standard,由比利时密码学家Joan Daemen和Vincent Rijmen所设计。DES和Triple DES 也可以用,但是由于NSA参与了DES原型修改,所以有人担心存在后门。

美国国家标准局NSB改名,变成美国国家标准技术研究所,Naltional Institute of Standards and Technology,同时开启了下一代标准算法的征集计划,这次和NAS没什么关系。

时代在发展,AES 不再使用 Feistel cipher 架构,不再是仅对分区后的半边做运算,AES 的 key 可以是 128 、 192 、256 bit ,block size 是 128 bit ,迭代会执行 10-14 次,这个取决于 key 的长度是多少。 AES 的每一轮会有四个动作:SubBytes、ShiftRows、MixColumns、AddRoundKey。

  1. SubBytes
    类似DES的S-box,代替法,非线性的,但是内在数学基础让它可以反推算出原本的值,这一步是整个AES算法里面最核心的技术保证。把128 bit 的 block 变成了 4*4 字节大小。

    ![](https://i.ooxx.ooo/2018/07/26/1eca1a4d9f96def32f7b6667120d1833.jpg)
    
  2. ShiftRows、MixColumns
    做扩散(Diffusion)和混淆(Confusion)的操作。扩散保证了明文和密文之间强联系性,密文小小的变化,都会导致明文结果出现很大的不同,就是下一篇文章会提到Hash函数的雪崩性;混淆提供的是密文和密钥的弱关联性,使得无法通过分析大量密文得出明文。

    ![](https://i.ooxx.ooo/2018/07/26/61eaff2c137281e5619c97cd1043a22c.jpg)     
    
    ![](https://i.ooxx.ooo/2018/07/26/69b9b852ba3882c5283f7567194151d1.jpg)
    

3.AddRoundKey
把上三轮的操作加在一起。

2018年4月29日修改:

“混淆提供的是密文和明文的弱关联性”中存在错误,应该是密文和密钥的弱关联性。