今天看了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来理解这些东西。安全
在明文和加密以后的秘文之间创建某种关系是很好的想法。一个混淆的例子是凯撒密码。密文的每一个字母对应于明文字母的后面第三个字母。ide
另外一个很好的想法是扩散信息。一个例子是简单的列转置。函数
千百年来,咱们发现假设没有人知道你的加密方法是一件愚蠢的事情,总会有人最终知道的。
可是具体是怎么工做的呢?咱们看下一部分ui
可是在我告诉大家以前,大家得先签署这份协议!
你须要先签这个玩意儿
将数据放在一个44得矩阵里,在这个矩阵得末尾进行填充,由于数据不老是16字节来正好填满。这个矩阵咱们在下文中称之为‘状态矩阵’
初始的一轮将刚才咱们建立的矩阵和第一轮的密码44矩阵进行异或操做
为何用异或操做?缘由很简单,异或快并且开销少–很快的位运算。异或运算使用简单的硬件并且能够并行计算由于没有多余的为须要参与运算。加密
AES须要不少密钥以供后面轮加密的使用。AES经过一个简单的混合操做来将初始的密钥生成这些密钥。这个生成过程很快。尽管它也有一些缺点:(太简单),AES已经足够好了。idea
刚才咱们获得了第一列,那么第二列怎么获得呢?很简单,用咱们上一轮的密钥的第二列和咱们刚才获得的第一列异或就获得了新一轮的第二列,第三列第四列用一样的方法依次计算获得(注意256位的密钥更加复杂,咱们用的是128位的密钥,也就是16字节)
接下来是中间轮了,中间轮是对一系列操做重复执行若干次。重复的次数取决于密钥的长度(128位则重复9次,192位重复11次,256位重复13次)翻译
将每一字节经过S盒换成另一个字节,咱们用图片左下角和右下角的符号表示混淆这一操做
扩散 Part1:行移位
将44的矩阵按图左的方式进行行移位,而后按图右的方式进行从新组合获得一个新的44矩阵左下角和右下角的符号表明行移位这一操做orm
用列混淆变换将每一列转换成新的一列,算法为模不可约多项式
图片中左下角和右下角的符号表明列混淆操做图片
在每轮的最后,将上一步列混淆获得的矩阵与下一轮的密钥进行异或获得新的矩阵
在最后一轮咱们丢弃了列混淆这一操做,由于最后一轮它不会提升安全性了,只会将速度拉低
每一轮我都对这些比特进行混淆和扩散。并且还把每一轮的密钥都嵌入进去。轮数越多安全性越好!
决定到底要多少轮老是面临一个挑战,那就是在安全性和效率以前作出权衡。
有人说能够通过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⨁1x2⨁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获得余数,而后将其简化成矩阵相乘
全部的东西都浓缩到上图了