高级数据加密标准 AES**(SP结构)**
Rijndael 提交者:Joan Daemen & Vincent Rijmen
分组长度:128bit
密钥长度:128/192/256bit
一. AES的数学基础
- 01010111组成的字节可表示为 x^6 + x^4 + x^2 + x + 1,也可以为16进制‘57’
选定m(x)为所有次数为8的不可约多项式列表中的一个。
若a(x) * b(x) modm(x) = 1,则b(x)为a(x)的逆元。 - 有限环GF(2^8)[x] / (x^4+1)中的运算。
加法:比特位异或
乘法:假定有GF(2^8)上的多项式:
a(x) = a3x^3 + a2x^2 + a1x + a0
b(x) = b3x^3 + b2x^2 + b1x + b0
因为x^i mod(x^4 + 1) = x^(imod4),所以环中
d(x) = a(x) * b(x)
=d3x^3 + d2x^2 + d1x + d0
二. AES的算法描述
PS. 最后一轮没有列变换
一. 数据处理
AES是数据块长度和密钥长度都可变的迭代分组加密算法。数据块长度和密钥长度可分别为128bit,192bit,256bit。
数据块写成字的形式,把字记为列。
二. 一轮加密
- 逐字节进行SubBytes处理:以每个字节的值为索引,从一张拥有256个值的替换表(S-Box)中查找出对应的值的处理。非线性字节变换
- ShiftRows(扩散):数据块的第0行保持不变,第一行循环左移C1位,第二行循环左移C2位,第三行循环左移C3位。
- MixColumns(扩散):
用行列式计算:‘02’ = 00000010 = x ‘03’ = 00000011 = x+1, 需要模多项式m(x)=x^8 + x^4 + x^3 + x + 1 - AddRoundKey:将MixColumns的输出与轮密钥进行XOR(异或运算)。
Rijndael中要重复进行10~14轮
SP:输入的所有比特在一轮中都会被加密
Feistel:每一轮都只加密一半输入的比特
三. 子密钥的生成
密钥长度为128bit时:
首先将初始密钥输入到一个44矩阵中。这个44矩阵的每一列的4个字节组成一个字,矩阵4列的4个字依次命名为w[0]、w[1]、w[2]和 w[3]。它们构成了一个以字为单位的数组 w。接着,对w数组扩充 40 个新列,构成总共 44 列的扩展密码数组。
(1)如果 i 不是 4 的倍数,那么第 i 列由如下等式确定:
w[i]=w[i−4]⊕w[i−1]
(2)如果i是4的倍数,那么第i列由如下等式确定:
w[i]=w[i−4]⊕SubByte(RotWord(w[i−1]))⊕Rcon[i/4]
四. 解密
解密: