一. 概述
美国政府在 1997 年 9 月 12 日公开征集更高效更安全的替代 DES 加密算法,第一轮共有 15 种算法入选,其中 5 种算法入围了决赛,分别是 MARS,RC6,Rijndael,Serpent 和 Twofish。又经过 3 年的验证、评测及公众讨论之后 Rijndael 算法最终入选。
Rijndael 算法之所以最终能够被选为AES的原因是其安全、性能好、效率高、实用灵活。
Rijndael 算法支持多种分组及密钥长度,介于 128-256 之间所有 32 的倍数均可,最小支持 128 位,最大 256 位,而 AES 标准支持的分组大小固定为 128 位,密钥长度有 3 种选择:128 位、192 位及 256 位。
二. AES 算法的数学基础
Rijndaels 算法中的许多运算是按字节和 4 字节长的字来定义的。把一个字节看成是在有限域 GF(28) 上的一个元素。有限域(Finite Field)又名伽罗瓦域(Galois field),简单言之就是一个满足特定规则的集合,集合中的元素可以进行加减乘除运算,且运算结果也是属于此集合。
1. 有限域
AES的基础域是有限域 GF(28)
- 一个字节的全体 256 种取值构成一个 GF(28)
- 一个 GF(2) 上的 8 次既约多项式可生成一个 GF(28)
- GF(28) 的全体元素构成加法交换群、线性空间。
- GF(28) 的非零元素构成乘法循环群。
2. AES 在有限域上的表示
有限域 GF(28) 上的元素有多种表示方法,为了方便,Rijndaels 算法采用多项式表示法,下面是与还表示方法相关的几个定义
定义 1 : 一个由比特位 b7b6b5b4b3b2b1b0 组成的字节可表示成系数为 (0, 1) 的二进制多项式:b7X7 + b6X6 + b5X5 + b4X4 + b3X3 + b2X2 + b1X + b0
例:例:字节57=01010111的多项式表示为:
定义 2 : 在 GF(28) 上的加法定义为二进制多项式的加法,其系数按位模 2 加。
例: 57+83=D4 等价于
定义 3 : 在 GF(28) 上的乘法定义为二进制多项式的乘积模一个次数为8的不可约多项式
其系数的十六进制表示为 11B
,例: 57×83=C1 等价于
定义 4 : 在 GF(28) 中,二进制多项式 b(x) 满足乘法逆为式a(x)b(x) mod m(x) = 1
的二进制多项式。
定义 5 : 在 GF(28) 中,倍乘函数 xtime(b(x)) 定义为x·b(x) mod m(x)
。具体的运算规则是:把字节B左移一位,若 b7=1, 则减去 m(x),而在 GF(28) 上加减法等价,即加上 m(x)。例:
3. AES 的字表示与运算
3.1. 字表示
AES 数据处理的单位是字节和字,一个字由四个字节组成,表示为系数取自 GF(28) 上的次数低于 4 次的多项式,例如: 字57 83 4A D1
等价于
3.2. 字运算
字运算是基于上述关于 AES 在 GF(28) 中的运算规则的。
字加法 : 两多项式系数按位模 2 加
字乘法 : 设 a 和 c 是两个字, a(x) 和 c(x) 是其字多项式, AES 定义 a 和 c 的乘积 b 为
如:设 a(x)、c(x) 和 b(x) 分别分别如下面(图 2-1)中所示, 由 b(x) = a(x)c(x) mod x4+1 得(图 2-1)表达式组
写成矩阵形式如下面的(图 2-3)所示,x4+1 是可约多项式,字 c(x) 不一定有逆,但 AES 选择的 c(x) 有逆,
从而使得 b(x) 的表达式可以使用上面(图 2-4)的矩阵表示,从而使得下面的MixColumns
变换变为矩阵的乘法运算。
字 x 乘法 :
矩阵形式如下图所示,因为模 x4+1,字 x 乘法相当于按字节循环移位
三. AES 的加密过程
1. 状态
在 AES 中除了字节和字外,还有一种被称为状态的数据处理方式,它用来存储加解密过程中的中间数据,一般用以字节为元素的矩阵或二维数组表示。
如果用 Nb 代表明密文所含的字数。 Nk 代表密钥所含的字数。 Nr 代表迭代轮数,则当 Nb 和 Nk 都等于 4 时的状态与密钥数组分别如下面的(图 3-1)和(图 3-2) 所示
根据 Rijndael 算法的定义,加密轮数会针对不同的分组及不同的密钥长度选择不同的数值
2. 加密过程概述
AES 加密算法的主要步骤有
- 轮密钥生成
- 初始轮密钥加变换:将最初的第一个(Nk 个字长)轮密钥亦即主密钥与初始状态进行比特位异或操作
- 标准轮(前 9, 11 或 13 轮)变换:* S 盒变换* 行移位变换* 列混合变换* 轮密钥加变换
- 最后一轮(第10, 12 或 14 轮)变换* S 盒变换* 行移位变换* 轮密钥加变换
3. AES 有限域上的加法
/**
* 有限域GF(2)上的加法,<tt>modeSize</tt>位的异或操作
* xor corresponding byte in two state arrays
* @param first first operand
* @param second second operand
* @return xor result
*/
private short[][] xor(short[][] first, short[][] second) {short[][] result = new short[first.length][4];int length = first.length;for (short i = 0; i < length; i+