来源:Lee原文地址:http://davidleee.com/2016/04/26/about-aes-encryption/? hmsr = toutiao
来源:Lee原文地址:http://davidleee.com/2016/04/26/about-aes-encryption/? hmsr = toutiao . io & amp;utm _ medium = toutiao.io & amputm_source=toutiao.io
所有的人都会死
AES的出现是为了取代原来的数据加密标准(DES)。DES作为一种祖父级加密算法,在普及之后已经到了退休年龄。
关于DES
在继续学习AES之前,我们先来看看它取代了什么DES。
它的全称是数据加密标准,是一种对称密钥加密块算法。一般的加密过程如下所示:

在进入加密过程之前,64位的块被拆分成两个32位的子块,作为IP的两个输入。中间的f是Feistel函数,算法中的密钥就用在这个函数中。
分组加密(Block encryption):分组密码(Block cipher)也称分组加密,是将明文分成多个等长的块,使用一定的算法和对称密钥分别对每组进行加密和解密的一种方式。
DES在1976年一度流行,被美国联邦政府国家标准局指定为联邦数据处理标准(FIPS)。但是,由于它只使用56位密钥,所以目前它不是一种安全的加密方法。1999年1月,一个组织在22小时15分钟内公开破解了一个DES密钥。
后来,出现了一种改进的DES,称为TDES或3DES。本质上是增加了三个键,算法上没有任何改进。(感觉像个笑话)
2001年,DES不再是NIST(前FIPS)的标准,逐渐被AES取代。
进入正题
AES,全称为高级加密标准,最初称为Rijndael加密方法。(或者新名字好发音)
至于为什么开头会有这么拗口的名字,因为两位作者的名字分别是琼·代蒙和文森特·里门,你查出原因了吗?这是某种密码学家同意的命名方法吗?
2001年11月26日,美国NIST公布了AES,开始了长达五年的标准化进程,直到Rijndael被选为最合适的方法。
2002年5月26日,AES成为联邦政府标准。它也是美国联邦安全局(NSA)批准的唯一一种加密绝密信息的公开加密方法。
也就是说,如果你想黑掉FBI,也许你可以试试AES解密:)
严格来说,AES和Rijndael并不完全一样。AES使用固定大小为128位的块,密钥的大小只能是128位、192位或256位;但是Rijndael使用的块大小和密钥长度可以是128位到256位之间的任意值,可以被32整除。相对来说,灵活性要高很多。
主流程
AES加密算法的组成可以分为四个主要部分:
AddRoundKey
亚字节
ShiftRows
混合列
简单来说,就是把上面的部分组合起来,形成三个不同的序列,然后重复这些过程序列几轮。具体循环次数由钥匙的长度决定:
18位密钥:循环10次
12位密钥:12个周期
26位密钥:循环14次
这三个序列是:
第一周期:
AddRoundKey
一般周期:
亚字节
ShiftRows
混合列
AddRoundKey
结束循环:
亚字节
ShiftRows
AddRoundKey
那么这些部分做了什么呢?
AddRoundKey
在每个周期中,通过Rijndael密钥生成方案(https://en . Wikipedia . org/wiki/Rijndael _ key _ schedule)从主密钥生成子密钥。该子项的大小应该等于块的大小,并且应该以列优先的方式排列在矩阵中(每个块也以这种方式排列在矩阵中)。
接下来,将这个子项的值与块上相应位置的值进行异或运算,形成一个新的矩阵,这个过程到此结束。
亚字节
这一步会用到一个叫Rijndael S-box的东西,其实就是一个8位的替换表。每个字节的数据都可以在表中找到相应的替换结果。只要这个S盒在建立的时候足够好,就可以大大降低这种加密的线性关系。下面是一个6位S盒的例子。输入值是011011,输出值是1001。
通过S-box替换分块矩阵中的每个元素,形成一个替换矩阵,这是亚字节的工作。
ShiftRows
这一步很好理解,就是将分块矩阵中的每一行循环左移,最后的效果是使输出矩阵的每一列中的元素都属于输入矩阵原来的不同列。
这确保了每列中的元素是非线性相关的。
混合列
这部分会接受4个字节的输入,输出4个字节,每个字节都会影响输出,所以和上面的ShiftRows一起为加密算法提供了很好的扩散。
扩散:如果改变了原文的任何一位,那么密文中一半以上的位也要改变;反之,任何一个密文被修改,都要修改一半以上的原文。——威廉·斯塔林斯(2014)。密码学与网络安全(第6版。)
简单来说,这一步就是说输入矩阵的每一列在一定条件下乘以一个固定的多项式。最终结果将是一个完全不同于输入矩阵的输出矩阵。

更多信息
伽罗瓦域(GF,有限域)乘法(http://blog.csdn.net/mengboy/article/details/1514445)
混淆与扩散(https://en . Wikipedia . org/wiki/Confusion _ and _ diffusion)
填充算法
对于块加密算法,如果数据长度小于一个块的大小,我们需要主动填充一些数据,使这个块的大小满足要求。因此,合适的填充算法尤为重要。
经导师提醒,看了网上的一些博客,发现Java和iOS使用的AES填充算法是不一样的(http://my . oschina . net/NIC sun/blog/95632)。Java中使用PKCS5Padding,iOS中使用PKCS7Padding。所以在一端加密解密没有问题,但是把密文发给另一端解密会得到完全不同的结果。
P.S .这里说的Java端应该是指服务器端。不知道安卓端有没有这个问题。
PKCS5相当于PKCS7的子集,因为PKCS7理论上支持1~255字节的块大小填充,而PKCS5只支持8字节的块大小填充。其实PKCS5更适用于DES/3DES。
具体的填充过程也很好理解。只举一个直接的例子:比如块大小为8字节的加密算法,现在有一串长度为9:
法国法郎法国法郎法国法郎法国法郎法国法郎法国法郎(9法郎)
如果用PKCS7算法来填充,结果就是这样。
法国法郎法国法郎法国法郎法国法郎法国法郎
填充的目的是填充块,所以这里的填充长度是7;使用PKCS7算法,填充的每个字节都是填充长度的十六进制数,即7。
有趣的是,如果用PKCS5填充,因为它的目标块大小是8,所以这里会填充一个01。详情请参考AES能否使用PKCS # 5填充(http://crypto . stack exchange . com/a/11274)中的最佳答案。
参考数据
高级加密标准(https://en . Wikipedia . org/wiki/Advanced _ Encryption _ Standard)
Rijndael密钥生成方案(https://en.wikipedia.org/wiki/Rijndael_key_schedule)
伽罗瓦域(GF,有限域)乘法(http://blog.csdn.net/mengboy/article/details/1514445)
混淆与扩散(https://en . Wikipedia . org/wiki/Confusion _ and _ diffusion)
关于java加密的AES256算法,解决ios解密无法解密的问题(http://my.oschina.net/nicsun/blog/95632)
AES可以使用PKCS#5填充吗(http://crypto . stack exchange . com/questions/11272/can-AES-use-pkcs 5-padding)
香草社区发起晨读计划,坚持每天积累一点。今天的努力至少让我们比昨天走得更远。
晨读计划期待你的加入......
Vanilla:基于OpenResty的高性能Web应用开发框架
我们的微信号:Vanilla-OpenResty
我们的QQ群:205773855,481213820,34782325
晨读计划
2016/04/28
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/255300.html