十分钟看懂AES加密算法

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

很久以前



AES:我每天处理很多数据。我把很多很神奇的秘密数据加密成枯燥的数据包给你的WIFI路由器,这些都是我做的!



AES:但是还是没有人关心的我故事,呜呜呜。。。



AES:我的故事可以比灰姑娘的故事更传奇呢,因为我现在可是分组密码世界的国王!



你还没走啊,想听我的故事?来咱们开始造作吧…



曾经啊(1975以前),除了保密局没有办法去评判那种加密算法更好,有人说是EBG13 vf terng, 也有人说是Double ROT13,各执一词。



终于有人站出来号召创建一个好的安全加密算法。



这时一个强有力的竞争者占了出来,他的名字就是IBM!



在国家安全局的修改之后,他被钦定为数据加密标准,也就是DES。因为人家有更加短的密钥和更加强壮的S盒。



DES已经统治了20多年了,学术界也开始研究他。这是第一次细致的研究。从此,现代密码学诞生。



这些年间,前赴后继的攻击者挑战DES,而且DES被打败过几次。



阻止攻击的唯一办法就是使用DES算法三次也就是’Triple-DES’,这个办法很可行,但是真的是很慢。



有一个需求来了,他们需要像’Triple-DES’一样强壮但是更快更灵活的加密算法。(~1997)



大家都跃跃欲试。



我的创造者也就是AES的发明者,Vincent Rijmen和Joan Daemen也在他们之中,他们俩把他们的姓结合在一起给我作为乳名:Rijndael。





不出所料,AES赢了。



而且,AES成了加密界的国王,他无处不在。Intel甚至在他们的芯片中为我量身定制了底层指令来让AES执行地更快!



但是加密算法是怎么工作的呢?我们来到下一部分

密码学基础



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

1. 混淆



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

2. 扩散



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

3. 保密密钥



千百年来,我们发现假设没有人知道你的加密方法是一件愚蠢的事情,总会有人最终知道的。



但是具体是怎么工作的呢?我们看下一部分

详细过程



但是在我告诉你们之前,你们得先签署这份协议!



你需要先签这个玩意儿



将数据放在一个44得矩阵里,在这个矩阵得末尾进行填充,因为数据不总是16字节来正好填满。这个矩阵我们在下文中称之为‘状态矩阵’



初始的一轮将刚才我们创建的矩阵和第一轮的密码4
4矩阵进行异或操作



为什么用异或操作?原因很简单,异或快而且开销少–很快的位运算。异或运算使用简单的硬件而且可以并行计算因为没有多余的为需要参与运算。

密钥扩散 Part1



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

密钥扩散 Part2a

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

密钥扩散 Part2b

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

密钥扩散 Part3



刚才我们得到了第一列,那么第二列怎么得到呢?很简单,用我们上一轮的密钥的第二列和我们刚才得到的第一列异或就得到了新一轮的第二列,第三列第四列用同样的方法依次计算得到(注意256位的密钥更加复杂,我们用的是128位的密钥,也就是16字节)



接下来是中间轮了,中间轮是对一系列操作重复执行若干次。重复的次数取决于密钥的长度(128位则重复9次,192位重复11次,256位重复13次)

混淆:替代字节



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

扩散 Part1:行移位



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

扩散 Part2:列混淆



用列混淆变换将每一列转换成新的一列,算法为模不可约多项式

图片中左下角和右下角的符号代表列混淆操作

加轮密钥



在每轮的最后,将上一步列混淆得到的矩阵与下一轮的密钥进行异或得到新的矩阵



在最后一轮我们丢弃了列混淆这一操作,因为最后一轮它不会提高安全性了,只会将速度拉低



每一轮我都对这些比特进行混淆和扩散。而且还把每一轮的密钥都嵌入进去。轮数越多安全性越好!



决定到底要多少轮总是面临一个挑战,那就是在安全性和效率之前做出权衡。



有人说可以经过6轮加密就可以了,但是这很不好!如果你仔细观察,你会发现每一轮输出的每一个比特取决于前两轮。为了增加扩散的雪崩效应,我增加了4轮。这是我的安全边界。密钥长度位128位时需要10轮,192位时需要12轮,256位时需要14轮。



每次AES都要先执行异或初始操作,然后执行9轮拥有4项操作的中间轮,最后执行包括三项操作的最后一轮



解密意味着加密的逆过程



相比与ECB而言,CBC更好



但是除了刚才所做的那些类比,究竟发生了些什么呢?



如果像真正明白这些东西,我们还需要数学基础知识

数学!



我们思考一个问题,X+X=?你可能会说2X



我们回顾一下数学基础

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

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



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

旧方式:

123x2+45x2+678x+9x+10=168x2+687x+10

123x2+45x2+678x+9x+10=168x2+687x+10

新方式:

x2⨁x2⨁x2⨁x⨁x⨁1=x2⨁1

x2⨁x2⨁x2⨁x⨁x⨁1=x2⨁1

x2⨁x2⨁x2=(x2⨁x2)⨁x2=0⨁x2=x2

x2⨁x2⨁x2=(x2⨁x2)⨁x2=0⨁x2=x2

上图展示了乘法怎么让式子增加的飞快



尽管新的加法让事情变得更加简单,但是x13x13还是显得太大了,我们怎么才能让这个多项式的最高次不高于7呢?



我们请来了我们的朋友——时钟数学,怎么做呢?只需要把式子加在一起然后做长除法就可以了。我们要时刻注意余数(这也叫模加法)



在我们这里,我们用m(x)=x8⨁x4⨁x3⨁x⨁1m(x)=x8⨁x4⨁x3⨁x⨁1作为除数而不是12.假设我们现在做乘法x⋅b(x),b(x)x⋅b(x),b(x)有系数bb7…bb0;

但是得到的结果最高次幂是8,还是太高了,我们必须将它变小一点



我们将刚才的结果除以m(x)=x8⨁x4⨁x3⨁x⨁1m(x)=x8⨁x4⨁x3⨁x⨁1然后取余数



下面我们到了最艰难的部分了:对数运算。对数运算搞定之后,其他都是小case!对数可以帮助我们将乘法转换为加法(如图)



我们将对数引入我们的新世界,在这里,底数不再是10了,而是简单的多项式x⨁1x⨁1(如果你不停地乘以x⨁1x⨁1然后除以m(x)m(x)得到余数,你会发现你可以生成所有低于x8x8的多项式)



为什么我们要用这种数学呢?密码学与比特和字节打交道不是吗?OK,还有一个最后的联系,一个7阶的多项式可以表示1字节,因为我们用刚才引入的数学方法生成的多项式的系数只能是1或0



对于字节,我们将多项式加法变成简单的异或。我们可以用对数技巧创建一个表来加快运算



因为我们知道怎么定义的乘法,我们可以为每一个多项式字节找到真正字节的逆运算。因为总共只有255个这样的字节,所以我们可以暴力破解



现在我们可以理解神秘的S盒了。它将一个字节aa应用两个函数。第一个函数是g,找到aa的逆元,第二个函数是f,f是故意让这个数学更麻烦来抵挡黑客的进攻



我们还可以理解那些疯狂的轮常量。我通过不停地乘以xx来得到他们



列混淆变换是最困难的。我把每一列看作是一个多项式.用我们新的乘法将它乘以一个特殊的多项式,然后除以x4+1x4+1得到余数,然后将其简化成矩阵相乘



所有的东西都浓缩到上图了

十分钟看懂AES加密的更多相关文章

  1. 十分钟看懂,未来Web前端开发最新趋势

    首先,展望未来趋势我们就要弄懂过去的一年,也就是18年,web前端开发的重要新闻.重要事件和JavaScript的各种流行框架.模式发展趋势. 我们来快速回顾一下. NPM热门前端框架下载 先来看最热 ...

  2. 0160 十分钟看懂时序数据库(I)-存储

    摘要:2017年时序数据库忽然火了起来.开年2月Facebook开源了beringei时序数据库:到了4月基于PostgreSQL打造的时序数据库TimeScaleDB也开源了,而早在2016年7月, ...

  3. 小白之入口即化——十分钟看懂while循环,字符串格式化,运算符

    while循环 while循环-死循环 while空格+条件+冒号 缩进+循环体 3.打断死循环 break--终止当前循环 while True: print(123) print(234) bre ...

  4. [转帖]10分钟看懂Docker和K8S

    10分钟看懂Docker和K8S https://zhuanlan.zhihu.com/p/53260098 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这 ...

  5. 十分钟搞懂什么是CGI

    原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...

  6. 十分钟搞懂什么是CGI(转)

    原文:CGI Made Really Easy,在翻译的过程中,我增加了一些我在学习过程中找到的更合适的资料,和自己的一些理解.不能算是严格的翻译文章,应该算是我的看这篇文章的过程的随笔吧. CGI真 ...

  7. 5分钟看懂Code128条形码

    什么是Code128条形码? 相信大家看到这个都不陌生吧 1.前言 条形码种类很多,常见的大概有二十多种码制,其中包括:Code39码(标准39码).Codabar码(库德巴码).Code25码(标准 ...

  8. 10分钟看懂Docker和K8S

    本文来源:鲜枣课堂 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的 ...

  9. 干货满满!10分钟看懂Docker和K8S(转)

    2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要提供基于PaaS的云计算技术服务.具体来说,是和LXC有关的容器技术. LXC,就是Linux容器虚 ...

随机推荐

  1. Java 多线程 -- 指令重排(HappenBefore)

    指令重排是指:代码执行顺序和预期不一致. 代码运行一般步骤为: 1.从内存中获取指令解码 2.计算值 3.执行代码操作 4.把结果写回内存 而写回内存的操作比较耗时,CPU为了性能,可能不会等它完成, ...

  2. PHP入门-1

    基本数据类型: 1.整形 2.浮点型 3.字符串 4.布尔型 5.数组和对象 6.null 7.资源类型 8.伪类型 由于php是弱语言,所以他的数据类型不用自己来定义.定义一个数据类型,$name ...

  3. 2019-2020-1 20199308《Linux内核原理与分析》第四周作业

    <Linux内核分析> 第三章 MenuOS的构造 3.1 Linux内核源代码简介 操作系统的"两把宝剑" 中断上下文:保存现场和恢复现场 进程上下文 目录结构 ar ...

  4. java零基础自学网站分享

    俗话说工欲善其事,必先利其器,今天给大家分享一个java自学网站:how2j,这是一个有十年淘宝工作经验大牛的制作的网站,距离现在已经有三四年了,这个网站包含的知识非常的多,从基础的环境变量配置一直到 ...

  5. 小白的MyBatis逆向工程

    MyBatis逆向工程   MyBatis逆向工程,简称MBG.是一个专门为MyBatis框架使用者定制的代码生成器. 可以快速的根据数据库表生成对应的映射文件,接口,以及Bean类对象. 在Myba ...

  6. 关于Pandownload和百度网盘

    本周,百度网盘第三方客户端 Pandownload 被查,开发者被“跨省追捕”:百度网盘“用户激励计划”在未充分告知用户的情况下,利用用户自己的电脑做 P2P 上传节点.这两件事再度引发了对百度网盘的 ...

  7. 深入认识CSS的块级元素

    2019独角兽企业重金招聘Python工程师标准>>> 块级元素: 显示在一块内,会自动换行,元素会从上到下垂直排列,各自占一行.每个块级元素默认占一行高度,一行内添加一个块级元素后 ...

  8. (转)mysql数据库表名批量修改大小写

    由于不用服务器对mysql的表名的大小写敏感要求不一致,经常在出现线上的数据库down到了本地不能运行的情况,贴出一段代码用来批量修改数据库表名大小写. DELIMITER // DROP PROCE ...

  9. 熟透vue手机购物商城开发的重要性

    带手机验证码登陆, 带全套购物车系统 带数据库 前后端分离开发 带定位用户功能 数据库代码为本地制作好了 带支付宝支付系统 带django开发服务器接口教程 地址:   https://www.dua ...

  10. 聊聊select, poll 和 epoll_wait

    聊聊select, poll 和 epoll 假设项目上需要实现一个TCP的客户端和服务器从而进行跨机器的数据收发,我们很可能翻阅一些资料,然后写出如下的代码. 服务端 客户端 那么问题来了,如果有一 ...