AES课程设计报告.doc
- 文档编号:345483
- 上传时间:2023-04-29
- 格式:DOC
- 页数:22
- 大小:464KB
AES课程设计报告.doc
《AES课程设计报告.doc》由会员分享,可在线阅读,更多相关《AES课程设计报告.doc(22页珍藏版)》请在冰点文库上搜索。
课程设计报告
AES加密解密的实现
课程名称:
密码算法程序设计
学生姓名:
学生学号:
专业班级:
任课教师:
2011年6月24日
附件:
课程设计成绩评价表
指导老师评阅成绩表
学习与工作态度(30%)
选题意义(10%)
文献综述(10%)
研究水平与设计能力(20%)
课程设计说明说(论文)撰写质量(20%)
设计创新(10%)
总分
指导老师签名:
年月日
课程设计答辩记录及评价表
学生
讲述情况
教师主要
提问记录
学生回答
问题情况
答辩评分
评分项目
分值
评价参考标准
评分
总分
优
良
中
及格
差
选题意义
10
9
8
7
6
4
文献综述
10
9
8
7
6
4
研究水平与设计能力
20
19
17
15
13
10
课程设计说明书(论文)撰写质量
20
19
17
15
13
10
设计创新
10
9
8
7
6
4
答辩效果
30
28
25
22
19
15
答辩小组成员签名
答辩小组组长签名:
年月日
课程设计成绩评定表
成绩汇总
评分项目
评分
比例
分数
课程设计总分
指导老师评分
50%
答辩小组评分
50%
目录
1.背景与意义 1
2.系统设计 1
2.1系统主要目标 1
2.2主要软件需求(运行环境) 2
2.3功能模块与系统结构 2
3系统功能程序设计 3
3.1基本要求部分 3
3.1.1字节替换 4
3.1.2行移位 5
3.1.3列混合 6
3.1.4密钥加 8
3.1.5密钥扩展 8
3.1.6获取RoundKey 10
3.1.7逆字节替换 11
3.1.8逆行移位 11
3.1.9逆列混合 12
3.1.10加密 13
3.1.11解密 15
4.测试报告 17
5.结论 19
参考文献 19
1.背景与意义
由于AES应用了,感觉这算法的分组为固定长度的128bit,而密钥却有三种,分别为128,192,256bit,对应三种不同轮数分别为10轮,12轮,14轮。
这就加大了算法实现的难度,加上每轮的4种变换,更加体现了算法的复杂性,所以我采用的AES来实现。
不仅加深了我对密码算法本身的认识,更加巩固了我本来不是很熟悉的C语言。
AES算法采用的不可约多项式是p(x)=(84310),共256个多项余式构成了一个有限域,在这有限域上要用到字节运算和字运算。
随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES[1]。
AES即高级加密标准,作为传统堆成加密算法标准DES的替代者,有美国国家标准与技术研究所于1997年提出征集该算法的公告.1999年3月22日,NIST从15个候选算法中公布了5个候选算法进入第二轮悬着:
MARS、RC6、Rijindael、SERPENT和Twofish。
经过三轮的筛选,2000年10月2日,以安全性(稳定的数学基础、没有算法弱点、算法抗密码分析的强度、算法输出的随机性)、性能(必须能再多种平台上一较快的速度实现)、大小(不能占用大量的存储空间和内存)、实现特性(灵活性、硬件和软件适应性、算法的简单性等)为标准而最终选定了两个比利时研究者VincentRijmen和JoanDaemen发明的Rijndael算法,并于2001年正式发布了AES标准。
此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。
尽管人们对AES还有不同的看法,但总体来说,AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。
AES设计有三个密钥长度:
128,192,256位,相对而言,AES的128密钥比DES的56密钥强1021倍[2]。
AES算法主要包括三个方面:
轮变化、圈数和密钥扩展。
本文以128为例,介绍算法的基本原理;结合AVR汇编语言,实现高级数据加密算法AES。
2.系统设计
先定义后面s盒变换和密钥扩展要用到的s盒数组和rcon数组,然后定义s盒查找函数,行移位,列混合函数,因为这几个函数无论是在10轮还是12轮还是14轮执行时都没变化。
然后就是12轮的轮密钥加和密钥扩展。
这一步也许有点困难,接着就是12轮的加密函数本身。
然后才是10轮的轮米要加和密钥扩展,加密函数。
最后是解密要用到的逆字节替代,逆行移位,逆列混合,轮密钥加和密钥扩展函数和加密是一样的,所以不用重新定义。
2.1系统主要目标
基本要求部分:
1.完成一个明文分组的加解密,明文和密钥是十六进制,长度都为128比特(32个16进制数),按照标准输入明文和密钥,输出密文,进行加密后,能够进行正确的解密。
2.程序运行时,要求输出每一轮使用的密钥,以及每一轮中字节替代、行移位、列混合和密钥加等每一步操作之后的16进制表示的值。
3.提供运行标准示例的选项。
4.能够在文件读取密钥明文。
5.程序有良好的人机交互操作。
,
2.2主要软件需求(运行环境)
本软件适用VC语言编写,编译成功后的EXE文件可以在装有windows系统的任何计算机上使用。
测试平台:
WindowsXPProfessional
使用软件:
VisualC++6.0
2.3功能模块与系统结构
主函数:
xAESencrypt();128比特加密
xAESencrypt6();12轮加密
xAESdencrypt();128比特解密
show();演示
voidSB()//从文件读取192比特密钥和明文
voidSA()//从文件读取128比特密钥
voidsubbyte(intcol[4][4])//字节替代
voidshiftrows(intcol[4][4])//行移位
voidmixcolumn(intcol[4][4])//列混合
voidaddroundkey6(intcol[4][4],intallkey[4][52],intnr)//192比特轮密钥加
voidaddroundkey(intcol[4][4],intallkey[4][44],intnr)//128论密钥加
voidkeyschedule6(intkey[4][6],intallkey[4][52],intnk,intnr)//192密钥扩展
voidkeyschedule(intkey[4][4],intallkey[4][44],intnk,intnr)//128密钥扩展
voidinvsubbyte(intcol[4][4])//逆字节替代
voidinvshiftrows(intcol[4][4])//逆行移位
voidinvmixcolumn(intcol[4][4])//逆列混合
总体流程图:
S盒置换
明文分组数据X
与原始密钥K1异或(X⊕K1)
行变换
列混淆
与子密钥Ki异或(X⊕Ki)
S盒置换
行变换
与子密钥Kr+1异或(X⊕Ki+1)
加密分组数据
加密分组数据
与子密钥Kr+1异或(X⊕Ki+1)
与子密钥Ki异或(X⊕Ki)
反行变换
反S盒置换
反行变换
反列混淆
反列混淆
与原始密钥K1异或(X⊕K1)
解密分组数据X
先定义s盒查找函数,行移位,列混合函数,因为这几个函数无论是在10轮还是12轮还是14轮执行时都没变化。
然后就是12轮的轮密钥加和密钥扩展。
这一步也许有点困难,接着就是12轮的加密函数xAESencrypt6()本身。
然后才是10轮的轮米要加和密钥扩展,加密函数xAESencrypt()。
最后是解xAESdencrypt()要用到的逆字节替代,逆行移位,逆列混合,轮密钥加和密钥扩展函数和加密是一样的,所以不用重新定义。
最后写了一个演示show()。
用的是动画上面的明文和密钥作为输入。
3系统功能程序设计
3.1基本要求部分
3.1.1字节替换
字节代换是非线性变换,独立地对状态的每个字节进行查表代换。
代换表(S盒)是可逆的,由以下两个变换合成得到:
首先,将字节看作GF(28)上的元素,映射到自己的乘法逆元。
b(x)=a(x)modm(x)
其中m(x)=x8+x4+x3+x+1,当a(x)=0时,其逆元素也为0,即’00’映射到自己。
。
其次,对字节作如下的(GF
(2)上的,可逆的)仿射变换,如图2所示。
图2S盒仿射变换
将从00到FF的十六进制数经过上述运算就可以得到一个16*16的字节代换表,也就是用于加密的S盒。
图3是字节代换示意图。
图3字节代换示意图
主要算法:
voidsubbyte(intcol[4][4])
{
for(inti=0;i<4;i++)
for(intj=0;j<4;j++)
{
col[i][j]=sbox[col[i][j]];
}
for(inta=0;a<4;a++)
for(intb=0;b<4;b++)
{
printf("%x",col[b][a]);
}printf("\n");
}
S数组表示S-盒,此处采用直接查表的方法实现S-盒替代。
对于用于解密的逆S盒,需要通过在GF
(2)域上的逆仿射变换生成,下面是进行逆仿射变换的仿射变换矩阵,如图4。
图4逆S盒仿射变换
它的逆变换的实现和它十分类似,同样也是通过查逆S-盒完成。
3.1.2行移位
行移位是根据不同的分组长度将状态矩阵中的各行进行相应循环移位。
在加密过程中,状态矩阵的后三行要按字节进行左移位。
在解密过程中则要进行逆行移位,即将状态矩阵中的后三行按字节进行右移位。
表3给出了在分组不同的情况下移位量,即在后三行的第1行要移位c1个字节,第2行要移位c2个字节,第3行要移位c3个字节。
表3行移位量
Nb
c1
c2
c3
4
1
2
3
6
1
2
3
8
1
3
4
加密算法的行移位过程如图5所示。
图5行移位示意图
主要算法:
voidshiftrows(intcol[4][4])
{
unsignedchartemp[4*4];
inti,j;
for(j=0;j<4;j++)
{
for(i=0;i<4;i++)
{
temp[4*i+j]=col[i][j];
}
}
for(i=1;i<4;i++)
{
for(j=0;j<4;j++)
{
if(i==1)col[i][j]=temp[4*i+(j+1)%4]; //第一行左移1位
elseif(i==2)col[i][j]=temp[4*i+(j+2)%4]; //第二行左移2位
elseif(i==3)col[i][j]=temp[4*i+(j+3)%4]; //第三行左移3位
}
}
for(inta=0;a<4;a++)
for(intb=0;b<4;b++)
{
printf("%x",col[b][a]);
}printf("\n");
}
3.1.3列混合
在列混合变换中,将状态矩阵中的一列看作在GF(28)上的多项式,与一个常数多项式c(x)相乘并模x4+1。
其中,
c(x)=’03’x3+’01’x2+’01’x+’02’(系数用十六进制表示)
c(x)是与x4+1互素的,因此模x4+1是可逆的。
列混合预算也可写为矩阵乘法(图6)。
设b(x)=c(x)⊕a(x),则
图6列混合的矩阵表示
主要算法:
voidmixcolumn(intcol[4][4])
{
intr=0,c=0;
inttemp[4][4];
for(r=0;r<4;r++){
for(c=0;c<4;c++){
temp[r][c]=col[r][c];
}
}
for(c=0;c<4;c++){
col[0][c]=gfmultby02(temp[0][c])^gfmultby03(temp[1][c])^gfmultby01(temp[2][c])^gfmultby01(temp[3][c]);
col[1][c]=gfmultby01(temp[0][c])^gfmultby02(temp[1][c])^gfmultby03(temp[2][c])^gfmultby01(temp[3][c]);
col[2][c]=gfmultby01(temp[0][c])^gfmultby01(temp[1][c])^gfmultby02(temp[2][c])^gfmultby03(temp[3][c]);
col[3][c]=gfmultby03(temp[0][c])^gfmultby01(temp[1][c])^gfmultby01(temp[2][c])^gfmultby02(temp[3][c]);
}
for(inta=0;a<4;a++)
for(intb=0;b<4;b++)
{
printf("%x",col[b][a]);
}printf("\n");
}
这个算法还有点没弄明白,主要是调用上面的函数。
在解密过程中,要做的逆列混合运算和列混合类似,即每列都用一个特定的多项式d(x)相乘。
d(x)满足
(‘03’x3+’01’x2+’01’x+’02’)⊕d(x)=’01’
由此得到
d(x)=‘0b’x3+’0d’x2+’09’x+’0e’
逆列混合运算可转变成如下的一个矩阵运算,如图7所示。
图7逆列混合矩阵表示
3.1.4密钥加
轮密钥加是最后一个阶段,是将列混合的状态与子密钥进行XOR逻辑运算,即将轮密钥与状态按比特异或。
轮密钥是通过密钥调度过程从密码密钥中得到的,轮密钥长度等于分组长度。
密钥加是将轮密钥简单地与状态进行逐比特异或。
轮密钥由种子密钥通过密钥编排算法得到,轮密钥长度等于分组长度Nb。
图8是密钥加运算示意图。
图8密钥加示意图
主要算法:
voidaddroundkey(intcol[4][4],intallkey[4][44],intnr)
{
inta,b,i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
col[i][j]^=allkey[i][j+4*nr];
}
for(a=0;a<4;a++)
for(b=0;b<4;b++)
{
printf("%x",col[b][a]);
}printf("\n");
}
3.1.5密钥扩展
密钥扩展我认为是本密码程序的重点也是难点,密钥首先有一个初始密钥,要将密钥扩展出十组子密钥。
密钥bit的总数=分组长度*(轮数Round+1)例如当分组长度为128bits和轮数Round为10时,轮密钥长度为128*(10+1)=1408bits。
密钥的长度是够使用的,所以必须将密码密钥扩展成一个扩展密钥。
扩展算法:
第i-1轮的分组长度个字节的子密钥被分成四组来处理,每组4个字节。
最后一组的4个字节先执行一个字节的循环左移,由s盒来进行替代处理,然后这4个字节结果中的第一个字节和轮常数相异或,这个轮常数是预先定义的,并且固定值。
最后,为了得到第i轮的密钥,把得到的4个字节的结果和轮密钥的最初4字节按位异或,得到i轮密钥的最初4个字节,然后又和密钥的下面的4个字节按位异或,得到i轮密钥的下面四个字节,以此类推。
下面是主要图和代码:
voidkeyschedule(intkey[4][4],intallkey[4][44],intnk,intnr)
{
inttemp[4][1],t;
for(inta=0;a<4;a++) //allkey初始化
for(intb=0;b<44;b++)
{allkey[a][b]=0;}//置零
for(inti=0;i<4;i++) //将key保存在allkey的前4列
for(intj=0;j<4;j++)
{
allkey[i][j]=key[i][j];
}
i=nk;
while(i<(4*(nr+1)))
{
for(intx=0;x<4;x++)
temp[x][0]=allkey[x][i-1];
if(i%nk==0)
{
//rotword
t=temp[0][0];
temp[0][0]=temp[1][0];
temp[1][0]=temp[2][0];
temp[2][0]=temp[3][0];
temp[3][0]=t;
for(intk=0;k<4;k++) //subword
{
temp[k][0]=sbox[temp[k][0]];
}
for(inth=0;h<4;h++)
temp[h][0]^=Rcon[h][i/4];
}
for(inty=0;y<4;y++)
allkey[y][i]=allkey[y][i-4]^temp[y][0];
i++;
}
for(intg=0;g<=10;g++){
printf("第%d轮密钥",g);
for(intq=0;q<4;q++)
for(intw=0;w<4;w++)
{
printf("%x",allkey[w][q+4*g]);
}
printf("\n");
}
}
3.1.6获取RoundKey
以参数传递的形势获取allkey即每轮的密钥。
轮密钥i(即第i个轮密钥)由轮密钥缓冲字W[Nb*i]到W[Nb*(i+1)-1]给出,如图9所示。
W0
W1
W2
W3
W4
W5
W6
W7
W8
W9
W10
W11
W12
W13
W14
…
轮密钥0
轮密钥1
……
图9Nb=6且Nk=4时的密钥扩展与轮密钥选取
keyschedule(key,allkey,nk,nr);
addroundkey(col,allkey,0);
3.1.7逆字节替换
这个就和S盒替代一样。
voidinvsubbyte(intcol[4][4])
{
inti,j,a,b;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
col[i][j]=invsbox[col[i][j]];
}
for(a=0;a<4;a++)
for(b=0;b<4;b++)
{
printf("%x",col[b][a]);
}printf("\n");
}
3.1.8逆行移位
voidinvshiftrows(intcol[4][4])
{
intj,temp,a,b;
temp=col[1][3];
for(j=3;j>0;j--)
{
col[1][j]=col[1][j-1];
}
col[1][0]=temp;
for(j=3;j>1;j--)
{
temp=col[2][j];
col[2][j]=col[2][j-2];
col[2][j-2]=temp;
}
temp=col[3][0];
for(j=1;j<4;j++)
{
col[3][(j+3)%4]=col[3][(j+4)%4];
}
col[3][3]=temp;
//printf("逆行移位后:
\n");
for(a=0;a<4;a++)
for(b=0;b<4;b++)
{
printf("%x",col[b][a]);
}printf("\n");
}
3.1.9逆列混合
voidinvmixcolumn(intcol[4][4]){
intr=0,c=0,a,b;
inttemp[4][4];
for(r=0;r<4;r++){
for(c=0;c<4;c++){
temp[r][c]=col[r][c];
}
}
for(c=0;c<4;c++){
col[0][c]=gfmultby0e(temp[0][c])^gfmultby0b(temp[1][c])^gfmultby0d(temp[2][c])^gfmultby09(temp[3][c]);
col[1][c]=gfmultby09(temp[0][c])^gfmultby0e(temp[1][c])^gfmultby0b(temp[2][c])^gfmultby0d(temp[3][c]);
col[2][c]=gfmultby0d(temp[0][c])^gfmultby09(temp[1][c])^gfmultby0e(temp[2][c])^gfmultby0b(temp[3][c]);
col[3][c]=gfmultby0b(temp[0][c])^gfmultby0d(temp[1][c])^gfmultby09(temp[2][c])^gfmultby0e(temp[3][c]);
}
for(a=0;a<4;a++)
for(b=0;b<4;b++)
{
printf("%x",col[b][a]);
}printf("\n");
}
3.1.10加密
AES加密算法由初始轮密钥加和Nr轮的轮变换组成,它的输入为初始状态矩阵和轮密钥,执行加密算法后产生一个输出状态矩阵,输入明文和输出密文均为128比特。
或者是从文件读取这些明文和密钥。
这里的密钥可以是128比特也可以是
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AES 课程设计 报告