数据加密 ---- AES 加密

版权声明:本文为博主原创文章,转载请务必注明作者与原文链接。 https://blog.csdn.net/jingerppp/article/details/83650811

1. 简介

    AES 是Advanced Encryption Standard(高级加密标准) 的缩写,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

    该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael为名投稿高级加密标准的甄选流程。(Rijndael的发音近于"Rhine doll")

其他算法可以看:数据加密 ---- 总篇

2. 形成过程

  • 1997年4月15日,美国ANSI发起征集AES(advanced encryption standard)的活动,并为此成立了AES工作小组。
  • 1997年9月12日,美国联邦登记处公布了正式征集AES候选算法的通告。对AES的基本要求是: 比三重DES快、至少与三重DES一样安全、数据分组长度为128比特、密钥长度为128/192/256比特。
  • 1998年8月12日,在首届AES候选会议(first AES candidate conference)上公布了AES的15个候选算法,任由全世界各机构和个人攻击和评论。
  • 1999年3月,在第2届AES候选会议(second AES candidate conference)上经过对全球各密码机构和个人对候选算法分析结果的讨论,从15个候选算法中选出了5个。分别是RC6、Rijndael、SERPENT、Twofish和MARS。
  • 2000年4月13日至14日,召开了第3届AES候选会议(third AES candidate conference),继续对最后5个候选算法进行讨论。
  • 2000年10月2日,NIST宣布Rijndael作为新的AES。经过3年多的讨论,Rijndael终于脱颖而出。
  • Rijndael由比利时的Joan Daemen和Vincent Rijmen设计。算法的原型是Square算法,它的设计策略是宽轨迹策略(wide trail strategy)。算法有很好的抵抗差分密码分析及线性密码分析的能力。

3. 加密过程

博文 AES加密算法的详细介绍与实现 中已经详细了说明了AES 的加密过程,大致是如下步骤:

  • 密钥扩展(KeyExpansion)
  • 初始轮(Initial Round)
  • 重复轮(Rounds)每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey
  • 最终轮(Final Round),最终轮没有MixColumns。

其中重复轮中的 4 个操作为:

  • AddRoundKey—矩阵中的每一个字节都与该次回合密钥(round key)做XOR运算;每个子密钥由密钥生成方案产生。
  • SubBytes—透过一个非线性的替换函数,用查找表的方式把每个字节替换成对应的字节。
  • ShiftRows—将矩阵中的每个横列进行循环式移位。
  • MixColumns—为了充分混合矩阵中各个直行的操作。这个步骤使用线性转换来混合每内联的四个字节。最后一个加密循环中省略MixColumns步骤,而以另一个AddRoundKey取代。

具体每一个步骤的算法,可以看另一篇博文:AES加密算法的详细介绍与实现

4. 加密说明

在AES 加密使用时需要了解几个概念:

  • AES 密钥

    严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中两者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度均可以是128,192或256比特。加密过程中使用的密钥是由Rijndael密钥生成方案产生。

    JDK目前只支持AES-128加密,也就是传入的密钥必须是长度为16的字符串。

  • 初始向量Iv(Initialization Vector)

使用除ECB以外的其他加密模式均需要传入一个初始向量,其大小与块大小相等,AES块大小是128bit,所以Iv的长度是16字节,初始向量可以加强算法强度。

  • 加密模式(Cipher Mode

从博文 AES加密算法的详细介绍与实现 我们知道,AES 加密是将明文进行分组,然后进行重复的运算,最终达到加密的效果,所以,AES 加密也属于分组加密,常见的还有DES、GCM、ARC4等。

常用分组工作模式有CBC、ECB、CTR、OFB、CFB、PCBC

详细看 分组密码工作模式

  • 填充方式(Padding)

决定了最后的一个块需要填充的内容,填充方式有PKCS5Padding、PKCS7Padding、NOPADDING、ISO10126Padding等,填充方式为PKCS5Padding时,最后一个块需要填充χ个字节,填充的值就是χ;填充方式为NOPADDING时,最后的一个块填充的内容由程序员自己决定,通常填充0。(详细看 加密数据的填充方式

具体如下:

算法/模式/填充 16字节加密后数据长度 不满16字节加密后长度
AES/CBC/NoPadding  16 不支持
AES/CBC/PKCS5Padding 32 16
AES/CBC/ISO10126Padding 32 16
AES/CFB/NoPadding 16 原始数据长度
AES/CFB/PKCS5Padding 32 16
AES/CFB/ISO10126Padding 32 16
AES/ECB/NoPadding 16 不支持
AES/ECB/PKCS5Padding 32 16
AES/ECB/ISO10126Padding 32 16
AES/OFB/NoPadding 16 原始数据长度
AES/OFB/PKCS5Padding 32 16
AES/OFB/ISO10126Padding 32 16
AES/PCBC/NoPadding 16 不支持
AES/PCBC/PKCS5Padding 32 16
AES/PCBC/ISO10126Padding 32 16

   

 

 

 

 

 

 

 

可以看到,在原始数据长度为16的整数倍时,假如原始数据长度等于16*n,则使用NoPadding时加密后数据长度等于16*n,其它情况下加密数据长度等于16*(n+1)。在不足16的整数倍的情况下,假如原始数据长度等于16*n+m[其中m小于16],除了NoPadding填充之外的任何方式,加密数据长度都等于16*(n+1);NoPadding填充情况下,CBC、ECB和PCBC三种模式是不支持的,CFB、OFB两种模式下则加密数据长度等于原始数据长度。

其他算法可以看:数据加密 ---- 总篇

参考:

高级加密标准

AES加密算法的详细介绍与实现

猜你喜欢

转载自blog.csdn.net/jingerppp/article/details/83650811