AES
AES
简介
数据加密标准(DES)的密钥长度是56比特,算法的理论安全强度是256,随着计算机的发展,DES变得不够安全,1997年1月,美国国家标准技术研究所(NIST)宣布征集高级加密标准(AES),用于取代DES。最终Rijndael、Serpent、Twofist、RC6、MARS五种算法进入最后一轮,经过安全性分析、软硬件性能评估等步骤,Rijndael获胜。该算法是一个分组密码算法族,分组长度包括128bit、160bit、192bit、224bit、256bit五种,密钥长度也包括这五种长度,但是最终AES选择了分组长度为128bit,密钥长度分为128bit、192bit、256bit三种版本。三种版本的思路基本一样,密钥扩展算法的过程略有不同,加解密的轮数适当增加,但是操作是一致的。AES算法是一个分组密码,属于对称密码范畴。
算法流程
AES加密算法包含4个操作:字节替代(SubBytes)、位移位(ShiftRows)、列混淆(MixColumns)和轮密钥加。解密算法的每一步对应加密算法的逆操作;加解密所有操作的顺序正好相反。加解密中每轮的的密钥分别由种子密钥经过密钥扩展算法得到。算法中的16字节的明文、密文和*密钥都用一个4*4的矩阵表示。
操作1:字节替代
字节替代主要是通过S盒完成一个字节到另外一个字节的映射。下面的两张图分别为S盒和S-1(S盒的逆)。S盒用于提供密码算法的混淆性。
S盒和S盒的逆都是16*16的矩阵,完成8bit输入到8bit输出的映射,输入的高4bit对应的值为行标,低4bit的值为列标,假定输入字节的值为a=a7a6a5a4a3a2a1a0,则输出的值为S[a7a6a5a4][a3a2a1a0],S-1的变换也同理。
S盒的构造方法
- 按字节值的升序逐行初始化S盒。第一行是{00},{01},{02},…,{0F};第二行是{10},{11},{12},…,{1F}…直至第16行。因此在第y+1行第x+1列的字节值为{yx}。
- 把S盒中每个字节映射为它在有限域GF(28)中的逆,如{00}被映射为{00}。
- 把S盒中每个字节的8个构成位分别记为(b1,b2,b3,b4,b5,b6,b7,b8)。对每个字节的每个构成位做如下操作: b i ′ = b i ⨁ b ( i + 4 ) m o d 8 ⨁ b ( i + 5 ) m o d 8 ⨁ b ( i + 6 ) m o d 8 ⨁ b ( i + 7 ) m o d 8 ⨁ c i b_{i}^{'}=b_i \bigoplus b_{(i+4) mod 8} \bigoplus b_{(i+5) mod 8} \bigoplus b_{(i+6) mod 8} \bigoplus b_{(i+7) mod 8} \bigoplus c_i bi′=bi⨁b(i+4)mod8⨁b(i+5)mod8⨁b(i+6)mod8⨁b(i+7)mod8⨁ci其中ci是指值为{63}的字节c的第i位。符号(’)表示变量的值要被等式右边的值更新。
操作2:行移位
行移位是一个4*4的矩阵内部字节之间的置换,用于提供算法的扩散性。
正向行移位
正向行移位用于加密,其原理图如下。
其中第一行保持不变,第二行循环左移8bit,第三行循环左移16bit,第四行循环左移24bit。
假定矩阵为s,用公式表示如下:
s
[
i
]
[
j
]
=
s
[
i
]
[
(
i
+
j
)
s[i][j] = s[i][(i+j) % 4]
s[i][j]=s[i][(i+j),其中i、j均属于[0, 3]。
逆向行移位
逆向行移位是正向行移位的相反的操作,即:第一行保持不变,第二行循环右移8bit,第三行循环右移16bit,第四行循环右移24bit。
操作3:列混淆
利用GF(28)域算数特性的一个代替,同样用于提供算法的扩散性。
正向列混淆
正向列混淆原理图如下。
根据矩阵的乘法可知,在列混淆过程中,每个字节对应的值只与该列的4个值有关。此处的乘法和加法都是定义在GF(28)域上的,需要注意如下几点:
- 将某个字节所对应的值乘以2,其结果就是该值的二进制位左移一位,如果原始值的最高位为1.则还需要将移位后的结果异或;
- 乘法对加法满足分配率;
- 此处的矩阵乘法与传统意义上的乘法有所不同,各个值在相加时使用的是模28加法(异或运算)。
逆向列混淆
是正向列混淆的逆变换,经过一次逆向列混淆后即可恢复原文。
操作4:轮密钥加
原理是“任何数和自身的异或结果为0”。加密过程中,每轮的输入与*密钥异或一次,因此解密时,再异或该*密钥即可恢复。
密钥扩展算法
- 将种子密钥按图a的格式排列,其中k0、k1、…、k15依次表示种子密钥的一个字节;排列后用4个32bit的字表示,分别记为w[0]、w[1]、w[2]、w[3];
- 按照如下方式,依次求解w[j,其中j是整数并且属于[4, 43];
- 若j%4=0,则 w [ j ] = w [ j − 4 ] ⨁ g ( w [ j − 1 ] ) w[j] = w[j-4]\bigoplus g(w[j-1]) w[j]=w[j−4]⨁g(w[j−1]),否则 w [ j ] = w [ j − 4 ] ⨁ w [ j − 1 w[j] = w[j-4]\bigoplus w[j-1 w[j]=w[j−4]⨁w[j−1,其中函数g的流程如下:将w循环左移8bit;分别对每个字节做S盒置换;与32bit的常量进行异或。
源码
后续补上