十分钟看懂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. orcale 多列转一行显示

    强大的数据库有个自带函数wm_concat() wm_concat()这个函数放的是需要汇总的列 select wm_concat(name) name  from tablename

  2. java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列

    什么是递归 我先看下百度百科的解释: 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的.用递归过程定义的函数,称为递归函数,例如连加.连乘及阶乘等.凡是递归的函数,都是可计算的,即 ...

  3. php 关于 & 引用赋值

    $a = ; $b = ; echo $a . echo $b . $a = $b; echo $a . echo $b . $a = &$b; echo $a . echo $b . $a ...

  4. D3.js 力导向图的显示优化

    D3.js 作为一个前端,说到可视化除了听过 D3.js 的大名,常见的可视化库还有 ECharts.Chart.js,这两个库功能也很强大,但是有一个共同特点是封装层次高,留给开发者可设计和控制的部 ...

  5. 对 ThreadLocal 的了解(一)

    Threadlocal ThreadLocal 在我个人理解范围内,主要作用是在同一个线程里面,去共享某个数据给这个线程在不同的阶段去使用. 本次使用范围 在集成 pageOffice 在线 word ...

  6. KVM 一键批量创建虚拟机

    目录 一.原理 二.基础镜像 2.1.创建基础镜像 2.2. 完善基础镜像 2.3.基础镜像设置权限 3.4 设置 title 3.5.基础镜像XML 三.批量创建机器脚本 四.挂载磁盘多种方式 4. ...

  7. Linux硬盘分区知识

    前言 硬盘使用前,一般要分区,格式化(创建文件系统)<== 存放数据 类比,房子使用前,一般要隔断,装修,买家具,再住人. 分区 一块硬盘: 主分区.扩展分区.逻辑分区 主分区+扩展分区的数量& ...

  8. Windows 10 MSDN官方原版ISO镜像(简体中文)下载

    http://www.heu8.com/2800.html 硬件要求如下:处理器:1 GHz 或更快的处理器或 SoC RAM:1 GB(32 位)或 2 GB(64 位) 硬盘空间:16 GB(32 ...

  9. UDT的Sender和Receiver

    Sender算法 数据结构和变量: Sender's Loss List:发送方的loss list用来存储丢失包的序列号,序列号来自于两个地方,一是receiver通过NAK包反馈回来,二是超时事件 ...

  10. 51NOD 2072 装箱问题 背包问题 01 背包 DP 动态规划

    有一个箱子容量为 V(正整数,0<=V<=20000),同时有 n 个物品(0<n<=30),每个物品有一个体积(正整数). 现在在 n 个物品中,任取若干个装入箱内,使得箱子 ...