AES算法详解
AES算法简介
AES的全称是Advanced Encryption Standard,意思是⾼级加密标准。 AES密码分组⼤⼩和密钥⼤⼩可以为128位、192位和256位。然⽽AES只要求分组⼤⼩为128位。本⽂只对分组⼤⼩128位,密钥长度也为128位的Rijndael算法进⾏分析。密钥长度为192位和256位的处理⽅式和128位的处理⽅式类似,只不过密钥长度每增加64位,算法的循环次数就增加2轮,128位循环10轮、192位循环12轮、256位循环14轮。
AES算法使⽤逻辑就是:发送⽅将要发送的明⽂数据X使⽤秘钥K进⾏AES加密后会得到密⽂Y,将密⽂进⾏⽹络传输,接受⽅在收到密⽂Y后使⽤秘钥K进⾏AES解密后技能得到明⽂X,这样即使密⽂Y在⽹络上传输时被截获了,没有秘钥也难以破解其真实意思。
AES算法相关数学知识
在AES算法中的MixColumn层中会⽤到伽罗⽡域中的乘法运算,⽽伽罗⽡域的运算涉及⼀些数学知识如下:
素域:
有限域有时也称伽罗⽡域,它指的是由有限个元素组成的集合,在这个集合内可以执⾏加、减、乘和逆运算。⽽在密码编码学中,我们只研究拥有有限个元素的域,也就是有限域。域中包含元素的个数称为域的阶。只有当m是⼀个素数幂时,即m=p n(其中n为正整数是p的次数,p为素数),阶为m的域才存在。p称为这个有限域的特征。也就是说,有限域中元素的个数可以是11(p=11是⼀个素数,n=1)、可以是81(p=3是⼀个素数,n=4)、也可以是256(p=2是⼀个素数,n=8).....但有限域的中不可能拥有12个元素,因为12=2·2·3,因此12也不是⼀个素数幂。有限域中最直观的例⼦就是阶为素数的域,即n=1的域。的元素可以⽤整数0、1、...、p-1l来表⽰。域的两种操作就是模整数加法和整数乘法模p。加上p是⼀个素数,整数环Z表⽰为GF(p),也成为拥有素数个元素的素数域或者伽罗⽡域。GF(p)中所有的⾮零元素都存在逆元,GF(p)内所有的运算都是模p实现的。
素域内的算数运算规则如下:
(1)加法和乘法都是通过模p实现的;
(2)任何⼀个元素a的加法逆元都是由a+(a的逆元)=0 mod p得到的;
(3)任何⼀个⾮零元素a的乘法逆元定义为a·a的逆元=1。
例:在素域GF(5)={0、1、2、3、4}中,2的加法逆元为3,这是因为2+(3)=5,5mod5=0,所以2+3=5mod5=0。2的乘法逆元为3,这是因为
2·3=6,6mod5=1,所以2·3=6mod5=1。(在很多地⽅a的加法逆元⽤-a表⽰,a的乘法逆元⽤1/a表⽰)
注:GF(2)是⼀个⾮常重要的素域,也是存在的最⼩的有限域,由于GF(2)的加法,即模2加法与异或(XOR)门等价,GF(2)的乘法与逻辑与(AND)门等价,所以GF(2)对AES⾮常重要。
扩展域:
如果有限域的阶不是素数,则这样的有限域内的加法和乘法运算就不能⽤模整数加法和整数乘法模p表⽰。⽽且m>1的域被称为扩展域,为了处理扩展域,我们就要使⽤不同的符号表⽰扩展域内的元素,使⽤不同的规则执⾏扩展域内元素的算术运算。
在扩展域GF(2^m)中,元素并不是⽤整数表⽰的,⽽是⽤系数为域GF(2)中元素的多项式表⽰。这个多项式最⼤的度(幂)为m-1,所以每个元素共有m个系数,在AES算法使⽤的域GF(2^8)中,每个元素A∈GF(28)都可以表⽰为:
注意:在域GF(28)中这样的多项式共有256个,这256个多项式组成的集合就是扩展域GF(28)。每个多项式都可以按⼀个8位项链的数值形式存储:
array工艺详解像x7、x6等因⼦都⽆需存储,因为从位的位置就可以清楚地判断出每个系数对应的幂。
扩展域GF(2m)内的加减法:
在AES算法中的密钥加法层中就使⽤了这部分的知识,但是不是很明显,因为我们通常把扩展域中的加法当作异或运算进⾏处理了,因为在扩展域中的加减法处理都是在底层域GF(2)内完成的,与按位异或运算等价。假设A(x)、B(x)∈GF(2m),计算两个元素之和的⽅法就是:
⽽两个元素之差的计算公式就是:
注:在减法运算中减号之所以变成加号,这就和⼆进制减法的性质有关了。从上述两个公式中我们发现在扩展域中加法和减法等价,并且与XOR等价(异或运算也被称作⼆进制加法)。
扩展域GF(2^m)内的乘法
扩展域的乘法主要运⽤在AES算法的列混淆层(Mix Column)中,也是列混淆层中最重要的操作。我们项要将扩展域中的两个元素⽤多项式形式展开,然后使⽤标准的多项式乘法规则将两个多项式相乘:
注:通常在多项式乘法中C(x)的度会⼤于m-1,因此需要对此进⾏化简,⽽化简的基本思想与素域内乘法情况相似:在素域GF(p)中,将两个整数相乘得到的结果除以⼀个素数,化简后的结果就是最后的余数。⽽在扩展域中进⾏的操作就是:将两个多项式相乘的结果除以⼀个不可约多项式,最后的结果就是最后的余数。(这⾥的不可约多项式⼤致可以看作⼀个素数)
例:
AES算法原理
AES算法主要有四种操作处理,分别是密钥加法层(也叫轮密钥加,英⽂Add Round Key)、字节代换层(SubByte)、⾏位移层(Shift Rows)、列混淆层(Mix Column)。⽽明⽂x和密钥k都是由16个字节组成的数据(当然密钥还⽀持192位和256位的长度,暂时不考虑),它是按照字节的先后顺序从上到下、从左到右进⾏排列的。⽽加密出的密⽂读取顺序也是按照这个顺序读取的,相当于将数组还原成字符串的模样了,然后再解密的时候⼜是按照4·4数组处理的。AES算法在处理的轮数上只有最后⼀轮操作与前⾯的轮处理上有些许不同(最后⼀轮只是少了列混淆处理),在轮处理开始前还单独进⾏了⼀次轮密钥加的处理。在处理轮数上,我们只考虑128位密钥的10轮处理。接下来,就开始⼀步步的介绍AES算法的处理流程了。
AES算法流程图:
密钥加法层
在密钥加法层中有两个输⼊的参数,分别是明⽂和⼦密钥k[0],⽽且这两个输⼊都是128位的。k[0]实际上就等同于密钥k,具体原因在密钥扩展⽣成中进⾏介绍。我们前⾯在介绍扩展域加减法中提到过,在扩展域中加减法操作和异或运算等价,所以这⾥的处理也就异常的简单了,只需要将两个输⼊的数据进⾏按字节异或操作就会得到运算的结果。
图⽰:
1int AddRoundKey(unsigned char(*PlainArray)[4], unsigned char(*ExtendKeyArray)[44], unsigned int MinCol)
2 {
3int ret = 0;
4
5for (int i = 0; i < 4; i++)
6 {
7for (int j = 0; j < 4; j++)
8 {
9 PlainArray[i][j] ^= ExtendKeyArray[i][MinCol + j];
10 }
11 }
12
13return ret;
14 }
相关代码
字节代换层
字节代换层的主要功能就是让输⼊的数据通过S_box表完成从⼀个字节到另⼀个字节的映射,这⾥的S_box表是通过某种⽅法计算出来的,具体的计算⽅法在此不做详述,我们主需要知道如何使⽤S_box结果即可。S_box表是⼀个拥有256个字节元素的数组,可以将其定义为⼀维数组,也可以将其定义为16·16的⼆维数组,如果将其定义为⼆维数组,读取S_box数据的⽅法就是要将输⼊数据的每个字节的⾼四位作为第⼀个下标,第四位作为第⼆个下标,略有点⿇烦。这⾥建议将其视作⼀维数组即可。逆S盒与S盒对应,⽤于解密时对数据处理,我们对解密时的程序处理称作逆字节代换,只是使⽤的代换表盒加密时不同⽽已。
S盒
逆S盒
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论