一、一些基础概念
1、分组密码[Block Encryption]和流密码[Stream Encryption]
分组密码就是一组一组的加密,流密码就是对每一bit加密。
2、分组密码加密的基本操作代换(Substitution)与置换(Transposition)
3、混淆(Confusion)与扩散(Diffusion)
混淆和扩散都是说密文中一位的改变应该影响原文中多个位的值。
混淆强调的是这种改变应该是不可预测的,扩散强调的是这种改变应该是均匀的分布在所有的原文中的。
二、Feistel密码结构
参数:
1、分组大小[Block size]:分组越大安全性越高,但是加解密速度会降低。
2、密钥大小[Key size]:密钥越长安全性越高,但是加解密速度会降低。
3、迭代轮数[Number of rounds]
4、子密钥产生算法[Sub-key generation algorithm]
5、轮函数[Round function]
三、DES
1、加密前会对明文进行分组,每一组长64,对每一组跑des加密,然后串起来就是整个的密文,密钥是64位,但实际的只有56位,有8位用于奇偶校验。
2、整体流程
IP置换就是把这64位放进一个置换盒里重新排列
3、16轮迭代
每轮都会按这个规则迭代,首先右边的32bit直接挪到左边,然后右边的要进一个置换(E表),32位会被扩散成48位。
然后再和子密钥去做代换(S盒),子密钥怎么来的呢,一开始是56bit密钥,一开始先要做一次置换(PC-1),然后再分成两个28bit,然后分别做循环左移位,什么叫循环左移位,就是每轮移完位保留移完位的结果,下一轮的移位从这个结果开始。移位完左右并起来,进压缩置换盒(PC-2),从56位变成48位。
这下有了48位从E表出来的,和48位的sub密钥,做一次异或,得到48位,出来分成8组,每组6位,进8个S盒。
这是一个s盒的例子,假如进S盒的是010110,首位和末位决定盒的行,中间四位决定s盒的列,那么这个输出就是第0行的第11列,出来就是12(十进制),换成二进制4bit输出就是1100.
48位进S盒,出来是8*4=32位,这32位再做一次置换(P盒),然后再和左边的32bit做一次异或,写进右边。
这样一轮就结束了。
等16轮结束之后再对这64bit做ip逆置换,就是密文。
四、DES改进
56bit密钥的DES已经被认为是不够安全的了,有几种DES的改进。
1、双重DES
DES的密钥空间是2的56次方,那么把同样的明文进行两次DES,不就有两个密钥,那要破解不就得穷举2的112次方种密钥情况吗。理论上是这样的,但是双重DES怕一种叫做途中相遇攻击的攻击。
已知明密文对,可以先穷举2的56次方个密钥,对明文加密,然后存起来这2的56次方个结果,然后再用这2的56次方个密钥对密文解密,如果加密的结果和解密的结果一样,那么密钥就出来了,这样理论只需要2^56+2^56次,也就是2^57次。密钥空间相当于只翻了一倍,没有达到预期的效果。
2、三重DES(TDEA)
加密:使用K1加密,使用K2解密,使用K3加密,得出密文。
解密:使用K3解密,使用K2加密,使用K1解密,得出明文。
这样密钥空间就是2^168,基本不可能破解了,但是加密解密的成本太高。
五、AES
不是feistal结构。分组大小只能是128bit,但是密钥大小可以是128、192、256.
这里以128bit密钥为例。先把明文和密钥都列优先写成byte矩阵形式
1、首先128bit明文先和密钥做异或。
2、进入循环,每轮循环有四件事,最后一轮循环只有三件事,没有列混合
1)byte代换:
拿上面的结果,对每一byte进行拆分,左4bit和右4bit,各为一个16以内的二进制数,再去一个16*16的代换矩阵里找结果,这里的例子,0100 0111,就是4和7,那么就直接拿代换矩阵的第4行第7列的byte替换。
2)行移位:
很简单,就是对刚才的结果,每行左移,第几行就左移几位
3)列混合:
大概是左乘了一个规定好的矩阵,这个矩阵如下,
但不同的是,这个矩阵乘法是在field GF(2^8)里进行的,所以不大一样,具体规则如下。
这个矩阵只有1、2、3,矩阵乘法的原则和原来还是大差不差,左矩阵的行乘右矩阵的列,再相加,只不过这里的加变成了二进制按位异或,这里的乘规则如下
乘1就相当于没乘;
乘2:
分情况,如果被乘数首位为0,那么就左移一位末位补0,如果被乘数首位为1,那么就左移一位末位补0,然后再和00011011异或。
乘3:就是2乘被乘数,再和被乘数做异或,就相当于做了个分配律。
4)轮密钥加:
上一轮得到的结果在和一个轮密钥矩阵做异或,这个轮密钥矩阵是一开始的密钥矩阵扩展来的,扩展规则如下。
首先明确,如果要进行10轮异或,那么就需要10张密钥矩阵,每张密钥矩阵都由4列字组成,1字=4byte。所以这也解释了,为什么128位密钥扩展之后要176byte,一张矩阵16byte,初始的矩阵一上来就用过了,所以加上后续10轮还需要用的,就是176byte。
然后,如何扩展,一列一列扩展,这列扩展的算法取决于该列列数是否为初始矩阵列数的倍数,以128位密钥为例,初始密钥矩阵列数位4列,那么在扩展时,就要考虑该扩展列是否为4的倍数。例如,一开始已经有了0、1、2、3列,该扩展第4列了,那么这个就是4的倍数。
算法如下,
如果不是4的倍数
如果是4的倍数
就是说,不是4的倍数的话,直接拿这两列异或就好,是的话还要对i-1列做一个T函数变换之后再异或。
T函数分三步:
a.字循环:将该列的字左移一个字节,例如原来09 cf 4f 3c,左移之后就变成cf 4f 3c 09。
b.字节代换:把该列的每个字节按照先前代换的逻辑,去那个16*16的S盒代换了去。
c.轮常量异或:要在和轮常量矩阵里的第j列做异或,j是轮数,从1开始。
这三步走完之后就是过了T的了,正常和第i-4列异或就是新列了。
至此,AES步骤就结束了
对着这张图总结一下,一开始上来先和密钥异或,然后走9轮4步骤拉满的,最后一轮是只有三步,没有列混合的。