AES算法简记
1997年,美国国家标准技木研究所(NIST)发起征集AES算法的活动,并专门成立AES工作组,其目的是确定一个非保密的、公开的、全球免费使用的分组密码算法,用于保护下一世纪*的敏感信息。
NIST规定候选算法必须满足下面的要求:
- 密码必须是没有密级的,绝不能像商业秘密那样来保护它;
- 算法的全部描述必须公开披露;
- 密码必须可以在世界范围内免费使用;
- 密码系统支持至少128比特长的分组;
- 密码支持的**长度至少为128、192和256比特。
参与AES的候选算法中,Rijndael 提供了安全性、软件和硬件性能、低内存需求以及灵活性的最好的组合,因此NIST确定选择Rijndael作为AES。
2000年选中比利时密码学家提出的密码算法Rijndael作为AES。2001年美国*正式颁布AES为美国国家标准,目前AES已经被一些国际标准化组织采纳为标准。其被选中的原因是安全、性能好效率高、实用、灵活。
Rijndael算法是一个数据块长度和**长度都可变的分组加密算法,其数据块长度和**长度都可独立地选定为大于等于128位且小于等于256位的32位的任意倍数。美国颁布AES时规定数据块的长度为128位,**长度可分别选择为128位、192位或256位。
Rijndael算法采用分组密码的一种通用结构:对轮函数实施迭代的结构。
Rijndael的轮函数由以下三层组成:
- 非线性层:进行非线性S盒变换ByteSub,由16个S盒并置而成,起混淆的作用。
- 线性混合层:进行行移位变换和列混合变换以确保多圈之上的高度扩散;
- **加层:进行圈**加变换,将圈**简单地异或到中间状态上,实现**的加密控制作用。
AES的结构
明文分组的长度为128位即16字节。**长度可以为16、24、32字节(128、192、256位),根据**的长度,算法被称为AES-128,AES-192,AES-256。
轮数依赖于**长度:16、24、32字节分别对应10、12、14轮。
加密和解密算法的输入是一个128位分组。
AES的加密过程:
AES的参数:
AES加密和解密
- AES的显著特征是它不是Feistel结构,在每一轮都使用代替和混淆将整个数据分组作为一个单一的矩阵处理。
- 输入的**被扩展成44个32位字节所组成的数组
- 由4个不同的阶段组成,包括一个置换和三个代替:
字节代替:用一个S盒完成分组的字节到字节的代替;
行移位:一个简单的置换;
列混淆:利用域GF(28)上的算术特性的一个代替;
轮**加:当前分组和扩展**的一部分进行按位异或。
- 算法结构简单:对加解密操作,算法由轮**加开始,执行9轮迭代运算,每轮包含所有四个阶段的代替,接着是第10轮的3个阶段
- 仅在轮**加阶段使用**
- 算法以轮**加开始,以轮**加结束
- 轮**加实质上是一种Vernam密码形式,就其本身是不难破译的,另外三个阶段(没有提供算法的安全性)一起提供了混淆、扩散以及非线性功能
- 每个阶段均可逆
- 解密算法按逆序方式利用了扩展**。解密算法和加密算法不一样,这是由AES的特定结构决定。加密和解密中**扩展的形式一样,但在解密中变换的顺序与加密中变换的顺序不同,缺点:对同时需要加解密的应用而言,需要两个不同的软件或固件模块。
- 加密和解密过程的最后一轮只包含3个阶段,由AES的特定结构决定的,也是密码算法可逆性的要求。
AES的**扩展
**扩展算法用来防止已有的密码分析攻击,使用与轮相关的轮常量是为了防止不同轮的轮**产生方式上的对称性或相似性。
输入4个字(16字节),输出一个44个字组成(176字节)的一维线性数组(11轮:为初始轮**加阶段和算法中其他10轮中的每一轮提供4字的轮**)。
输入**直接被复制到扩展**数组的前4个字,然后每次用4个字填充扩展**数组余下的部分,每一个新增的字w[i]的值依赖于w[i-1]和w[i-4]。
在四种情形中,三组使用了异或。
对w数组中下标为4的倍数的元素采用更复杂的函数来计算。
基本原理:
- 知道**或轮**的部分位不能计算出轮**的其他位
- 是一个可逆的变换
- 能够在各种处理器上有效的执行
- 使用轮变量来消除对称性
- 将**的差异性扩散到轮**中
- 足够的非线性以防止轮**的差异完全由**的差异决定
- 易于描述