AES(高级加密标准,Advanced Encryption Standard)是一种广泛使用的对称加密算法,用于保护电子数据的安全。它是由比利时密码学家Vincent Rijmen和Joan Daemen所设计的Rijndael加密法的一个变种,于2001年被美国国家标准与技术研究院(NIST)选定为新的加密标准来替代。
算法特点:
分组密码:明文和密文分组长度为128位,密钥长度可为128/192/256位
基本轮函数迭代,轮数可为10/12/14(与密钥长度对应)
整体结构:S-P网络结构
综合运用多种密码技术:置换、替代、代数
不是对合运算:加解密算法存在差异
与DES类似,属于面向二进制的密码:便于计算机实现
AES数学基础
AES基于有限域GF(2^8)
有限域上的加法
对应多项式系数的模2加(异或),结果仍为GF(2^8)上的元素(次数不超过7的多项式)
有限域上的乘法
先确定一个8次不可约多项式m(x)
AES选择m(x) = x^8+x^4+x^3+x+1,其16进制表示为0x11B
多项式乘法对m(x)取模,结果仍为GF(2^8)上的元素(次数不超过7的多项式)
乘法逆元
设a(x)的逆元为b(x),则 a(x)b(x) = 1 mod m (x)
可根据广义Euclid算法求出b(x)
有限域上的x乘法(xtime)
计算规则:
若b7= 0,次数不超过7,直接得到结果
否则,乘法结果减去m(x),即与m(x)做异或
通过系数直接计算:
B=b7 b6 b5 b4 b3 b2 b1 b0左移一位,最低位补0(乘2)
若b7= 0,直接得到结果
否则,b6 b5 b4 b3 b2 b1 b0 0再与0x1B做异或
x的更高次的乘法可以重复应用xtime实现
字加法:
两多项式系数按位模2加
字乘法:
设a和c是两个字,a(x)和c(x)为对应的字多项式,AES定义a和c的乘积b为
例:
用矩阵表示则为
字的逆元:
c(x)存在逆元的条件是 (x^4+1, c(x)) =1
字的x乘法:
设b(x)是一个字,
因为模x^4 + 1,字的x乘法相当于按字节循环移位
加解密算法
AES算法包括:S盒变换 – S-Box,行移位 – ShiftRows,列混合 – MixColumns,密钥扩展 – KeyScheduler,加轮密钥 – AddRoundKey。(主要讲解128位的)
AES数据处理的单位是字节(byte)、字(word)和状态(state)
一个字 = 4个字节 = 32位,状态为128位
状态(128位):加解密过程中的中间数据,以字节为元素的矩阵或二维数组(128位的明文和密钥都被分成了16个字节)。
128位的密钥矩阵的每一列被称为一个32位的字,通过密钥编排程序,该密钥矩阵被扩展成一个由44个字组成的序列w[0]、w[1]、w[2]……w[43],该序列前四个元素是原始密钥,用于加密运算中的初始密钥加,后40个字分为10组,每组四个字(128bit),分别用于10轮运算中的轮密钥加。
常用符号:
S盒变换
S盒变换是AES的唯一的非线性变换,是AES安全的关键。
S盒比较 | 数量 | 规模 | 功能 | 各S盒是否相同 |
AES算法 | 16 | 8输入8输出 | 非线性替代 | 是 |
DES算法 | 8 | 6输入4输出 | 非线性压缩 | 否 |
第一步把字节的值用它的乘法逆来代替,00变换为自身,是一种非线性变换;
设a(x)的逆元为b(x),则 a(x)b(x) = 1 mod m (x)
其中,m(x) = x^8+x^4+x^3+x+1
第二步是在GF(2)上对上面的结果进行仿射运算,是线性变换。
由于系数矩阵中每列都含有 5个1,这说明改变输入中的任意一位,将影响输出中的5位
由于系数矩阵中每行都含有 5个1,这说明输出中的任意一位,都与输入中的5位相关
第三步,采用查找表来实现替换
行移位变换 (128位)
行移位变换对状态矩阵的行进行循环左移
第 0行不移位,第1行移 1字节,第2行移 2字节,第3行移3字节
行移位变换属于置换,属于线性变换,本质在于把数据打乱重排,起扩散作用
列混合变换 (128位)
属于线性变换,起扩散作用。
把状态的列视为GF(2^8)上的多项式a(x),乘以一个固定的多项式c(x),然后模x^4+1:
b(x) = a(x)c(x) mod x^4 +1,
其中,c(x) = 03x^3+ 01x^2 + 01x + 02,c(x)与x^4 + 1互素,从而保证c(x)存在逆多项式d(x),使得c(x)d(x) = 1 mod x^4+1,只有逆多项式d(x)存在,才能正确进行解密。
密钥扩展
128位的密钥矩阵的每一列被称为一个32位的字,通过密钥编排程序,该密钥矩阵被扩展成一个由44个字组成的序列w[0]、w[1]、w[2]……w[43],该序列前四个元素是原始密钥,用于加密运算中的初始密钥加,后40个字分为10组,每组四个字(128bit),分别用于10轮运算中的轮密钥加。
Nk ≤ 6 的密钥扩展
最前面的Nk个字由用户密钥填充,之后每个字W[j]等于W[j-1]与Nk个位置之前的字W[j - Nk]的异或
对于Nk的整数倍的位置处的字,在异或之前,对W[j-1]进行Rotl变换和ByteSub变换(S盒),再异或一个轮常数Rcon
Rotl是一个字里的字节循环左移函数
轮常数Rcon与Nk无关,且定义为:
Nk > 6 的密钥扩展
Nk > 6的密钥扩展与Nk ≤ 6的密钥扩展不同之处在于:如果j被Nk除的余数为4,则在异或之前,对W[j-1]进行SubBytes变换。这是因为当Nk > 6时密钥很长,仅仅对Nk的整数倍的位置处的字进行SubBytes变换,就显得 SubBytes 变换的密度较稀,安全程度不够强
加轮密钥(128位)
轮密钥与状态进行模2加(异或),轮密钥根据密钥产生算法产生,轮密钥长等于数据分组长。
AES逆运算
AES不是对合运算,解密算法与加密算法不同。
AES的巧妙之处:虽然解密算法与加密算法不同,但是解密算法与加密算法的结构相同;
把加密算法的基本运变换成逆变换,便得到解密算法,只是密钥扩展策略稍有不同。
轮密钥加变换的逆就是其本身 (AddRoundKey)^-1= AddRoundKey
行移位变换的逆是状态的后三行分别循环左移3,2,1个字节(或循环右移1,2,3个字节)
列混合变换是把状态的每一列都乘以一个多项式c(x) :b(x) = a(x)c(x) mod x^4 + 1
所以列混合变换的逆就是状态的每列都乘以c(x)的逆多项式d(x)。
S盒变换的逆
第一步:首先进行逆S盒替换,再进行逆仿射变换
第二步:再把每个字节用其在GF(2^8)中的逆来代替
AES加密和解密过程是可以对称的,但此时需要把InvMixColumn应用到除第一和最后一轮外的所有轮密钥。
下图为加密的整个流程(最左边),首先进行一次轮密钥加,再进行九次完整的字节替换、行移位、列混合、轮密钥加,第十次只有字节替换、行移位、轮密钥加,没有列混合,
安全性分析
AES仍然是目前主流的数据加密标准;
AES主要的安全威胁来源于侧信道攻击,主要是能量侧信道、电磁侧信道和故障注入攻击;
无弱密钥,128位AES的密钥空间可达2^128。