AES加密算法的数学基础

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); //输出转置变换

1

单轮AES流程图
2

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*2

if 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Erice_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值