【金山文档 | WPS云文档】 高级加密标准AES
https://kdocs.cn/l/ckICpLzrfKl8
密码学怎么学啊,感觉学不会啊,脑子转不过来哈哈哈哈
已疯。。。。
高级加密标准AES
有限域算术
AES中的有限域算术:
加法: 在GF(2^8)中,加法等同于异或(XOR)操作。这意味着两个元素相加是通过对应位进行异或操作来完成的。
减法: 在GF(2^8)中,减法也等同于异或操作,因为减去一个数等同于加上它的加法逆元,而在GF(2^8)中,一个数的加法逆元就是它本身。
乘法: 在GF(2^8)中,乘法更为复杂。它涉及到多项式乘法,然后对结果进行模一个不可约多项式的运算。AES使用特定的不可约多项式m(x) = x^8 + x^4 + x^3 + x + 1。这意味着任何乘法的结果都必须用这个多项式进行约化。
除法: 在GF(2^8)中,除法是通过乘以乘法逆元来实现的。每个非零元素都有一个乘法逆元,可以通过扩展欧几里得算法或其他方法来找到。
多项式表示和运算:
在GF(2^8)中,每个元素都可以表示为一个小于8次的多项式,系数为0或1。
加法是通过对应位的异或操作来完成的。
乘法是通过多项式乘法,然后对结果进行模不可约多项式m(x)的运算来完成的。
AES的结构
AES的总体结构
AES加密数据的分组大小固定为128位(16字节),但密钥长度可以是128位(16字节)、192位(24字节)或256位(32字节),分别对应AES-128、AES-192和AES-256。加密和解密过程都涉及多个轮次,轮数取决于密钥的长度:
AES-128:10轮
AES-192:12轮
AES-256:14轮
密钥长度(字/字节/位) | 4/16/128 | 6/24/192 | 8/32/256 |
明文分组长度(字/字节/位) | 4/16/128 | 4/16/128 | 4/16/128 |
轮数 | 10 | 12 | 14 |
每轮的密钥长度(字/字节/位) | 4/16/128 | 4/16/128 | 4/16/128 |
扩展密钥长度(字/字节/位) | 44/176 | 52/208 | 60/240 |
AES的详细结构
AES的加密过程包括以下四个主要步骤,每个步骤都在一个4x4的字节矩阵上操作:
初始变换(AddRoundKey):将输入的明文状态与密钥进行XOR操作。
字节代替(Substitute Bytes):使用S盒对每个字节进行非线性替换。
行移位(ShiftRows):对矩阵的行进行循环移位。
列混淆(MixColumns):基于有限域GF(2^8)的乘法,对矩阵的列进行混淆。
每轮加密后,除了最后一轮,都会再次进行轮密钥加(AddRoundKey)。
AES的轮密钥加(AddRoundKey)
在每轮的开始,当前状态与轮密钥进行XOR操作。轮密钥是从主密钥派生出来的,每轮的轮密钥都不同。
AES的密钥扩展
输入的密钥被扩展成一个更大的密钥数组,用于每轮的轮密钥加。对于128位的密钥,扩展密钥长度为176位(44个32位字)。
AES的可逆性
AES的每个操作都是可逆的,这意味着可以设计一个解密过程,按逆序执行相同的操作,最终恢复原始明文。
AES的解密过程
解密过程与加密过程类似,但操作顺序相反,并且使用逆变换。例如,字节代替使用逆S盒,列混淆使用逆列混淆操作。
AES的特点
AES不是Feistel结构,而是对整个数据分组作为一个矩阵进行处理。
AES的设计简单而高效,每轮都包括混淆和扩散操作,以及非线性替换。
AES的安全性来自于其结构的复杂性和密钥的使用。
AES的变换函数
字节代替变换
正向变换:
AES定义了一个S盒(Substitution box),它是一个16x16的矩阵,包含了8位所能表示的256个数的一个置换。
状态中的每个字节根据S盒进行查表替换,将该字节的高4位作为行值,低4位作为列值,从S盒中取出对应的元素作为输出。
十六进制{95}所对应的S盒的行值是9,列值是5,S 中在此位置的值是{2A}。
逆向变换:
使用逆S盒进行查表替换,逆S盒是S盒的逆变换。
基本原理:
S盒的设计旨在提供高非线性度,以防止线性和差分密码分析攻击。
S盒的构造涉及有限域GF(2^8)中的乘法逆运算。
行移位(Shift Rows)
正向变换:
状态的第一行保持不变。
第二行向左循环移动一个字节,第三行移动两个字节,第四行移动三个字节。
逆向变换:
执行相反方向的移位操作,第二行向右循环移动一个字节,其他行类似。
基本原理:
行移位通过简单的循环移位操作,实现了状态中字节的列间移动,增加了混淆效果。
列混淆(Mix Columns)
正向变换:
对每列独立操作,每列中的每个字节通过一个固定的多项式 a(x)=03x3+01x2+01x+02 进行变换,操作在有限域GF(2^8)上进行。
逆向变换:
使用逆多项式 b(x)=0Bx3+0Dx2+09x+0E 进行变换,它是 a(x)在GF(2^8)上的逆。
基本原理:
列混淆通过多项式乘法和模 x4+1 的操作,实现了状态中字节的列间混淆,增加了扩散效果。
轮密钥加(Add Round Key)
正向变换:
将128位的状态与128位的轮密钥进行按位XOR操作。
逆向变换:
由于XOR操作是自逆的,逆向轮密钥加与正向操作相同。
基本原理:
轮密钥加通过与轮密钥的XOR操作,将密钥的影响分布到状态的每个字节中,增强了密钥的混淆效果。
AES的密钥扩展
密钥扩展算法步骤
输入和初始化:
输入是一个4个字(16字节)的原始密钥。
输出是一个44个字(176字节)的一维线性数组,这个数组将为加密过程中的每一轮提供4个字的轮密钥。
复制输入密钥:
将输入密钥直接复制到扩展密钥数组的前4个字。
扩展密钥数组:
对于扩展密钥数组中从第5个字开始的每个字,其值依赖于前一个字(w[i-1])和前第四个字(w[i-4])。
对于下标为4的倍数的元素,使用一个更复杂的函数来计算,这个函数包括字循环、字代替和与轮常量的异或操作。
函数g的子功能
字循环(RotWord):将一个字中的四个字节循环左移一个字节。例如,将[B0, B1, B2, B3]变换成[B1, B2, B3, B0]。
字代替(SubWord):利用S盒对输入字中的每个字节进行字节代替。
与轮常量异或:步骤1和步骤2的结果再与轮常量Rcon[j]相异或。
轮常量(Rcon)
轮常量是一个字,这个字最右边三个字节总为0。因此,与Rcon相异或的结果只是与该字最左的那个字节相异或。
每轮的轮常量均不同,其定义为Rcon[j] = (Rc[j], 0, 0, 0),其中RC[1] = 1, RC[i] = 2 * RC[i-1](乘法是定义在域GF(2^8)上的)。
伪代码
KeyExpansion(byte key[16], word w[44]) {
word temp;
for (i=0; i<4; i++)
w[i] = (key[4*i], key[4*i+1], key[4*i+2], key[4*i+3]);
for (i=4; i<44; i++) {
temp = w[i-1];
if (i % 4 == 0)
temp = SubWord(RotWord(temp)) XOR Rcon[i/4];
w[i] = w[i-4] XOR temp;
}
}
初始密钥:算法开始时使用初始密钥,根据安全级别,密钥长度可以是128、192或256位。
轮常数(Rcon):在密钥扩展过程中使用一组预定义的轮常数。
词大小:密钥被分成32位的词。
密钥调度:通过密钥扩展过程生成的轮密钥集合。
扩展轮:在每个扩展轮中,执行以下操作:
RotWord:将一个字的字节循环左移一个字节。
SubWord:使用AES的S盒对每个字节进行替换。
Rcon:使用轮常数与当前词进行XOR操作。
轮密钥:在所有扩展轮之后,数组W中包含了所有轮密钥,每个轮密钥用于AES加密或解密的相应轮次。