漫画:什么是AES计算机算法是什么

AES加密算法原理 - 介似??? - 博客园
随笔 - 913, 文章 - 0, 评论 - 24, 引用 - 0
随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES[1]。经过三轮的筛选,比利时Joan Daeman和Vincent Rijmen提交的Rijndael算法被提议为AES的最终算法。此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。尽管人们对AES还有不同的看法,但总体来说,AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES设计有三个密钥长度:128,192,256位,相对而言,AES的128密钥比DES的56密钥强1021倍[2]。AES算法主要包括三个方面:轮变化、圈数和密钥扩展。本文以128为例,介绍算法的基本原理;结合AVR汇编语言,实现高级数据加密算法AES。  &&&&AES是分组密钥,算法输入128位数据,密钥长度也是128位。用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表1所列)。每一轮都需要一个与输入分组具有相同长度的扩展密钥Expandedkey(i)的参与。由于外部输入的加密密钥K长度有限,所以在算法中要用一个密钥扩展程序(Keyexpansion)把外部密钥K扩展成更长的比特串,以生成各轮的加密和解密密钥。1.1圈变化&&&&AES每一个圈变换由以下三个层组成:&&&&非线性层&&进行Subbyte变换;&&&&线行混合层&&进行ShiftRow和MixColumn运算;&&&&密钥加层&&进行AddRoundKey运算。① Subbyte变换是作用在状态中每个字节上的一种非线性字节转换,可以通过计算出来的S盒进行映射。
② ShiftRow是一个字节换位。它将状态中的行按照不同的偏移量进行循环移位,而这个偏移量也是根据Nb的不同而选择的[3]。
③ 在MixColumn变换中,把状态中的每一列看作GF(28)上的多项式a(x)与固定多项式c(x)相乘的结果。 b(x)=c(x)*a(x)的系数这样计算:
*运算不是普通的乘法运算,而是特殊的运算,即 b(x)=c(x)&a(x)(mod x4+1) 对于这个运算 b0=02。a0+03。a1+a2+a3 令xtime(a0)=02。a0
其中,符号&。&表示模一个八次不可约多项式的同余乘法[3]。
对于逆变化,其矩阵C要改变成相应的D,即b(x)=d(x)*a(x)。④ 密钥加层运算(addround)是将圈密钥状态中的对应字节按位&异或&。
⑤ 根据线性变化的性质[1],解密运算是加密变化的逆变化。这里不再详细叙述。
1.2轮变化   
&&&&对不同的分组长度,其对应的轮变化次数是不同的,如表1所列。
1.3密钥扩展  
&&&&AES算法利用外部输入密钥K(密钥串的字数为Nk),通过密钥的扩展程序得到共计4(Nr+1)字的扩展密钥。它涉及如下三个模块:
① 位置变换(rotword)&&把一个4字节的序列[A,B,C,D]变化成[B,C,D,A];
② S盒变换(subword)&&对一个4字节进行S盒代替;
③ 变换Rcon[i]&&Rcon[i]表示32位比特字[xi-1,00,00,00]。
这里的x是(02),如 Rcon[1]=[];Rcon[2]=[];Rcon[3]=[]&&   
&&&&扩展密钥的生成:扩展密钥的前Nk个字就是外部密钥K;以后的字W[[i]]等于它前一个字W[[i-1]]与前第Nk个字W[[i-Nk]]的&异或&,即W[[i]]=W[[i-1]]W[[i- Nk]]。但是若i为Nk的倍数,则W[i]=W[i-Nk]Subword(Rotword(W[[i-1]]))Rcon[i/Nk]。
AES的加密与解密流程如图1所示。
(本文有三张图片,可恶的网站保护不让转载,只好删除了)AES算法动画演示
/wp-content/uploads/2010/10/rijndael_ingles2004.swf
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。社会化媒体
了解更多>>
桂ICP备 号
桂公网安备 36号
阅读下一篇
自媒体运营攻略
行业经验交流
Hi,在你登录以后,就可以永久免费的收藏任何您感兴趣的内容,关注感兴趣的作者!
请输入正确的邮箱
已有帐号请点击
帐号创建成功!
我们刚刚给你发送了一封验证邮件
请在48小时内查收邮件,并按照提示验证邮箱
感谢你对微口网的信任与支持
如果你没有收到邮件,请留意垃圾箱 或 重新发送
你输入的邮箱还未注册
还没有帐号请点击
你输入的邮箱还未注册
又想起来了?
邮件发送成功!
我们刚刚给你发送了一封邮件
请在5分钟内查收邮件,并按照提示重置密码
感谢你对微口网的信任与支持
如果你没有收到邮件,请留意垃圾箱 或 重新发送
对不起,你的帐号尚未验证
如果你没有收到邮件,请留意垃圾箱 或
意见与建议
请留下您的联系方式
* 留下您正确的联系方式,以便工作人员尽快与你取得联系
新!变现功能上线
现在,只要登录微口网账号,点击“我要变现”,就能领取任务,轻松推广商品,坐收丰厚佣金,只要一分钟操作,就能获取50%超高提成!
合适的商品更容易推广,你可以根据公众号定位,选择调性最适合推广的商品;如果没有公众号,你也可以选择自己喜爱或者符合自己品味的商品。
优秀的产品文案能让我们赚更多钱,你可以直接使用我们平台提供的文案素材;如果你不想用,那么你可以自己随心撰写合适的产品文案。
关于购买链接
你可以将购买链接粘贴在“阅读原文”处;或者分享购买链接/二维码至社交平台或社交群内。只要有用户通过此链接购买了商品即可获得丰厚提成!
转藏至我的藏点AES算法及其应用_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
AES算法及其应用
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢  我们知道数据加密标准(Data Encryption Standard: DES)的密钥长度是56比特,因此算法的理论安全强度是256。但二十世纪中后期正是计算机飞速发展的阶段,元器件制造工艺的进步使得计算机的处理能力越来越强,DES将不能提供足够的安全性。号,美国国家标准技术研究所(National Institute of Standards and Technology: NIST)宣布希望征集高级加密标准(Advanced Encryption Standard: AES)[3],用以取代DES。AES得到了全世界很多密码工作者的响应,先后有很多人提交了自己设计的算法。最终有5个候选算法进入最后一轮:,,,和MARS,下图分别为其中的5位作者。最终经过严格的性能测评,Rijndael算法获胜。
  Rijndael由比利时两位非常著名的密码学家和设计。Rijndael是一个分组密码算法族,其分组长度包括128比特、160比特、192比特、224比特、256比特,密钥长度也包括这五种长度,但是最终AES只选取了分组长度为128比特,密钥长度为128比特、192比特和256比特的三个版本。本文主要结合AES-128进行介绍,AES-196和AES-256的思路基本一样,只是密钥扩展算法的过程会稍有不同,加解密的轮数会适当增加,但加解密的操作都是一样的。另外,本文只对AES算法的各个模块、基本原理进行介绍,旨在加深对算法流程、密码算法实现的了解。在正式软件运用中并不推荐自己编写代码,很多开源项目如Linux,OPENSSL,SRTP等都有非常高效的实现。由于数学知识的缺陷,本文不介绍算法安全性分析相关的知识,有兴趣的读者可以自行阅读相关文献。
  AES是一个分组密码,属于对称密码范畴,AES算法的模块在对称密码领域特别是分组密码领域常有使用。
1 算法流程
  AES加密算法涉及4种操作:字节替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。下图给出了AES加解密的流程,从图中可以看出:1)解密算法的每一步分别对应加密算法的逆操作,2)加解密所有操作的顺序正好是相反的。正是由于这几点(再加上加密算法与解密算法每步的操作互逆)保证了算法的正确性。加解密中每轮的密钥分别由种子密钥经过密钥扩展算法得到。算法中16字节的明文、密文和轮子密钥都以一个4x4的矩阵表示。
1.1 字节替代
  字节代替的主要功能是通过S盒完成一个字节到另外一个字节的映射。S盒的详细构造方法可以参考文献[4]。这里直接给出构造好的结果,下图(a)为S盒,图(b)为S-1(S盒的逆)。S盒用于提供密码算法的混淆性。
  S和S-1分别为16x16的矩阵,完成一个8比特输入到8比特输出的映射,输入的高4-bit对应的值作为行标,低4-bit对应的值作为列标。假设输入字节的值为a=a7a6a5a4a3a2a1a0,则输出值为S[a7a6a5a4][a3a2a1a0],S-1的变换也同理。
  例如:字节B替换后的值为(S[0][0]=)63H,再通过S-1即可得到替换前的值,(S-1 [6][3]=)00H。
1.2 行移位
  行移位是一个4x4的矩阵内部字节之间的置换,用于提供算法的扩散性。
  1) 正向行移位
  正向行移位用于加密,其原理图如下。其中:第一行保持不变,第二行循环左移8比特,第三行循环左移16比特,第四行循环左移24比特。
  假设矩阵的名字为state,用公式表示如下:state&[i][j] = state[i][(j+i)%4];其中i、j属于[0,3]。
  2) 逆向行移位
  逆向行移位即是相反的操作,即:第一行保持不变,第二行循环右移8比特,第三行循环右移16比特,第四行循环右移24比特。
  用公式表示如下:state&[i][j] = state[i][(4+j-i)%4];其中i、j属于[0,3]。
1.3 列混淆
  列混淆:利用GF(28)域上算术特性的一个代替,同样用于提供算法的扩散性。
  1) 正向列混淆
  正向列混淆的原理图如下:
  根据矩阵的乘法可知,在列混淆的过程中,每个字节对应的值只与该列的4个值有关系。此处的乘法和加法都是定义在GF(28)上的,需要注意如下几点:
    1)&将某个字节所对应的值乘以2,其结果就是将该值的二进制位左移一位,如果原始值的最高位为1,则还需要将移位后的结果异或;[1]
      英文原文描述如下:In particular, multiplication of a value by x (i.e., by {02}) can be implemented as a 1-bit left shift followed by a conditional bitwise XOR with () if the leftmost bit of the original value (prior to the shift) is 1.
    2)&乘法对加法满足分配率,例如:07&S0,0=(01&02&04)&S0,0= S0,0&(02&S0,0)(04&S0,0)
    3)&此处的矩阵乘法与一般意义上矩阵的乘法有所不同,各个值在相加时使用的是模28加法(异或运算)。
  下面举一个例子,假设某一列的值如下图,运算过程如下:
  在计算02与C9的乘积时,由于C9对应最左边的比特为1,因此需要将C9左移一位后的值与()求异或。同理可以求出另外几个值。
  2) 逆向列混淆
  逆向列混淆的原理图如下:
  由于:
  说明两个矩阵互逆,经过一次逆向列混淆后即可恢复原文。
1.4 轮密钥加
  这个操作相对简单,其依据的原理是&任何数和自身的异或结果为0&。加密过程中,每轮的输入与轮子密钥异或一次;因此,解密时再异或上该轮的轮子密钥即可恢复。
1.5 密钥扩展算法
  密钥扩展的原理图如下:
  密钥扩展过程说明:
    1) &将种子密钥按图(a)的格式排列,其中k0、k1、&&、k15依次表示种子密钥的一个字节;排列后用4个32比特的字表示,分别记为w[0]、w[1]、w[2]、w[3];
    2) &按照如下方式,依次求解w[j],其中j是整数并且属于[4,43];
    3) &若j%4=0,则w[j]=w[j-4]&g(w[j-1]),否则w[j]=w[j-4]&w[j-1];
  函数g的流程说明:
    a) &将w循环左移8比特;
    b) &分别对每个字节做S盒置换;
    c) &与32比特的常量(RC[j/4],0,0,0)进行异或,RC是一个一维数组,其值如下。(RC的值只需要有10个,而此处用了11个,实际上RC[0]在运算中没有用到,增加RC[0]是为了便于程序中用数组表示。由于j的最小取值是4,j/4的最小取值则是1,因此不会产生错误。)
      RC = {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36}
  密码算法要求是可逆的,这样解密算法才能正确的恢复明文。拿AES来说,在密钥固定的情况下,明文和密文在整个输入空间是一一对应的。因此算法的各个部件也都是可逆的,再将各个部件的操作顺序设计成可逆的,密文就能正确的解密了。
  自己写了一份的实现代码,放在Github上;另外一份代码实现了3种密钥长度的算法,和标准文档完全保存一致,没有做任何优化,有兴趣可以看看。
  AES中列混淆部分设计有限域乘法操作,在运行中需要消耗较多的时间。现在的计算平台都拥有丰富的软件资源(RAM、Flash等),因此AES的软件实现一般都会采用查表的方式,将字节替代、行移位、列混淆合在一起查表,大概消耗8-10K字节的存储空间,但效率非常之高。
  在硬件上,为了减少实现面积,可以通过对解密的操作进行适当调换,这样解密操作可以复用加密的电路。
SIMD [10]:单指令流多数据流指令,最常用的包括SSE、SSE2、AVX、AVX512 [5] 等,现在很多Intel和AMD的处理器都支持。SIMD操作能够很大地提高效率,一些项目中都有用到,比如libsodium [6](A modern and easy-to-use crypto library)、FastMemcpy [7] (Speed-up over 50% in average vs traditional memcpy in gcc 4.9 or vc2012&)、hamming_weight [8] (C library to compute the Hamming weight of arrays)等。
AES-NI [9]:AES硬件指令,能够很快地实现AES加解密,大部分Intel处理器、AMD处理器支持。
4 参考文献
[1] William Stallings著;王张宜等译. 密码编码学与网络安全&&原理与实践(第五版)[M]. 北京:电子工业出版社,2012.1.
[2]&Daemen J, Rijmen V. AES proposal: Rijndael[J]. 1998.
[3] Advanced Encryption Standard, , 2017年3月获取.
[4]&Joan Daemen and Vincent Rijmen, The Design of Rijndael, AES - The Advanced Encryption Standard, Springer-Verlag
[5] SSE, SSE2, AVX, AVX512等, , 2017年6月获取.
[6] Libsodium, , 2017年6月获取.
[7] FastMemcpy,&, 2017年6月获取.
[8] Hamming_weight, , 2017年6月获取.
[9] AES-NI,&, 2017年6月获取.
[10] SIMD,&, 2017年6月获取.
& & a) 列混淆中加法是模28,不是模2;
& & b) 增加了SIMD和AES-NI的介绍;
& & a) 增加了Rijndael和AES的区别;b) 增加了参考文献;c) 提到AES查表的实现;d) 循环移位不以字节为单位,统一改成比特;
& & e)&修复了Rijndael算法链接的错误;f) 更正了错别字;
阅读(...) 评论()

我要回帖

更多关于 rip采用什么算法 的文章

 

随机推荐