十分钟读懂AES加密算法 - Go语言中文社区

十分钟读懂AES加密算法


博客已迁移,转载请注明来源:https://leerw.github.io

今天看了Moserware的《A Stick Figure Guide to the Advanced Encryption Standard(AES)》收获了不少,对AES算法有了更加清楚的理解,这篇博客用了大量的情景图文来展示AES的发展历史和算法的具体流程,虽然是2009年的博文,但是在今天仍然是很有借鉴意义。今天将这篇博文翻译过来,翻译不畅,暂且抛砖引玉。

很久以前

1
AES:我每天处理很多数据。我把很多很神奇的秘密数据加密成枯燥的数据包给你的WIFI路由器,这些都是我做的!
2
AES:但是还是没有人关心的我故事,呜呜呜。。。
2
AES:我的故事可以比灰姑娘的故事更传奇呢,因为我现在可是分组密码世界的国王!
3
4
你还没走啊,想听我的故事?来咱们开始造作吧…
5
曾经啊(1975以前),除了保密局没有办法去评判那种加密算法更好,有人说是EBG13 vf terng, 也有人说是Double ROT13,各执一词。
6
终于有人站出来号召创建一个好的安全加密算法。
7
这时一个强有力的竞争者占了出来,他的名字就是IBM!
8
在国家安全局的修改之后,他被钦定为数据加密标准,也就是DES。因为人家有更加短的密钥和更加强壮的S盒。
9
DES已经统治了20多年了,学术界也开始研究他。这是第一次细致的研究。从此,现代密码学诞生。
10
这些年间,前赴后继的攻击者挑战DES,而且DES被打败过几次。
11
阻止攻击的唯一办法就是使用DES算法三次也就是’Triple-DES’,这个办法很可行,但是真的是很慢。
12
有一个需求来了,他们需要像’Triple-DES’一样强壮但是更快更灵活的加密算法。(~1997)
13
大家都跃跃欲试。
14
我的创造者也就是AES的发明者,Vincent Rijmen和Joan Daemen也在他们之中,他们俩把他们的姓结合在一起给我作为乳名:Rijndael。
15
16
不出所料,AES赢了。
17
而且,AES成了加密界的国王,他无处不在。Intel甚至在他们的芯片中为我量身定制了底层指令来让AES执行地更快!
18
但是加密算法是怎么工作的呢?我们来到下一部分

密码学基础

19
想明白加密算法是怎么工作的你需要知道3个idea来理解这些东西。

1. 混淆

20
在明文和加密之后的秘文之间建立某种关系是很好的想法。一个混淆的例子是凯撒密码。密文的每个字母对应于明文字母的后面第三个字母。

2. 扩散

21
另一个很好的想法是扩散信息。一个例子是简单的列转置。

3. 保密密钥

31
千百年来,我们发现假设没有人知道你的加密方法是一件愚蠢的事情,总会有人最终知道的。
32
但是具体是怎么工作的呢?我们看下一部分

详细过程

33
但是在我告诉你们之前,你们得先签署这份协议!
34
你需要先签这个玩意儿
35
将数据放在一个4*4得矩阵里,在这个矩阵得末尾进行填充,因为数据不总是16字节来正好填满。这个矩阵我们在下文中称之为‘状态矩阵’
36
初始的一轮将刚才我们创建的矩阵和第一轮的密码4*4矩阵进行异或操作
37
为什么用异或操作?原因很简单,异或快而且开销少–很快的位运算。异或运算使用简单的硬件而且可以并行计算因为没有多余的为需要参与运算。

密钥扩散 Part1

38
AES需要很多密钥以供后面轮加密的使用。AES通过一个简单的混合操作来将初始的密钥生成这些密钥。这个生成过程很快。尽管它也有一些缺点:(太简单),AES已经足够好了。

密钥扩散 Part2a

39
* 首先,将上一轮的密钥的最后一列拿出来然后将这一列的第一个字节放到最后一个位置上,其他位置的字节依次向上移动一个位置
* 然后,将变换位置后的这一列通过一个替代盒的映射转换为另一列

密钥扩散 Part2b

40
* 然后把刚才的得到的那一列再与轮常量列相异或,这个常量对每一轮都不一样
* 最后再把刚才异或之后得到的列与上一轮的密钥的第一列相异或得到第一列

密钥扩散 Part3

41
刚才我们得到了第一列,那么第二列怎么得到呢?很简单,用我们上一轮的密钥的第二列和我们刚才得到的第一列异或就得到了新一轮的第二列,第三列第四列用同样的方法依次计算得到(注意256位的密钥更加复杂,我们用的是128位的密钥,也就是16字节)
42
接下来是中间轮了,中间轮是对一系列操作重复执行若干次。重复的次数取决于密钥的长度(128位则重复9次,192位重复11次,256位重复13次)

混淆:替代字节

43
将每一字节通过S盒换成另外一个字节,我们用图片左下角和右下角的符号表示混淆这一操作

扩散 Part1:行移位

44
将4*4的矩阵按图左的方式进行行移位,然后按图右的方式进行重新组合得到一个新的4*4矩阵左下角和右下角的符号代表行移位这一操作

扩散 Part2:列混淆

45
用列混淆变换将每一列转换成新的一列,算法为模不可约多项式
图片中左下角和右下角的符号代表列混淆操作

加轮密钥

46
在每轮的最后,将上一步列混淆得到的矩阵与下一轮的密钥进行异或得到新的矩阵
47
在最后一轮我们丢弃了列混淆这一操作,因为最后一轮它不会提高安全性了,只会将速度拉低
48
每一轮我都对这些比特进行混淆和扩散。而且还把每一轮的密钥都嵌入进去。轮数越多安全性越好!
49
决定到底要多少轮总是面临一个挑战,那就是在安全性和效率之前做出权衡。
50
有人说可以经过6轮加密就可以了,但是这很不好!如果你仔细观察,你会发现每一轮输出的每一个比特取决于前两轮。为了增加扩散的雪崩效应,我增加了4轮。这是我的安全边界。密钥长度位128位时需要10轮,192位时需要12轮,256位时需要14轮。
51
每次AES都要先执行异或初始操作,然后执行9轮拥有4项操作的中间轮,最后执行包括三项操作的最后一轮
52
解密意味着加密的逆过程
53
相比与ECB而言,CBC更好
54
但是除了刚才所做的那些类比,究竟发生了些什么呢?
55
如果像真正明白这些东西,我们还需要数学基础知识

数学!

56
我们思考一个问题,X+X=?你可能会说2X
57
我们回顾一下数学基础

(x+1)2=(x+1)(x+1)=x2+x+x+1=x2+2x+1

58
我们将会做点小改变,以前,系数可以很大,而现在,我们只让系数等于1或0
旧方式:

63
我们将刚才的结果除以

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/lrwwll/article/details/78069013
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 15:01:57
  • 阅读 ( 1429 )
  • 分类:算法

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢