AES加密算法的数学基础
目录
1.数学基础
1.1群的概念
有限域有时也称为伽罗瓦域,它指的是拥有有限个元素的集合。大致来讲, 伽罗瓦域是一个由有限个元素组成的集合,在这个集合内可以执行加、减、乘和逆操作。在介绍域的定义前,我们首先需要理解一个更简单的代数结构概念,即群.
群(Group)
群指的是元素集合 G 及 G 内任意两个元素的联合操作。的集合。群具有以下特性:
1. 群操作。是封闭的,即对所有的 a,b,c∈G, a。6 = c∈G 始终成立
2. 群操作是可结合的,即对所有的 a,b,c∈G 都有 a。(b。c)=(a。b)。c
3. 存在一个元素 l∈G, 对所有 a∈G 都满足 a。l =l。a 此元素l称为中性元(或单位元)
4. 对每个 a∈G 都存在一个元素 使得 a-1 ∈G ,使得a·a-1= a-1·a=1, 而a-1就称为 a 的逆元.
5. 在上面的特性的基础上, 如果对所有的 a, b∈G 都有 a。b=b。a 则称此群为阿贝尔群(或交换群)
1.2域的概念
域(field)
域F是拥有以下特性的元素的集合。
F中的所有元素形成一个加法群,对应的群操作为“+” , 中性元为 0。
F中除 0 外的所有元素构成了一个乘法群,对应的群操作为“x”,中性元为 1。
当混合使用这两种群操作时,分配定理始终成立,即对所有的 a,b,c∈F,
都有 a(b+c)=(ab)+(ac)
假设p 是一个素数,整数环Zp 表示为GF(p), 也称为是拥有素数个元素的素数域或伽罗瓦域。GF(p) 中所有的非零元素都存在逆元, GF(p)内的算术运算都是模p 实现的。
2.AES算法
2.1 概述
高级加密标准(AES)是目前使用最为广泛的一种对称密码。尽管 AES 名称中的术语“标准”仅仅是对美国政府应用而言, 但有些商业系统也强制使用 AES 分组密码。此外, AES还可用于多种商业系统。除了 AES 外,商业标准还包括 Internet 安全标准 IPsec、 TLS、Wi-Fi 加密标准 IEEE 802.1.lli安全外壳网络协议 SSH(安全外壳)、 Internet 手机 Skype 和世界上的各种安全产品。到目前为止,己知的针对 AES 最有效的攻击就是蛮力攻击
2.2 AES加密算法
AES加密的流程如下:
//以AES128为例,in表示输入128位分组,C伪代码
status = Transposition(in); //输入转置变换
AddRoundKey(&status,roundkey[0]);
for(round = 1;round <Nr -1;round++)
{
SubBytes(&status);//字节替换变换
ShiftRows(&status);//行移位变换
MixColumns(&status);//列混淆变换
AddRoundKey(&status,roundkey[round]);//轮秘钥加变换
}//for循环里面只执行了9次循环体
SubBytes(&status);//字节替换变换
ShiftRows(&status);//行移位变换
AddRoundKey(&status,roundkey[round]);//轮秘钥加变换
out = Transposition(status); //输出转置变换
单轮AES流程图
2.3 实例加密流程
以第一轮加密为例
Input,0x格式明文:
62696E62
696E7A68
616E677A
78637662
tInput,0x格式明文转置后:
62696178
696E6E63
6E7A6776
62687A62
跟踪加密过程state[0]:
62696178
696E6E63
6E7A6776
62687A62
加No0轮密钥后state[1]
535C554A
515C5950
56495642
57504B57
1轮正向查表后state[2]:
ED4AFCD6
D14ACB53
B13BB12C
5B53B35B
1轮正向移位后state[3]:
ED4AFCD6
4ACB53D1
B12CB13B
5B5B53B3
1轮正向混淆后state[4]:
F5A5F457
EAE8C191
333423BF
618F5BF6
1轮正向加钥No1后state[5]:
06630697
CAFAE487
9DA98F27
77A144DC
2.4 AES中的列混淆变换
在讨论AES中的列混淆变换 MixColumns(&status)之前,我们先回过头去看一下域的概念。一般在AES中用到的是GF(2^8)有限域内乘法。什么是有限域呢?有限域通俗的讲就是函数的运算结果全都包含在一个域中,不同于实数域,有限域有一个最大值,所有超过这个最大值的数都会经过一定的方法使他回到这个域中,在密码学中应用很广泛,2^8意味着这个域的最大值是256.
字节乘法 *操作定义:
x*(a+b)=x*a xor a*b
x*0=0
x*1=x
对于x*2if x左移1位时溢出“1”比特 x*2=x<<1 xor 0x1B
else x*2 = x<<1
举例:
01010111*2 = 10101110
01010111*4 = 10101110*2 = 01011100 xor 0x1B(00011011) = 01000111
代码实现:unsigned char XTIME(unsigned char x);unsigned char multiply(unsigned char a, unsigned char b);
unsigned char XTIME(unsigned char x) {
return ((x << 1) ^ ((x & 0x80) ? 0x1b : 0x00));
}
XTIME函数的含义是求一个数x与0x02的乘积,一般求一个数的2倍,都是作移一位,在有限域内,要计算有限域的乘法,必须先确定一个GF上的8次不可约多项式,Rijndael密码中,这个多项式确定为x^8+x^4+x^3+x+1,如果最高位是1的话,左移一位的同时要异或0x1B(00011011),是因为最高位是1的话,再继续左移会超出域的最大值,这个时候需要取除以同余式,也就是异或0x1B 00011011。
unsigned char multiply(unsigned char a, unsigned char b) {
unsigned char temp[8] = { a };
unsigned char tempmultiply = 0x00;
int i = 0;
for (i = 1; i < 8; i++) {
temp[i] = XTIME(temp[i - 1]);
}
tempmultiply = (b & 0x01) * a;
for (i = 1; i <= 7; i++) {
tempmultiply ^= (((b >> i) & 0x01) * temp[i]);
}
return tempmultiply;
}
2.5代码实例
#include <iostream>
using namespace std;
unsigned char XTIME(unsigned char x) {
return ((x << 1) ^ ((x & 0x80) ? 0x1b : 0x00));
}
unsigned char multiply(unsigned char a, unsigned char b) {
unsigned char temp[8] = { a };
unsigned char tempmultiply = 0x00;
int i = 0;
for (i = 1; i < 8; i++) {
temp[i] = XTIME(temp[i - 1]);
}
tempmultiply = (b & 0x01) * a;
for (i = 1; i <= 7; i++) {
tempmultiply ^= (((b >> i) & 0x01) * temp[i]);
}
return tempmultiply;
}
int main()
{
printf("%x\n",multiply(0x3,0x6E));
cout << "Hello World";
return 0;
}
//output:
cd
Hello World
手工分析:
0x5 = 0000 0101
0x6E = 0110 1110
(0000 0101)·(0110 1110)=(0000 0010 + 0000 0001)·(0110 1110)
=(0000 0100) ·(0110 1110) xor (0000 0001)·(0110 1110)
=(01101110<<1)*2 xor 0110 1110
=11011100*2 xor 0110 1110
=11011100<<1 xor 0x1B(0x00011011) xor 0110 1110
=10111000 xor 0x00011011 xor 0110 1110
=1100 1101
=0xCD