浅析加密算法六AES密码
Posted MangataTS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析加密算法六AES密码相关的知识,希望对你有一定的参考价值。
文章目录
一、简介
AES
算法用来替代原先的DES
(
D
a
t
a
E
n
c
r
y
p
t
i
o
n
S
t
a
n
d
a
r
d
Data Encryption Standard
DataEncryptionStandard ),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST
)于
2001
2001
2001 年
11
11
11 月
26
26
26 日发布于
F
I
P
S
P
U
B
197
FIPS PUB 197
FIPSPUB197 ,并在
2002
2002
2002 年
5
5
5 月
26
26
26 日成为有效的标准。
2006
2006
2006 年,高级加密标准已然成为对称密钥加密中最流行的算法之一 。
该算法为比利时密码学家
J
o
a
n
D
a
e
m
e
n
和
V
i
n
c
e
n
t
R
i
j
m
e
n
Joan Daemen和Vincent Rijmen
JoanDaemen和VincentRijmen 所设计,结合两位作者的名字,以
R
i
j
d
a
e
l
Rijdael
Rijdael 之名命之,投稿高级加密标准的甄选流程。(
R
i
j
d
a
e
l
Rijdael
Rijdael 的发音近于 "
R
h
i
n
e
d
o
l
l
Rhine doll
Rhinedoll "。)
二、原理
先说明一下无论是明文还是密钥(密钥可以是 192 192 192 、 256 256 256 位,我们这里只考虑 128 128 128 位的情况)还是密文都是 128 128 128 位一组的,也就是16个字节,那么我们就可以用一个 4 × 4 4\\times 4 4×4 的矩阵来表示这个数据。
大概的流程可以先看一下这个流程图:(建议看完下面的介绍后再回过来看一下)
2.1 明文加密流程
- 初始变换(其实就是 轮密钥加 操作)
- 九轮轮函数操作
- 字节代换( S u b B y t e s SubBytes SubBytes )
- 行位移( S h i f t R o w s ShiftRows ShiftRows )
- 列混淆 ( M i x C o l u m n s MixColumns MixColumns )
- 轮密钥加( A d d R o u n d K e y AddRoundKey AddRoundKey )
- 最终轮运算(实际上是 除去 列混淆的轮操作函数)
如图:
2.2 子密钥生成流程
我们的初始密钥也是 128 128 128 位的,那么我们以 一列 作为一个单位进行变化,每新增一个子密钥,我们所谓的列的数量就增加 4 4 4 于是密钥拓展的核心就是:
- 如果当前拓展的列
i
i
i 不是
4
4
4 的倍数,那么第
i
i
i 列由如下等式确定:(其中
W
[
i
]
W[i]
W[i] 表示的就是第
i
i
i 列的数据)
W [ i ] = W [ i − 4 ] X o r W [ i − 1 ] W[i]=W[i-4] \\ Xor \\ W[i-1] W[i]=W[i−4] Xor W[i−1] - 如果当前拓展的列
i
i
i 是
4
4
4 的倍数,那么第
i
i
i 列由如下等式确定:
W [ i ] = W [ i − 4 ] X o r T ( W [ i − 1 ] ) W[i]=W[i-4] \\ Xor \\ T(W[i-1]) W[i]=W[i−4] Xor T(W[i−1])
关于这个 T T T 函数,我们下面仔细讲解
2.3 字节代换
一般来说我们会给一个 16 × 16 16\\times 16 16×16 的 S S S 盒子,然后我们将每一个字节的前 4 4 4 位(转化为16进制)作为 X X X 轴的坐标,然后后 4 4 4 位作为 Y Y Y 轴的坐标,然后进行一个值的替换,最终我们将所有字节都替换完成即可
这里借用一个图:
2.4 行位移
此时我们需要将每一行数据想象成一个环形
- 对于第一行,我们保持不变
- 对于第二行,我们向左循环移动 1 1 1 个字节
- 对于第三行,我们向左循环移动 2 2 2 个字节
- 对于第四行,我们向左循环移动 3 3 3 个字节
可以参考下图:
2.5 列混淆(混合)
我们将会给当前的这个矩阵 左乘 一个 指定矩阵 但是注意的是这里的矩阵乘法不是普通意义上的,而是有限域
G
F
(
2
8
)
GF(2^8)
GF(28) 上的乘法,我们知道矩阵的乘法是左边的行乘上右边的列,那么对于每一个字节而言,都有
8
8
8 位,在有限域的乘法中,乘法变为了多项式乘法,例如:
然后加法变成了异或运算,例如,我们现在左边矩阵第一行的元素都是
a
i
a_i
ai ,右边的矩阵元素都是
b
i
b_i
bi ,顺序如下:
B矩阵同理,那么我们想算出新矩阵
C
C
C 的第一个字节的值就为:
c
1
=
(
a
1
×
b
1
)
⊕
(
a
2
×
b
5
)
⊕
(
a
3
×
b
9
)
⊕
(
a
4
×
a
13
)
c_1 = (a_1 \\times b_1) ⊕ (a_2 \\times b_5) ⊕ (a_3 \\times b_9) ⊕ (a_4 \\times a_13)
c1=(a1×b1)⊕(a2×b5)⊕(a3×b9)⊕(a4×a13)
2.6 轮密钥加变换
轮密钥加就是直接将一个 指定矩阵 和当前的待加密矩阵进行对每个字节 按位异或 操作即可
大概操作如图:
2.7 密钥拓展中的T函数
T T T 函数由三个部分组成: 字循环 、 字节代换 、 轮常量异或
2.7.1 字循环
2.7.2 字节代换
这里的代换和上面提到的是一样的,就是 S S S 盒子代换,前 4 4 4 位 作为查找的 X X X 坐标,后 4 4 4 位作为查找的 Y Y Y 坐标,然后再盒子(字节表)中查找替换即可
2.7.3 轮常量异或
将前两步的结果同轮常量 R c o n [ j ] Rcon[j] Rcon[j] 进行异或操作,其中的 J J J 表示的是轮数,注意的是这里的轮常量是 给定的 ,这样我们会发现,如果说当前的列数是 4 4 4 的倍数的时候,我们需要进行 两次 列异或操作
三、优缺点
3.1 优点
- 安全性高,稳定的数学基础、没有算法弱点、算法抗密码分析强度高
- 性能好,能在多个平台上以较快的速度实现
- 存储空间小,不能占用大量的存储空间和内存
- 灵活性、硬件、软件适应性、算法的简单性等
- 很好的抵抗差分密码分析及线性密码分析的能力。
- AES的密钥长度比DES大,它也可设定为32比特的任意倍数,最小值为128比特,最大值为256比特,所以用穷举法是不可能破解的。
3.2 缺点
目前尚未存在对AES 算法完整版的成功攻击,但已经提出对其简化算法的攻击。
四、对比DES
4.1 相同之处
- 两者的轮函数都是由三部分构成,非线性层、线性混合层、子密钥异或,只不过顺序不同
AES
的子密钥异或对应于DES
的 S S S 盒子之前的子密钥异或AES
的列混淆运算的目的是为了让不同的字节相互影响,而DES
中F
函数的输出于左边一半数据相加也有类似的效果AES
的非线性运算是字节代替(ByteSub
),对应于DES
中的非线性运算 S S S 盒子- 行位移运算保证了每一行的字节不仅仅影响其他行对应的字节,而且影响其他行所有的字节,这与
DES
中的置换 I P IP IP 相似
4.2 不同之处
AES
的密钥长度( 128 128 128 位、 192 192 192 位、 256 256 256 位)是可变的,而DES
的密钥固定长度为 56 56 56 位DES
是面向比特运算的,而AES
是面向字节运算的AES
的加密运算和解密运算不一致,因而加密器不能同时作为解密器,而DES
则无此限制
五、代码实现
留坑(但是感觉不会填,后面看情况吧)
以上是关于浅析加密算法六AES密码的主要内容,如果未能解决你的问题,请参考以下文章