版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上课程设计报告AES加密解密的实现课程名称: 密码算法程序设计 学生姓名: 学生学号: 专业班级: 任课教师: 2011年 6 月 24 日专心-专注-专业附件:课程设计成绩评价表指导老师评阅成绩表学习与工作态度(30%)选题意义(10%)文献综述(10%)研究水平与设计能力(20%)课程设计说明说(论文)撰写质量(20%)设计创新(10%)总分指导老师签名: 年 月 日课程设计答辩记录及评价表学生讲述情况教师主要提问记录学生回答问题情况答辩评分评分项目分值评价参考标准评分总分优良中及格差选题意义1098764文献综述1098764研究水平与设计能力2019171513
2、10课程设计说明书(论文)撰写质量201917151310设计创新1098764答辩效果302825221915答辩小组成员签名答辩小组组长签名: 年 月 日课程设计成绩评定表成绩汇总评分项目评分比例分数课程设计总分指导老师评分50%答辩小组评分50%目 录1 背景与意义 由于AES应用了,感觉这算法的分组为固定长度的128bit,而密钥却有三种,分别为128,192,256bit,对应三种不同轮数分别为10轮,12轮,14轮。这就加大了算法实现的难度,加上每轮的4种变换,更加体现了算法的复杂性,所以我采用的AES来实现。不仅加深了我对密码算法本身的认识,更加巩固了我本来不是很熟悉的C语言。A
3、ES算法采用的不可约多项式是p(x)=(84310),共256个多项余式构成了一个有限域,在这有限域上要用到字节运算和字运算。 随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES1。AES即高级加密标准,作为传统堆成加密算法标准DES的替代者,有美国国家标准与技术研究所于1997年提出征集该算法的公告.1999年3月22日,NIST从15个候选算法中公布了5个候选算法进入第二轮悬着:MARS、RC6、Rijindael、SERPENT和Twofish。经过三轮的筛选,
4、2000年10月2日,以安全性(稳定的数学基础、没有算法弱点、算法抗密码分析的强度、算法输出的随机性)、性能(必须能再多种平台上一较快的速度实现)、大小(不能占用大量的存储空间和内存)、实现特性(灵活性、硬件和软件适应性、算法的简单性等)为标准而最终选定了两个比利时研究者Vincent Rijmen和Joan Daemen发明的Rijndael算法,并于2001年正式发布了AES标准。此算法将成为美国新的数据加密标准而被广泛应用在各个领域中。尽管人们对AES还有不同的看法,但总体来说,AES作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES设计有三个密钥长度:12
5、8,192,256位,相对而言,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
7、Professional使用软件: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,i
8、nt nr) /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轮的轮米要加和密钥扩展,加密函数xAESenc
10、rypt()。最后是解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;i<4;i+)for(int j=0;j<4;j+)colij=sboxcolij;for(int a=0;a<4;a+)for( int b=0;b<4;b+)printf(" %x",colba);printf("n");S数组表示S-盒,此处采用直接查表的方
12、法实现S-盒替代。对于用于解密的逆S盒,需要通过在GF(2)域上的逆仿射变换生成,下面是进行逆仿射变换的仿射变换矩阵,如图4。图4 逆S盒仿射变换它的逆变换的实现和它十分类似,同样也是通过查逆S-盒完成。3.1.2行移位行移位是根据不同的分组长度将状态矩阵中的各行进行相应循环移位。在加密过程中,状态矩阵的后三行要按字节进行左移位。在解密过程中则要进行逆行移位,即将状态矩阵中的后三行按字节进行右移位。表3给出了在分组不同的情况下移位量,即在后三行的第1行要移位c1个字节,第2行要移位c2个字节,第3行要移位c3个字节。表3 行移位量Nbc1c2c3412361238134加密算法的行移位过程如图
13、5所示。图5 行移位示意图主要算法:void shiftrows(int col44)unsigned char temp4*4; int i,j;for(j=0;j<4;j+)for(i=0;i<4;i+)temp4*i+j=colij;for(i=1;i<4;i+)for(j=0;j<4;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;a<
14、4;a+)for(int b=0;b<4;b+)printf(" %x",colba);printf("n");3.1.3列混合在列混合变换中,将状态矩阵中的一列看作在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;f
15、or(r=0;r<4;r+)for(c=0;c<4;c+)temprc=colrc;for(c=0;c<4;c+)col0c=gfmultby02(temp0c)gfmultby03(temp1c)gfmultby01(temp2c)gfmultby01(temp3c);col1c=gfmultby01(temp0c)gfmultby02(temp1c)gfmultby03(temp2c)gfmultby01(temp3c);col2c=gfmultby01(temp0c)gfmultby01(temp1c)gfmultby02(temp2c)gfmultby03(temp3
16、c);col3c=gfmultby03(temp0c)gfmultby01(temp1c)gfmultby01(temp2c)gfmultby02(temp3c);for(int a=0;a<4;a+)for( int b=0;b<4;b+)printf(" %x",colba);printf("n");这个算法还有点没弄明白,主要是调用上面的函数。在解密过程中,要做的逆列混合运算和列混合类似,即每列都用一个特定的多项式d(x)相乘。d(x)满足(03x3+01x2+01x+02)d(x)=01由此得到d(x)= 0bx3+0dx2+09x+
17、0e逆列混合运算可转变成如下的一个矩阵运算,如图7所示。图7 逆列混合矩阵表示3.1.4密钥加轮密钥加是最后一个阶段,是将列混合的状态与子密钥进行XOR逻辑运算,即将轮密钥与状态按比特异或。轮密钥是通过密钥调度过程从密码密钥中得到的,轮密钥长度等于分组长度。密钥加是将轮密钥简单地与状态进行逐比特异或。轮密钥由种子密钥通过密钥编排算法得到,轮密钥长度等于分组长度Nb。图8是密钥加运算示意图。图8 密钥加示意图主要算法:void addroundkey(int col44,int allkey444,int nr)int a,b,i,j;for(i=0;i<4;i+)for(j=0;j<
18、;4;j+)colij=allkeyij+4*nr; for(a=0;a<4;a+)for(b=0;b<4;b+)printf(" %x",colba);printf("n");3.1.5密钥扩展 密钥扩展我认为是本密码程序的重点也是难点,密钥首先有一个初始密钥,要将密钥扩展出十组子密钥。密钥bit的总数=分组长度*(轮数Round+1) 例如当分组长度为128bits和轮数Round为10时,轮密钥长度为128*(10+1)=1408bits。密钥的长度是够使用的,所以必须将密码密钥扩展成一个扩展密钥。扩展算法:第i-1轮的分组长度个字节的
19、子密钥被分成四组来处理,每组4个字节。最后一组的4个字节先执行一个字节的循环左移,由s盒来进行替代处理,然后这4个字节结果中的第一个字节和轮常数相异或,这个轮常数是预先定义的,并且固定值。最后,为了得到第i轮的密钥,把得到的4个字节的结果和轮密钥的最初4字节按位异或,得到i轮密钥的最初4个字节,然后又和密钥的下面的4个字节按位异或,得到i轮密钥的下面四个字节,以此类推。下面是主要图和代码:void keyschedule(int key44,int allkey444,int nk,int nr)int temp41,t;for(int a=0;a<4;a+)/allkey初始化 for
20、(int b=0;b<44;b+)allkeyab=0;/置零 for(int i=0;i<4;i+)/将key保存在allkey的前4列 for(int j=0;j<4;j+) allkeyij=keyij; i=nk;while(i<(4*(nr+1)for(int x=0;x<4;x+) tempx0=allkeyxi-1;if(i%nk=0)/rotwordt=temp00;temp00=temp10;temp10=temp20;temp20=temp30;temp30=t;for(int k=0;k<4;k+)/ subwordtempk0=sbo
21、xtempk0;for(int h=0;h<4;h+) temph0=Rconhi/4;for(int y=0;y<4;y+)allkeyyi=allkeyyi-4tempy0;i+;for(int g=0;g<=10;g+)printf("第 %d 轮密钥",g);for(int q=0;q<4;q+)for(int w=0;w<4;w+)printf(" %x",allkeywq+4*g);printf("n");3.1.6获取RoundKey 以参数传递的形势获取allkey即每轮的密钥。轮密钥i(
22、即第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;i<4;i+)for(j=0;j<4;j+)colij=invsboxcolij;for(a=0;a<4;a+)for(
23、b=0;b<4;b+)printf(" %x",colba);printf("n");3.1.8逆行移位void invshiftrows(int col44)int j,temp,a,b;temp=col13;for(j=3;j>0;j-)col1j=col1j-1;col10=temp;for(j=3;j>1;j-)temp=col2j;col2j=col2j-2;col2j-2=temp;temp=col30;for(j=1;j<4;j+)col3(j+3)%4=col3(j+4)%4;col33=temp;/printf(
24、"逆行移位后 :n");for(a=0;a<4;a+)for(b=0;b<4;b+)printf(" %x",colba);printf("n");3.1.9逆列混合void invmixcolumn(int col44)int r=0,c=0,a,b;int temp44;for(r=0;r<4;r+)for(c=0;c<4;c+)temprc=colrc;for(c=0;c<4;c+)col0c=gfmultby0e(temp0c)gfmultby0b(temp1c)gfmultby0d(temp2c
25、)gfmultby09(temp3c);col1c=gfmultby09(temp0c)gfmultby0e(temp1c)gfmultby0b(temp2c)gfmultby0d(temp3c);col2c=gfmultby0d(temp0c)gfmultby09(temp1c)gfmultby0e(temp2c)gfmultby0b(temp3c);col3c=gfmultby0b(temp0c)gfmultby0d(temp1c)gfmultby09(temp2c)gfmultby0e(temp3c);for(a=0;a<4;a+)for(b=0;b<4;b+)printf(
26、" %x",colba);printf("n");3.1.10加密AES加密算法由初始轮密钥加和Nr轮的轮变换组成,它的输入为初始状态矩阵和轮密钥,执行加密算法后产生一个输出状态矩阵,输入明文和输出密文均为128比特。或者是从文件读取这些明文和密钥。这里的密钥可以是128比特也可以是192比特。流程图如下:void xAESencrypt()system("cls");int nk=4,nr=10;int allkey444;int col44;int key44;printf("n请输入加密密钥:n");for(
27、int o=0;o<4;o+)for(int p=0;p<4;p+)scanf("%x",&keypo);/memcpy(dekey, key, 64);printf("n请输入对应要加密的字节:n");for(int w=0;w<4;w+)for(int v=0;v<4;v+)scanf("%x",&colvw);printf("输入的密钥为(16进制):");for(int a=0;a<4;a+)for(int b=0;b<4;b+)printf("
28、 %x",keyba);printf("n");printf("输入的明文为(16进制):");for(int c=0;c<4;c+)for(int d=0;d<4;d+)printf(" %x",coldc);printf("n");keyschedule(key,allkey,nk,nr);addroundkey(col,allkey,0);printf("轮子密钥加结果:n");for(int e=0;e<4;e+)for(int f=0;f<4;f+)p
29、rintf(" %x",colef);printf("n"); for(int x=1;x<=(nr-1);x+)printf("第%d轮s盒置换以后:n",x);subbyte(col); printf("第%d轮行移位结果:n",x);shiftrows(col); printf("第%d列混合结果:n",x);mixcolumn(col); printf("第%d轮密钥加结果:n",x);addroundkey(col,allkey,x); printf(&quo
30、t;第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;q<4;q+)for(int r=0;r<4;r+)printf(" %x",colrq);printf("n");/memcpy(d
31、e_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(in
32、t o=0;o<4;o+)for(int p=0;p<4;p+)scanf("%x",&keypo);printf("n请输入要解密的字符:16进制(128比特)n");for(int w=0;w<4;w+)for(int v=0;v<4;v+)scanf("%x",&asdvw);printf("您输入的密钥为:");for(int a=0;a<4;a+)for(int b=0;b<4;b+)printf(" %x",keyba);print
33、f("n");printf("您输入的密文为:");for(int c=0;c<4;c+)for(int d=0;d<4;d+)printf(" %x",asddc);printf("n");keyschedule(key,allkey,nk,nr);printf("nn轮子密钥加结果为:");addroundkey(asd,allkey,nr);printf("n");for(int x=9;x>=1;x-)printf("第%d逆字节替代结果:
34、n",10-x); invsubbyte(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");invshiftr
35、ows(asd); printf("第10逆轮密钥加位结果:n");addroundkey(asd,allkey,0);printf("nn解密结果为:");for(int i=0;i<4;i+)for(int j=0;j<4;j+)printf(" %x",asdji);printf("n");printf("nn请按数字键“0”返回主菜单!(“enter”键确定)n");4. 测试报告 密钥扩展的测试本密钥扩展的测试直接调用密钥扩展函数,测试密钥在代码以字节数组的方式中输入。测试结果如下,与FIPS PUB 197 给出的结果完全相同
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024石材工艺品供货合同
- 2024装饰项目合作合同
- 智能决策支持系统在数字化农业中的部署
- 数字化农业项目实施团队组建与培训计划
- 苏州科技大学天平学院《外国文学二》2023-2024学年第一学期期末试卷
- 苏州科技大学天平学院《市场营销学概论》2023-2024学年第一学期期末试卷
- 2024信息服务费合同范本信息服务费合同范本
- 2024学校垃圾清运合同
- 危险品仓储储存容器与包装要求考核试卷
- 宠物救援与赈灾工作考核试卷
- 2024-2030年国内水产饲料行业市场发展分析及竞争格局与发展策略研究报告
- 沪科版七年级上册数学期中考试试卷附答案
- 2023年中国铁路国际有限公司招聘笔试真题
- 《护理管理学》期末考试复习题库(含答案)
- 学习通尊重学术道德遵守学术规范课后习题答案
- 桩基检测规范
- 专项素养综合全练(八) 跨学科专题教学设计2024-2025学年北师大版物理八年级上册
- 2024年大学生村官考试题及参考答案
- 混凝土结构课程课程设计
- 物业管理有限公司章程
- 2024年北京市中考化学试卷(附答案)(附参考答案)
评论
0/150
提交评论