最新AES课程设计报告.doc

上传人:1595****071 文档编号:33805266 上传时间:2022-08-12 格式:DOC 页数:27 大小:504.50KB
返回 下载 相关 举报
最新AES课程设计报告.doc_第1页
第1页 / 共27页
最新AES课程设计报告.doc_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《最新AES课程设计报告.doc》由会员分享,可在线阅读,更多相关《最新AES课程设计报告.doc(27页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精品资料AES课程设计报告.课程设计报告AES加密解密的实现课程名称: 密码算法程序设计 学生姓名: 学生学号: 专业班级: 任课教师: 2011年 6 月 24 日附件:课程设计成绩评价表指导老师评阅成绩表学习与工作态度(30%)选题意义(10%)文献综述(10%)研究水平与设计能力(20%)课程设计说明说(论文)撰写质量(20%)设计创新(10%)总分指导老师签名: 年 月 日课程设计答辩记录及评价表学生讲述情况教师主要提问记录学生回答问题情况答辩评分评分项目分值评价参考标准评分总分优良中及格差选题意义1098764文献综述1098764研究水平与设计能力201917151310课程设计说

2、明书(论文)撰写质量201917151310设计创新1098764答辩效果302825221915答辩小组成员签名答辩小组组长签名: 年 月 日课程设计成绩评定表成绩汇总评分项目评分比例分数课程设计总分指导老师评分50%答辩小组评分50%目 录1 背景与意义 由于AES应用了,感觉这算法的分组为固定长度的128bit,而密钥却有三种,分别为128,192,256bit,对应三种不同轮数分别为10轮,12轮,14轮。这就加大了算法实现的难度,加上每轮的4种变换,更加体现了算法的复杂性,所以我采用的AES来实现。不仅加深了我对密码算法本身的认识,更加巩固了我本来不是很熟悉的C语言。AES算法采用的

3、不可约多项式是p(x)=(84310),共256个多项余式构成了一个有限域,在这有限域上要用到字节运算和字运算。 随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES1。AES即高级加密标准,作为传统堆成加密算法标准DES的替代者,有美国国家标准与技术研究所于1997年提出征集该算法的公告.1999年3月22日,NIST从15个候选算法中公布了5个候选算法进入第二轮悬着:MARS、RC6、Rijindael、SERPENT和Twofish。经过三轮的筛选,2000年10

4、月2日,以安全性(稳定的数学基础、没有算法弱点、算法抗密码分析的强度、算法输出的随机性)、性能(必须能再多种平台上一较快的速度实现)、大小(不能占用大量的存储空间和内存)、实现特性(灵活性、硬件和软件适应性、算法的简单性等)为标准而最终选定了两个比利时研究者Vincent Rijmen和Joan Daemen发明的Rijndael算法,并于2001年正式发布了AES标准。此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。尽管人们对AES还有不同的看法,但总体来说,AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES设计有三个密钥长度:128,192,2

5、56位,相对而言,AES的128密钥比DES的56密钥强1021倍2。AES算法主要包括三个方面:轮变化、圈数和密钥扩展。本文以128为例,介绍算法的基本原理;结合AVR汇编语言,实现高级数据加密算法AES。2. 系统设计先定义后面s盒变换和密钥扩展要用到的s盒数组和rcon数组,然后定义s盒查找函数,行移位,列混合函数,因为这几个函数无论是在10轮还是12轮还是14轮执行时都没变化。然后就是12轮的轮密钥加和密钥扩展。这一步也许有点困难,接着就是12轮的加密函数本身。然后才是10轮的轮米要加和密钥扩展,加密函数。最后是解密要用到的逆字节替代,逆行移位,逆列混合,轮密钥加和密钥扩展函数和加密是

6、一样的,所以不用重新定义。2.1系统主要目标基本要求部分: 1完成一个明文分组的加解密,明文和密钥是十六进制,长度都为128比特(32个16进制数),按照标准输入明文和密钥,输出密文,进行加密后,能够进行正确的解密。2程序运行时,要求输出每一轮使用的密钥,以及每一轮中字节替代、行移位、列混合和密钥加等每一步操作之后的16进制表示的值。3. 提供运行标准示例的选项。4. 能够在文件读取密钥明文。5. 程序有良好的人机交互操作。,2.2主要软件需求(运行环境)本软件适用VC语言编写,编译成功后的EXE文件可以在装有windows系统的任何计算机上使用。测试平台:Windows XP Profess

7、ional使用软件:Visual C+ 6.02.3功能模块与系统结构主函数:xAESencrypt();128比特加密xAESencrypt6(); 12轮加密xAESdencrypt();128比特解密show();演示void SB() /从文件读取192比特密钥和明文void SA()/从文件读取128比特密钥void subbyte(int col44) /字节替代 void shiftrows(int col44) /行移位void mixcolumn(int col44) /列混合void addroundkey6(int col44,int allkey452,int nr)

8、/192比特轮密钥加void addroundkey(int col44,int allkey444,int nr) /128论密钥加void keyschedule6(int key46,int allkey452,int nk,int nr) /192密钥扩展void keyschedule(int key44,int allkey444,int nk,int nr) /128密钥扩展void invsubbyte(int col44) /逆字节替代void invshiftrows(int col44) /逆行移位void invmixcolumn(int col44) /逆列混合总体流

9、程图:S盒置换明文分组数据X与原始密钥K1异或(XK1)行变换列混淆与子密钥Ki异或(XKi)S盒置换行变换与子密钥Kr+1异或(XKi+1)加密分组数据加密分组数据与子密钥Kr+1异或(XKi+1)与子密钥Ki异或(XKi)反行变换反S盒置换反行变换反列混淆反列混淆与原始密钥K1异或(XK1)解密分组数据X先定义s盒查找函数,行移位,列混合函数,因为这几个函数无论是在10轮还是12轮还是14轮执行时都没变化。然后就是12轮的轮密钥加和密钥扩展。这一步也许有点困难,接着就是12轮的加密函数xAESencrypt6()本身。然后才是10轮的轮米要加和密钥扩展,加密函数xAESencrypt()。

10、最后是解xAESdencrypt()要用到的逆字节替代,逆行移位,逆列混合,轮密钥加和密钥扩展函数和加密是一样的,所以不用重新定义。最后写了一个演示show()。用的是动画上面的明文和密钥作为输入。3 系统功能程序设计3.1基本要求部分3.1.1 字节替换字节代换是非线性变换,独立地对状态的每个字节进行查表代换。代换表(S盒)是可逆的,由以下两个变换合成得到:首先,将字节看作GF(28)上的元素,映射到自己的乘法逆元。b(x)=a(x) mod m(x)其中m(x)=x8+x4+x3+x+1,当a(x)=0时,其逆元素也为0,即00映射到自己。其次,对字节作如下的(GF(2)上的,可逆的)仿射

11、变换,如图2所示。图2 S盒仿射变换将从00到FF的十六进制数经过上述运算就可以得到一个16*16的字节代换表,也就是用于加密的S盒。图3是字节代换示意图。图3 字节代换示意图主要算法:void subbyte(int col44) for(int i=0;i4;i+)for(int j=0;j4;j+)colij=sboxcolij;for(int a=0;a4;a+)for( int b=0;b4;b+)printf( %x,colba);printf(n);S数组表示S-盒,此处采用直接查表的方法实现S-盒替代。对于用于解密的逆S盒,需要通过在GF(2)域上的逆仿射变换生成,下面是进行逆

12、仿射变换的仿射变换矩阵,如图4。图4 逆S盒仿射变换它的逆变换的实现和它十分类似,同样也是通过查逆S-盒完成。3.1.2行移位行移位是根据不同的分组长度将状态矩阵中的各行进行相应循环移位。在加密过程中,状态矩阵的后三行要按字节进行左移位。在解密过程中则要进行逆行移位,即将状态矩阵中的后三行按字节进行右移位。表3给出了在分组不同的情况下移位量,即在后三行的第1行要移位c1个字节,第2行要移位c2个字节,第3行要移位c3个字节。表3 行移位量Nbc1c2c3412361238134加密算法的行移位过程如图5所示。图5 行移位示意图主要算法:void shiftrows(int col44)unsi

13、gned char temp4*4; int i,j;for(j=0;j4;j+)for(i=0;i4;i+)temp4*i+j=colij;for(i=1;i4;i+)for(j=0;j4;j+)if(i=1)colij=temp4*i+(j+1)%4;/第一行左移1位else if(i=2)colij=temp4*i+(j+2)%4;/第二行左移2位else if(i=3)colij=temp4*i+(j+3)%4;/第三行左移3位for(int a=0;a4;a+)for(int b=0;b4;b+)printf( %x,colba);printf(n);3.1.3列混合在列混合变换中,

14、将状态矩阵中的一列看作在GF(28)上的多项式,与一个常数多项式c(x)相乘并模x4+1。其中,c(x)=03x3+01x2+01x+02(系数用十六进制表示)c(x)是与x4+1互素的,因此模x4+1是可逆的。列混合预算也可写为矩阵乘法(图6)。设b(x)=c(x)a(x),则图6 列混合的矩阵表示主要算法:void mixcolumn(int col44)int r=0,c=0;int temp44;for(r=0;r4;r+)for(c=0;c4;c+)temprc=colrc;for(c=0;c4;c+)col0c=gfmultby02(temp0c)gfmultby03(temp1c

15、)gfmultby01(temp2c)gfmultby01(temp3c);col1c=gfmultby01(temp0c)gfmultby02(temp1c)gfmultby03(temp2c)gfmultby01(temp3c);col2c=gfmultby01(temp0c)gfmultby01(temp1c)gfmultby02(temp2c)gfmultby03(temp3c);col3c=gfmultby03(temp0c)gfmultby01(temp1c)gfmultby01(temp2c)gfmultby02(temp3c);for(int a=0;a4;a+)for( in

16、t b=0;b4;b+)printf( %x,colba);printf(n);这个算法还有点没弄明白,主要是调用上面的函数。在解密过程中,要做的逆列混合运算和列混合类似,即每列都用一个特定的多项式d(x)相乘。d(x)满足(03x3+01x2+01x+02)d(x)=01由此得到d(x)= 0bx3+0dx2+09x+0e逆列混合运算可转变成如下的一个矩阵运算,如图7所示。图7 逆列混合矩阵表示3.1.4密钥加轮密钥加是最后一个阶段,是将列混合的状态与子密钥进行XOR逻辑运算,即将轮密钥与状态按比特异或。轮密钥是通过密钥调度过程从密码密钥中得到的,轮密钥长度等于分组长度。密钥加是将轮密钥简单

17、地与状态进行逐比特异或。轮密钥由种子密钥通过密钥编排算法得到,轮密钥长度等于分组长度Nb。图8是密钥加运算示意图。图8 密钥加示意图主要算法:void addroundkey(int col44,int allkey444,int nr)int a,b,i,j;for(i=0;i4;i+)for(j=0;j4;j+)colij=allkeyij+4*nr; for(a=0;a4;a+)for(b=0;b4;b+)printf( %x,colba);printf(n);3.1.5密钥扩展 密钥扩展我认为是本密码程序的重点也是难点,密钥首先有一个初始密钥,要将密钥扩展出十组子密钥。密钥bit的总数

18、=分组长度*(轮数Round+1) 例如当分组长度为128bits和轮数Round为10时,轮密钥长度为128*(10+1)=1408bits。密钥的长度是够使用的,所以必须将密码密钥扩展成一个扩展密钥。扩展算法:第i-1轮的分组长度个字节的子密钥被分成四组来处理,每组4个字节。最后一组的4个字节先执行一个字节的循环左移,由s盒来进行替代处理,然后这4个字节结果中的第一个字节和轮常数相异或,这个轮常数是预先定义的,并且固定值。最后,为了得到第i轮的密钥,把得到的4个字节的结果和轮密钥的最初4字节按位异或,得到i轮密钥的最初4个字节,然后又和密钥的下面的4个字节按位异或,得到i轮密钥的下面四个字

19、节,以此类推。下面是主要图和代码:void keyschedule(int key44,int allkey444,int nk,int nr)int temp41,t;for(int a=0;a4;a+)/allkey初始化 for(int b=0;b44;b+)allkeyab=0;/置零 for(int i=0;i4;i+)/将key保存在allkey的前4列 for(int j=0;j4;j+) allkeyij=keyij; i=nk;while(i(4*(nr+1)for(int x=0;x4;x+) tempx0=allkeyxi-1;if(i%nk=0)/rotwordt=te

20、mp00;temp00=temp10;temp10=temp20;temp20=temp30;temp30=t;for(int k=0;k4;k+)/ subwordtempk0=sboxtempk0;for(int h=0;h4;h+) temph0=Rconhi/4;for(int y=0;y4;y+)allkeyyi=allkeyyi-4tempy0;i+;for(int g=0;g=10;g+)printf(第 %d 轮密钥,g);for(int q=0;q4;q+)for(int w=0;w4;w+)printf( %x,allkeywq+4*g);printf(n);3.1.6获取

21、RoundKey 以参数传递的形势获取allkey即每轮的密钥。轮密钥i(即第i个轮密钥)由轮密钥缓冲字WNb*i到WNb*(i+1)-1给出,如图9所示。W0W1W2W3W4W5W6W7W8W9W10W11W12W13W14轮密钥0轮密钥1图9 Nb=6且Nk=4时的密钥扩展与轮密钥选取keyschedule(key,allkey,nk,nr);addroundkey(col,allkey,0);3.1.7逆字节替换这个就和S盒替代一样。void invsubbyte(int col44)int i,j,a,b;for(i=0;i4;i+)for(j=0;j4;j+)colij=invsbo

22、xcolij;for(a=0;a4;a+)for(b=0;b0;j-)col1j=col1j-1;col10=temp;for(j=3;j1;j-)temp=col2j;col2j=col2j-2;col2j-2=temp;temp=col30;for(j=1;j4;j+)col3(j+3)%4=col3(j+4)%4;col33=temp;/printf(逆行移位后 :n);for(a=0;a4;a+)for(b=0;b4;b+)printf( %x,colba);printf(n);3.1.9逆列混合void invmixcolumn(int col44)int r=0,c=0,a,b;i

23、nt temp44;for(r=0;r4;r+)for(c=0;c4;c+)temprc=colrc;for(c=0;c4;c+)col0c=gfmultby0e(temp0c)gfmultby0b(temp1c)gfmultby0d(temp2c)gfmultby09(temp3c);col1c=gfmultby09(temp0c)gfmultby0e(temp1c)gfmultby0b(temp2c)gfmultby0d(temp3c);col2c=gfmultby0d(temp0c)gfmultby09(temp1c)gfmultby0e(temp2c)gfmultby0b(temp3c

24、);col3c=gfmultby0b(temp0c)gfmultby0d(temp1c)gfmultby09(temp2c)gfmultby0e(temp3c);for(a=0;a4;a+)for(b=0;b4;b+)printf( %x,colba);printf(n);3.1.10加密AES加密算法由初始轮密钥加和Nr轮的轮变换组成,它的输入为初始状态矩阵和轮密钥,执行加密算法后产生一个输出状态矩阵,输入明文和输出密文均为128比特。或者是从文件读取这些明文和密钥。这里的密钥可以是128比特也可以是192比特。流程图如下:void xAESencrypt()system(cls);int

25、nk=4,nr=10;int allkey444;int col44;int key44;printf(n请输入加密密钥:n);for(int o=0;o4;o+)for(int p=0;p4;p+)scanf(%x,&keypo);/memcpy(dekey, key, 64);printf(n请输入对应要加密的字节:n);for(int w=0;w4;w+)for(int v=0;v4;v+)scanf(%x,&colvw);printf(输入的密钥为(16进制):);for(int a=0;a4;a+)for(int b=0;b4;b+)printf( %x,keyba);printf(

26、n);printf(输入的明文为(16进制):);for(int c=0;c4;c+)for(int d=0;d4;d+)printf( %x,coldc);printf(n);keyschedule(key,allkey,nk,nr);addroundkey(col,allkey,0);printf(轮子密钥加结果:n);for(int e=0;e4;e+)for(int f=0;f4;f+)printf( %x,colef);printf(n); for(int x=1;x=(nr-1);x+)printf(第%d轮s盒置换以后:n,x);subbyte(col); printf(第%d轮

27、行移位结果:n,x);shiftrows(col); printf(第%d列混合结果:n,x);mixcolumn(col); printf(第%d轮密钥加结果:n,x);addroundkey(col,allkey,x); printf(第10轮s盒置换以后:n);subbyte(col); printf(第10轮行移位结果:n); shiftrows(col);printf(第10轮密钥加结果:n);addroundkey(col,allkey,nr); printf(nn加密结果为:);printf(n);for(int q=0;q4;q+)for(int r=0;r4;r+)print

28、f( %x,colrq);printf(n);/memcpy(de_asd, col, 64);printf(nn请按数字键“0”返回主菜单!(“enter”键确定)n);3.1.11解密流程图如下:解密算法和加密算法类似,只是在解密算法中使用的变换为加密时相应变换的逆变换,并且在第一轮到地Nr-1轮之间逆字节替代与逆行移位,逆列混合和逆轮密钥加交换了位置。void xAESdencrypt()system(cls);int allkey444;int nr=10,nk=4;int asd44;int key44;printf(n请输入解密密钥:16进制(128比特)n);for(int o=

29、0;o4;o+)for(int p=0;p4;p+)scanf(%x,&keypo);printf(n请输入要解密的字符:16进制(128比特)n);for(int w=0;w4;w+)for(int v=0;v4;v+)scanf(%x,&asdvw);printf(您输入的密钥为:);for(int a=0;a4;a+)for(int b=0;b4;b+)printf( %x,keyba);printf(n);printf(您输入的密文为:);for(int c=0;c4;c+)for(int d=0;d=1;x-)printf(第%d逆字节替代结果:n,10-x); invsubbyte

30、(asd);printf(第%d逆行移位结果:n,10-x); invshiftrows(asd); printf(第%d逆轮密钥加位结果:n,10-x); addroundkey(asd,allkey,x);printf(第%d逆列混合结果:n,10-x); invmixcolumn(asd);printf(第10逆字节替代结果:n);invsubbyte(asd);printf(第10逆行移位结果:n);invshiftrows(asd); printf(第10逆轮密钥加位结果:n);addroundkey(asd,allkey,0);printf(nn解密结果为:);for(int i=

31、0;i4;i+)for(int j=0;j4;j+)printf( %x,asdji);printf(n);printf(nn请按数字键“0”返回主菜单!(“enter”键确定)n);4. 测试报告 密钥扩展的测试本密钥扩展的测试直接调用密钥扩展函数,测试密钥在代码以字节数组的方式中输入。测试结果如下,与FIPS PUB 197 给出的结果完全相同, 此处只列出密钥长度为128位的数据,因此密钥扩展模块正确。3.5节已经叙述了解密密钥和加密密钥相同。密钥长度为128位初始密钥=2b7e151628aed2a6abf7158809cf4f3c加密轮密钥=2b7e151628aed2a6abf71

32、58809cf4f3ca0fafe1788542cb123a339392a6c7605f2c295f27a96b9435935807a7359f67f3d80477d4716fe3e1e237e446d7a883bef44a541a8525b7fb671253bdb0bad00d4d1c6f87c839d87caf2b8bc11f915bc6d88a37a110b3efddbf98641ca0093fd4e54f70e5f5fc9f384a64fb24ea6dc4fead27321b58dbad2312bf5607f8d292fac7766f319fadc2128d12941575c006ed

33、014f9a8c9ee2589e13f0cc8b6630ca6我的结果:密钥扩展没有问题。再来测试加密结果FIPS PUB 197测试。我的答案:解密测试:FIPS PUB 197先测试我的测试结果:对应的明文:和上面的测试结果一样。5结论这次总算搞懂了程序的编写流程,虽然只实现了简单要求,但是对我这样一个敲程序不熟练的学生来说,的确花了一些功夫,虽然我没有那么熟练的把每一步的实现算法流利的敲出来,但是对于密码学本算法的熟悉,我的确有不少的想法,只是实现起来对我来说还有点考验。对这个算法我算是熟悉了,刚开始就想一下子把十轮十二轮十四轮一起实现了,可是后来才发觉不是那么简单,所以就只实现了基本要

34、求的128bit。尝试了一下十二轮的加密,但是有个问题的确不好解决,就是输入的初始密钥是192bit,然而后面需要用到的密码分组是128bit一组,最后还是搞好了。从文件读取也成功了。然后再整个实现过程中遇到了很多困难,比如,用的是二维数组,遇到有时输入是先行后列,但是按照数组的定义是先列后行,很多时候有点绕。还有遇到的难题就是参数的选择和传递,这是一个很恼火的事情,由于语言基础不好,所以一个小小的问题都花了九牛二虎之力去把它解决。还有就是矩阵乘法那里的异或函数,也有点难,因为是十六进制的算法,需要用到二进制乘法的知识。还有就是很想实现多分组的算法还有汉字等作为密钥的。还有就是文件处理,对文件的加密。最后就是窗口了,本来想设计一个有良好交互的窗体形式的界面应用程序。最开始用的vituirl stidio来编写的,发觉自己的能力确实有限。所有的所有都归于自己编写程序的能力不足,所以,经过这次课程设计,让我发现必须得马上加强代码编写能力。但是,在这过程中我也的确学到了不少自己欠缺的东西。参考文献1 谭浩强C程序设计(第二版) 清华大学出版社19992 张世斌 应用密码学 西安电子科技大学出版社 2009

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com