2024年6月1日发(作者:)
AES算法介绍
算法简介
aes算法是高级加密标准算法的简称,其英文名称为advancedencryptionstandard。
该加密标准的出现是因为随着对称密码的发展,以前使用的des
(dataencryptionstandard数据加密标准)算法由于密钥长度较小(56位),已经不适应当
今数据加密安全性的要求,因此后来由joandaeman和vincentrijmen提交的rijndael
算法被提议为aes的最终算法。aes算法所能支持的密钥长度可以为128,192,256位
(也即16,24,32个字节)。加之算法本身复杂的加密过程使得该算法成为数据加密领
域的主流。
算法的基本概念
(1)有限域(gf)
由于aes算法中的所有运算都就是在非常有限域当中展开的,所以在认知和同时实现
该算法之前先得打赢非常有限域这一基石才行及。通常的数学运算都就是在实数域中展开,
而aes算法则就是在非常有限域中展开,我们可以将非常有限域看作就是存有确认边界范
围的正整数子集,在该子集当中,任一两个元素之间的运算结果都仍然落到该子集当中,
也即为满足用户运算封闭性。那么如何就可以确保这样的“有限性”(也即为封闭性)呢?
gf(2w)被称之为伽罗华域,是有限域的典型代表。随着w(=4,8,16,?)的取值不
同所形成的有限域范围也不同。aes算法中引入了gf域当中对数学运算的基本定义:将
两数的加减法定义为两者的异或运算;将两数的乘法定义为多项式间的相乘并求余运算,
其中被用于求余运算的除数被称为不可约多项式(或者称为求余多项式),它是固定的一
个多项式:m(x)=x?x?x?x?1(数值为十六进制的11b,这里是假定w=8时的情形)。对
于某个有限域而言,可能存在不唯一的不可约多项式,选择合适的多项式是某种算法考虑
的主要因素之一。
存有了上述对数学运算的基本定义,就可以同时实现运算的有限性了。对于非常有限
域具体内容的运算过程和实例模拟可以参考有关资料。这里不再可知。
843(2)状态矩阵和密钥矩阵
状态矩阵就是指将要被加密的若干数据所构成的矩阵,我们暂且用state_matrix去
则表示;
而密钥矩阵则是指密钥数据所形成的矩阵,我们暂且用cipher_matrix来表示。随着
输入数据个数的不同,这两个矩阵的维数可以为4?4,4?6或者4?8;例如如果输入的被加
密数据为24个字符(此处假定是以字符为数据单位进行加密,当然也可以是以一个整数
为单位等进行加密),输入的密钥数据为16个字符(假设与上同),那么可以形成一个
4?6维的state_matrix矩阵和一个4?4维的cipher_matrix矩阵。可见形成的矩阵的行
数是固定的,都为4。因为矩阵的形成是以每4个数据为一列依次构成,所以随着数据的
增加只会增加其列数而不会影响其行数。并且我们用nb表示被加密数据矩阵
(state_matrix矩阵)的列数,用nk表示密钥数据矩阵(cipher_matrix矩阵)的列数。
那么有了上述两个矩阵,我们就可以进行aes的加密过程了。
(3)拓展密钥
扩展密钥是从密钥矩阵变换而来,之所以称之为“扩展”是因为在aes的加密过程
中,必须对数据展开nr+1轮加密,每次加密的密钥都不一样,我们将着nr+1轮加
密过
程中用到的所有的密钥的集合叫做扩展密钥。那么如何去确定这个轮数nr呢?nr的
取值是根据nb和nk的值确定的,aes算法中给出了它们之间如下的对照表:
nrnb=4101214nb=6121214nb=8141414
nk=4nk=6nk=8
比如:如果nb=6,nk=4那么我们的加密过程必须展开nr+1=13次,那么也就存
有13个拓展密钥。由于这些密钥必须和state_matirx矩阵搞异或运算,所以每个拓展密
钥必须转变为一个和state_matirx矩阵同维数的加密矩阵才可以展开每个元素一对一的
运算。由nb和nr的值,我们可以排序出来拓展密钥的整体“长度”。如下公式可以得
出:
nb*(nr+1);例如nb=6,nr=12则“长度”为78;
这78个数字每6个为一个拓展密钥(因为nb=6,所以必须这样分组)。那么这78
个数字就是怎么构成的呢?aes算法中将构成拓展密钥的过程定义为:keyexpansion()。
该过程以cipher_matrix矩阵的值,每一列的4个byte共同组成一个int数,那么对于
nk=4的cipher_matrix而言必然可以形成4个int数,keyexpansion()过程(过程的具
体内容同时实现参考有关文献)就是以这4个整型数为基础,通过它的拓展方式将这4
个数字拓展变成了78个数字。这78个数字,每6个共同组成一个密钥(再将int化成
char型恰好形成一个4?6维的拓展密钥矩阵),总共展开13次加密过程。为了存储这
78个数字,算法中开拓一个w[i]数组。似乎该数组的维数为w[nb*(nr+1)]。
(4)aes加密过程
1#前面的nr轮(0~nr-1)被称作round()过程:round()
{bytesub();//字节变换过程,该过程参照s_box实现shiftrow();//行交换过程,该过
程参照既定的交换规则实现mixcolumn();//列变换过程,该过程参照c(x)矩阵实现
addroundkey();//扩展密钥加密过程,该过程参照扩展密钥实现
}
2#最后一轮加密过程(第nr轮)被称为finalround()过程:
finalround(){bytesub();shiftrow();addroundkey();
}
在上述过程中,bytesub(),shiftrow(),mixcolumn()三个过程的变换是固定的模式,
具体的实现可以参照相关文献。它们的调用次数分别为:nr+1次,nr+1次,nr次。而
addroundkey()过程显然是nr+1次,它是与扩展密钥相关的。前nr轮加密中用去了nr
个扩展密钥,第nr轮加密中用去最后一个扩展密钥,从而实现nr+1轮加密过程。至此
aes算法结束。


发布评论