分享
 
 
 

AES密码算法的实现

王朝java/jsp·作者佚名  2006-01-30
窄屏简体版  字體: |||超大  

背景

前些年美国国标局(好像是这个单位)公开征集一种128位分组密码算法用以替代使用了20年的DES。由两位比利时密码学家设计的Rijndael算法最终胜出。可以访问作者的网站

有关AES的一些理解

最近很多密码学的书都包含了最新的AES算法,但由于涉及的数学理论比较多,我也只是明白一些能让我实现他的皮毛。

AES比较牛的地方是速度快,而且明文和密钥的长度可以是128,196,256位,并且可以任意组合,明文和密钥的长度不一定是一样长的。由于采用了模块化设计,算法包含4个步骤:1.字节替换;2.行位移;3.列混淆;4.密钥加法,这些步骤循环10轮。最让我恶心的第10轮的又不一样,没有列混淆。

强烈建议大家看作者的英文论文和书,其中讲到了一种32位平台的快速实现方法。这种方法根据每一步的数学原理,将4步和为一步,那一大堆公式推倒我就不在这重复了。这种快速实现方法需要构造8个矩阵(加解密各四个),一般都叫他们Tbox。加解密前九轮只需用U替换一下即可,最后一轮还是用Sbox做替换,所以这速度是唰唰的快呀~

这样一来,实现AES的关键问题就是怎么构造8个矩阵U。其中涉及多项式即算问题。

(1)多项式加法

多项式加法即按位做异或运算。例如0x57 + 0x83 = 01010111 XOR 10000011 = 11010100 = 0xD4。

(2)多项式乘法

GF(2n)中的乘法是多项式的模2乘积通过免去进位,再模一个次数为n的不可约多项式约化得到,不可约多项式我理解的和自然数域中的素数相对应,都是有不可再分解的特点。例如下面GF(23)的例子:

f(x)*g(x) = (x2+x)(x2+x+1) mod (x3+x+1)

= (x4+2x3+2x2+x) mod (x3+x+1) 系数是二的直接约掉,实际上这里是模2加法

= (x4+x) mod (x3+x+1)

= x2+1

Rijindael选用8次不可约多项式x8+x4+x3+x+1,可用元组(100011011)或十六进制数0x11B表示。用这个多项式的理由听起来比较有意思,作者说是在一本书上有一堆8次不可约多项式,第一个是0x11B就用它了,FT吧。f(x)乘以x+1(或‘03’)的乘法分解成f(x)*2+1,最后模m(x)约化:

f ^= f << 1; //乘2加1

if(f & 0x100) f ^= 0x11B; //模m(x)约化

在GF(28)中的两个多项式f和h的乘法可通过用对数加速:设g(x)为GF(28)的一个生成多项式,所谓生成多项式就是数组的256个元素的值就是0-255的排列,则存在m和n使得f=gm,h=gn,则f*h=gm+x mod m(x)。有了这个公式我们就可以把多项式乘法转为加法来算,具体说来就是构造对数表和反对数表,如下图:

对数表的构造:

1. 构造多项式g(x)=x+1的255个幂存入alog表中

alog[0] = 1;

for (i = 1; i < 256; i++)

{

j = (alog[i-1] << 1) ^ alog[i-1]; //x*3=x*2+1

if ((j & 0x100) != 0) // 如果超过255,需要约化

j ^= ROOT;

alog[i] = j;

}

2. 在log表中存放对底g(x)的对数

for (i = 1; i < 255; i++)

log[alog[i]] = i;

再构造alog和log之后,乘法运算可以一步完成alog[ (log[a]+log[b]) % 255 ] 。

实际上实现多项式乘法的方法有很多种,在msdn搜AES可以查到一篇写c#实现的,它的乘法算法也是一种很经典的方法。用对数表的方法好理解,最重要的是查表速度快。

S盒和反向S盒的实现

(1) 初始化S盒,按升序排列的字节表示 GF(28)的所有数,0至255。

(2) 用alog[255-log[x]],把S盒中每个字节映射为它在GF(28)中的逆。0被映射为0。

(3) 计算那个仿射变换,那个公式很恶心,参看作者的文献。其中的矩阵乘法,可以利用前面DES的技巧,把S盒的每个字节按位分离存放在一个256*8的临时矩阵中再计算乘法。

解密用的逆S盒可以用inSbox[Sbox[i] & 0xFF] = i得到。

Tbox的构造

for (t = 0; t < 256; t++)

{

s = Sbox[t];

Tbox1[t] = mul4(s, G[0]);

Tbox2[t] = mul4(s, G[1]);

Tbox3[t] = mul4(s, G[2]);

Tbox4[t] = mul4(s, G[3]);

s = inSbox[t];

Tbox5[t] = mul4(s, iG[0]);

Tbox6[t] = mul4(s, iG[1]);

Tbox7[t] = mul4(s, iG[2]);

Tbox8[t] = mul4(s, iG[3]);

}

G矩阵可以在作者的文献中查到,iG是G在GF(28)的逆。

在加解密过程中,加密用Tbox1-4,解密用Tbox5-8,前9轮用T,最后一轮用Sbox。但是要注意调用顺序,为了实现列混淆,具体顺序参看那个列混淆的公式。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有