AES密码算法

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算法168输入8输出非线性替代
DES算法86输入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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值