算法背景介绍
该算法是由美国发明的,1997年NIST发布算法征集公告,98年入围15个候选算法,99年进入五强,00年凭借安全性,性能,大小实现特性为标准最终选定,01年正式发布AES标准。
选择AES主要有以下几个理由:
- 安全性:稳定的数学基础没有算法弱点,算法抗密码分析强度高
- 性能:能在多个平台上以较快的速度实现
- 大小:不占用大量的存储空间和内存
- 实现特性:灵活性,硬件和软件都使用,算法的简单性(过程简单,搞懂了是这样)
我在这里先给出一个框架图,第一遍直接可以跳过,怕吓住饱饱们,学懂了之后再来观看,思路清晰,操作稳健。
两头一个轮秘钥加,中间就四个渣渣轮转:字节代换、行位移、列混淆、轮秘钥加
基础知识
我们主要从中间四个部分讲解,在这里我将要补充两个基础知识:有限域GF(2 8 2^828)上的运算
加法’+':字节按位异或运算
( a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0 ) + ( b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 ) = ( c 7 c 6 c 5 c 4 c 3 c 2 c 1 c 0 ) 其 中 c i = a i + b i , i = 0 , 1 , 2 , 3 , . . . , 7 (a_7a_6a_5a_4a_3a_2a_1a_0)+(b_7b_6b_5b_4b_3b_2b_1b_0)=(c_7c_6c_5c_4c_3c_2c_1c_0) \\ 其中\ c_i\ =a_i+b_i,i=0,1,2,3,...,7(a7a6a5a4a3a2a1a0)+(b7b6b5b4b3b2b1b0)=(c7c6c5c4c3c2c1c0)其中 ci =ai+bi,i=0,1,2,3,...,7
乘法 ·
c ( x ) = a ( x ) ⋅ b ( x ) = a ( x ) ⋅ b ( x ) m o d m ( x ) a ( x ) = a 7 x 7 + a 6 x 6 + a 5 x 5 + a 4 x 4 + a 3 x 3 + a 2 x 2 + a 1 x + a 0 x b ( x ) = b 7 x 7 + b 6 x 6 + b 5 x 5 + b 4 x 4 + b 3 x 3 + b 2 x 2 + b 1 x + b 0 c ( x ) = a 7 x 7 + a 6 x 6 + a 5 x 5 + a 4 x 4 + a 3 x 3 + a 2 x 2 + a 1 x + c 0 m ( x ) = x 8 + x 4 + x 3 + x 2 + 1 \begin {aligned} c(x)&=a(x)·b(x)=a(x)·b(x)\ mod\ m(x)\\ a(x)&=a_7x^7+a_6x^6+a_5x^5+a_4x^4+a_3x^3+a_2x^2+a_1x+a_0x \\ b(x)&=b_7x^7+b_6x^6+b_5x^5+b_4x^4+b_3x^3+b_2x^2+b_1x+b_0 \\ c(x)&=a_7x^7+a_6x^6+a_5x^5+a_4x^4+a_3x^3+a_2x^2+a_1x+c_0 \\ m(x&)=x^8+x^4+x^3+x^2+1 \end {aligned}c(x)a(x)b(x)c(x)m(x=a(x)⋅b(x)=a(x)⋅b(x) mod m(x)=a7x7+a6x6+a5x5+a4x4+a3x3+a2x2+a1x+a0x=b7x7+b6x6+b5x5+b4x4+b3x3+b2x2+b1x+b0=a7x7+a6x6+a5x5+a4x4+a3x3+a2x2+a1x+c0)=x8+x4+x3+x2+1
是普通多项式乘法,但系数运算可看作比特的乘法和异或运算,即看作域{0,1}上的运算。我们可以举个例子 :
问题:第二个等号到第三个等号的因式分解是怎么来的?有一个小技巧哦!请看图:
具体步骤
轮秘钥加变换
开始我们的明文和密文都是64位的,我们将它们两个排列成 4 × 4 的矩阵,然后进行异或操作就得到了9轮循环的初始矩阵了。
秘钥拓展(难点)
秘钥为什么要拓展呢?童鞋,我们可是进行了10轮加密呢,都用一个秘钥进行加密多少有点看不起黑客了吧!也就是我们需要对秘钥进行拓展,把初始的秘钥经过变换,变成10个轮秘钥用于十轮的轮秘钥加。来看总图(浏览一遍看讲解):
这里的初始秘钥是64为,按列写成 4 × 4 的矩阵 w,w[0],w[1],w[2],w[3]是列向量。XOR就是异或操作。第一点好理解,当我们所求的行不是4的倍数的时候,w[5] = w[1] 异或 w[4] .如图:
问题麻烦的是w[4]的求法:
W [ 4 ] = W [ i − 4 ] X O R T ( W [ I − 1 ] ) W[4]=W[i-4]\ XOR\ \ T(W[I-1])W[4]=W[i−4] XOR T(W[I−1])
其实也就体现在多了一个T()方法处理,让我们来看看他到底是什么牛马蛇神:T()由三部分组成:字循环、字节代换、轮常量异或 我们假设此时求w4
- 字节循环:循环的将w[i-1]的元素移位,每次移动一个字节,w[4-1]=w[3]为例:09 cf 4f 3c -> cf 4f 3c 09
2.字节代换:将四个字节作为S盒的输入,然后获取新的四个字节的输出
3.轮常量异或:这个轮常量是给定的下面第一张是轮常量表,10个轮常量,将前两步的结果异或如图过程得到T(w3)。
4.我们把T(w3)和w[0]异或就得到w[4]
字节代换
我们字节代换主要通过S盒来完成的,下面这个是一张S盒的替换表。
那他又是怎么替换的呢?好好看好好学:非常简单,比如元素A8就是A行,8列即C2.
行位移
把S盒中的输出进行左移 ,规则:第0行不移动,第1行移动一个字节,第2行两个字节,第3行移动3个字节,这个操作把每一列的4个元素移到了四个不同的列,看下面这张图:
列混淆
列混淆就是把上面行位移所得的矩阵按列 左乘以我们给定的矩阵,但是这里的运算和我们学的线性代数有一定的区别。这个乘法是在二元有限域上进行的。
1.把加号变成异或运算,例如:b 0 = 02 × a 0 ⊕ 03 × a 1 ⊕ 01 × a 2 ⊕ 01 × a 3 b_0= 02×a_0⊕03×a_1⊕01×a_2⊕01×a_3b0=02×a0⊕03×a1⊕01×a2⊕01×a3.
2.乘法规则需要变更,上面的图已经列出来了:如果所乘的因子 a 7 a_7a7=0 ,那么结果就是a 6 a_6a6到a 0 a_0a0最后补一个零凑成8位即a 6 a 5 a 4 a 3 a 3 a 2 a 1 a 0 0 a_6a_5a_4a_3a_3a_2a_1a_00a6a5a4a3a3a2a1a00,如果a 7 a_7a7=1,那么就把a 6 a 5 a 4 a 3 a 3 a 2 a 1 a 0 0 a_6a_5a_4a_3a_3a_2a_1a_00a6a5a4a3a3a2a1a00和00011011进行异或得到结果。
举例:
不过我们要注意这个左乘矩阵,它的值只会是01,02,03.那么就会有以下情况:假设我们列向量为x,01x=x;02x就是我们上面介绍的a 7 a_7a7分情况;03x= (01异或02) x 展开回到01x,02x上去求解
小结
1.与DES相比,扩散的效果更快,即两轮可达到完全扩散。
2.S盒使用清晰而简单的代数方法构造,避免任何对算法留有后门的怀疑。
3.密钥扩展方案实现对密钥位的非线性混合,既实现了雪崩效应,也实现了非对称性。
4.比穷举攻击更好的攻击进行到6轮,多出4轮可以提供足够多的安全性。(注:针对AFS-128)
CSDN大礼包 _ 《黑客&网络安全入门&进阶学习资源包》免费分享