算法背景介绍
该算法是由美国发明的,1997年NIST发布算法征集公告,98年入围15个候选算法,99年进入五强,00年凭借安全性,性能,大小实现特性为标准最终选定,01年正式发布AES标准。
选择AES主要有以下几个理由:
- 安全性:稳定的数学基础没有算法弱点,算法抗密码分析强度高
- 性能:能在多个平台上以较快的速度实现
- 大小:不占用大量的存储空间和内存
- 实现特性:灵活性,硬件和软件都使用,算法的简单性(过程简单,搞懂了是这样)
我在这里先给出一个框架图,第一遍直接可以跳过,怕吓住饱饱们,学懂了之后再来观看,思路清晰,操作稳健。
两头一个轮秘钥加,中间就四个渣渣轮转:字节代换、行位移、列混淆、轮秘钥加
基础知识
)上的运算
加法’+':字节按位异或运算
乘法 ·
是普通多项式乘法,但系数运算可看作比特的乘法和异或运算,即看作域{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]的求法:
其实也就体现在多了一个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.把加号变成异或运算,例如:.
2.乘法规则需要变更,上面的图已经列出来了:如果所乘的因子 =0 ,那么结果就是
到
最后补一个零凑成8位即
,如果
=1,那么就把
和00011011进行异或得到结果。
举例:
不过我们要注意这个左乘矩阵,它的值只会是01,02,03.那么就会有以下情况:假设我们列向量为x,01x=x;02x就是我们上面介绍的分情况;03x= (01异或02) x 展开回到01x,02x上去求解
小结
1.与DES相比,扩散的效果更快,即两轮可达到完全扩散。
2.S盒使用清晰而简单的代数方法构造,避免任何对算法留有后门的怀疑。
3.密钥扩展方案实现对密钥位的非线性混合,既实现了雪崩效应,也实现了非对称性。
4.比穷举攻击更好的攻击进行到6轮,多出4轮可以提供足够多的安全性。(注:针对AFS-128)