,AES的基本要求是:⽐三重DES快、⾄少与三重DES⼀样安全、数据分组长度为128-bit、密钥长度为128/192/256-bit,对应于密钥的不同长度,加密轮的次数也不尽相同。选定Rijndael算法为新的AES算法。算法的原型是Square算法,其设计策略为宽轨迹策略(针对差分分析和线性分析提出的,最⼤优点是可以给出算法的最佳差分特征的概率以及最佳线性逼近的偏差的界;由此可以分析算法抵抗差分密码分析以及线性密码分析的能⼒。)
AES加密标准是当下最⼴泛使⽤的对称密钥加密体系。AES加密标准已经⼴泛应⽤在互联⽹安全领域,譬如IPsec、TLS、Wi-Fi加密标准IEEE 802.11i、SSH、Skype等领域。
Rijndael设计思想
Rijndael没有Feistel结构,其轮函数是由三个不同的可逆均匀变换(每个⽐特都是⽤类似的⽅法进⾏处理的)组成的,称它们为3个“层”。不同的层选择的⼤部分是建⽴在“宽轨迹策略”的应⽤基础之上。
线性混合层 确保多轮之上的⾼度扩散
⾮线性层 将具有最优的“最坏情况⾮线性特征”的S盒并⾏使⽤密钥加密 单轮⼦密钥简单地异或到中间状态上,实现⼀次性掩盖
在第⼀轮之前,⽤了⼀个初始密钥加层(其⽬的为在不知道密钥的情况下,对最后⼀个密钥加层以后的任⼀曾可简单地剥去,因此初始密钥加层对密码的安全性⽆任何意义。为了使加密算法和解密算法在结构上更加接近,最后⼀轮的线性混合曾与前⾯各轮的线性混合层不同,这类似于DES的最后⼀轮不做左右交换(这种设计不以任何⽅式提⾼或降低该密码的安全性)
Rijndael算法说明
该算法是⼀个迭代型分组密码,分组长度和密钥长度都可改变,各⾃可以独⾃地制定为128-bit、192-bit、256-bit
状态、种⼦密钥和轮数
算法的中间结果需要进⾏分组,称该分组为状态。所有的操作都在状态上进⾏。状态可以⽤以字节为元素的矩阵阵列表⽰,该阵列有4⾏,列数计为Nb。Nb等于分组长度除以32。
种⼦密钥类似地⽤⼀个以字节为元素的矩阵阵列表⽰,该阵列有4⾏,列数记为Nk,Nk等于分组长度除以32。
当然,可以将这些分组看成⼀维数组,数组中的每⼀个元素是上述阵列中的四个字节元素组成的列向量,显然,数组的长度可以分为4,6,8三种。四个字节的元素构成的列向量有时也称为字。
算法的输⼊和输出被看作是由8-bit字节构成的⼀维数组,其元素的下标范围为0(4Nb-1),因此,输⼊和输出以字节为单位的分组长度分别为16,24和32。输⼊的种⼦密钥也堪称是由8-bit字节构成的⼀维数组,其下标的范围为0(4Nb-1)。因此,种⼦密钥以字节为单位的分组长度也分别为16,24和32。
算法的输⼊是以字节为单位,按照列优先的顺序依次填⼊矩阵中。密钥也是⼀样。⽽输出也同样是依照相同的顺序取出。迭代的轮数计为Nr,该数值与Nb和Nk相关NrNb=4Nb=6Nb=8Nk=410Nk=612Nk=814
121214
141414
轮函数
Rijndael的轮函数由4个不同的计算部件组成:字节代换(ByteSub)、⾏移位(ShiftRow)、列混合(MixColumn)、密钥加(AddRoundKey)字节代换
字节代换是⾮线性变换,独⽴地对状态的每个字节进⾏。代换表(S-Box)是可逆的。
1. 将字节看作GF(2^8)上的元素,映射到⾃⼰的乘法逆元,'00'映射到⾃⼰。(可以通过矩阵计算得出)2. 对字节做仿射变换⾏移位
将状态阵列的各⾏进⾏循环移位,不同⽤的状态⾏的位移量不同。第0⾏不移动,第1⾏循环左移C1个字节,第⼆⾏循环左移C2个字节,第三⾏循环左移C3个字节。
NbC1C2C3468
111
223
334
列混合
列混合是AES中主要的Diffusion⼯序。其⽅式为对于每⼀个列,乘以⼀个4×4的矩阵。再加上⼀个相关的系数向量。密钥加
密钥加时将轮密钥简单地与状态进⾏逐⾏⽐特异或。轮密钥由种⼦密钥通过密钥编排算法得到,轮密钥长度等于分组长度Nb
密钥编排
由密钥扩展和轮密钥选取两部分组成,其基本原则如下
轮密钥的⽐特数等于分组长度乘以轮数加1种⼦密钥被扩展成为扩展密钥
轮密钥从扩展密钥中取,其中第⼀轮轮密钥取扩展密钥的前Nb个字,第2轮轮密钥去接下来的Nb个字,如此下去。密钥扩展
扩展密钥以4字节为元素的⼀维阵列扩展算法会根据Nk<=6和Nk>6有不同当Nk<=6时,扩展算法如下:
KeyExpansion(byte Key[4 * Nk], W[Nb * (Nr + 1]){ for(i = 0; i < Nk; i++){
W[i] = (Key[4 * i], Key[4 * i + 1], Key[4 * i + 2], Key[4 * i + 3]); for(i = Nk; i < Nb * (Nr + 1); i++){ temp = W[i - 1];
if(i % Nb == 0) temp = SubByte(RotByte(temp))^Rcon[i / Nk]; W[i] = W[i - Nk] ^ temp;
其中Key[4 * Nk]为种⼦密钥。函数SubByte返回4字节字,其中每⼀个字节都是⽤Rijndael的S盒作⽤到输⼊字对应的字节得到。函数RotByte也返回4字节字,由输⼊的字循环移位得到。当Nk>6时,扩展算法如下:
KeyExpansion(byte Key[4 * Nk], W[Nb * (Nr + 1]){ for(i = 0; i < Nk; i++){
W[i] = (Key[4 * i], Key[4 * i + 1], Key[4 * i + 2], Key[4 * i + 3]); for(i = Nk; i < Nb * (Nr + 1); i++){ temp = W[i - 1];
if(i % Nb == 0) temp = SubByte(RotByte(temp))^Rcon[i / Nk]; W[i] = W[i - Nk] ^ temp;
因篇幅问题不能全部显示,请点此查看更多更全内容