赞
踩
该算法是由美国发明的,1997年NIST发布算法征集公告,98年入围15个候选算法,99年进入五强,00年凭借安全性,性能,大小实现特性为标准最终选定,01年正式发布AES标准。
选择AES主要有以下几个理由:
我们主要从中间四个部分讲解,在这里我将要补充两个基础知识:有限域GF( 2 8 2^8 28)上的运算
(
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
我们字节代换主要通过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_3
b0=02×a0⊕03×a1⊕01×a2⊕01×a3.
2.乘法规则需要变更,上面的图已经列出来了:如果所乘的因子
a
7
a_7
a7=0 ,那么结果就是
a
6
a_6
a6到
a
0
a_0
a0最后补一个零凑成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_00
a6a5a4a3a3a2a1a00,如果
a
7
a_7
a7=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_00
a6a5a4a3a3a2a1a00和00011011进行异或得到结果。
举例:
不过我们要注意这个左乘矩阵,它的值只会是01,02,03.那么就会有以下情况:假设我们列向量为x,01x=x;02x就是我们上面介绍的
a
7
a_7
a7分情况;03x= (01异或02) x 展开回到01x,02x上去求解
1.与DES相比,扩散的效果更快,即两轮可达到完全扩散。
2.S盒使用清晰而简单的代数方法构造,避免任何对算法留有后门的怀疑。
3.密钥扩展方案实现对密钥位的非线性混合,既实现了雪崩效应,也实现了非对称性。
4.比穷举攻击更好的攻击进行到6轮,多出4轮可以提供足够多的安全性。(注:针对AFS-128)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。