




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、成都信息工程学院课程设计报告AES加密解密软件的实现目录1、选题背景42、设计的目标42.1基本目标:42.2较高目标:53、功能需求分析54、模块划分64.1、密钥调度64.2、加密84.2.1、字节代替(SubBytes)84.2.2、行移位(ShiftRows)104.2.3、列混合(MixColumn)114.2.4、轮密钥加(AddRoundKey)134.2.5、加密主函数144.3、解密164.3.1、逆字节替代(InvSubBytes)164.3.2、逆行移位(InvShiftRows)174.3.3、逆列混合(InvMixCloumns)174.3.4、轮密钥加(AddRou
2、ndKey)184.3.5、解密主函数185.测试报告205.1主界面205.2测试键盘输入明文和密钥加密205.3测试键盘输入密文和密钥加密215.3测试文件输入明文和密钥加密225.4测试文件输入密文和密钥加密225.5软件说明236.课程设计报告总结237.参考文献241、选题背景高级加密标准(Advanced Encryption Standard,AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月2
3、6日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。(Rijndael的发音近于 "Rhine doll") 严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支援更大范围的区块和密钥长度:AES的区块长度固定为128 位元,密钥长度则可以是128,192或256位元
4、;而Rijndael使用的密钥和区块长度可以是32位元的整数倍,以128位元为下限,256位元为上限。加密过程中使用的密钥是由Rijndael密钥生成方案产生。大多数AES计算是在一个特别的有限域完成的。 截至2006年,针对AES唯一的成功攻击是旁道攻击 旁道攻击不攻击密码本身,而是攻击那些实作于不安全系统(会在不经意间泄漏资讯)上的加密系统。2005年4月,D.J. Bernstein公布了一种缓存时序攻击法,他以此破解了一个装载OpenSSL AES加密系统的客户服务器6。为了设计使该服务器公布所有的时序资讯,攻击算法使用了2亿多条筛选过的明码。有人认为谁?,对于需要多个跳跃的国际互联网
5、而言,这样的攻击方法并不实用7。 Bruce Schneier称此攻击为“好的时序攻击法”8。 2005年10月,Eran Tromer和另外两个研究员发表了一篇论文,展示了数种针对AES的缓存时序攻击法。其中一种攻击法只需要800个写入动作,费时65毫秒,就能得到一把完整的AES密钥。但攻击者必须在执行加密的系统上拥有执行程式的权限,方能以此法破解该密码系统。虽然高级加密标准也有不足的一面,但是,它仍是一个相对新的协议。因此,安全研究人员还没有那么多的时间对这种加密方法进行破解试验。我们可能会随时发现一种全新的攻击手段会攻破这种高级加密标准。至少在理论上存在这种可能性。2、设计的目标2.1基
6、本目标:(1)在深入理解AES加密/解密算法理论的基础上,能够设计一个AES加密/解密软件系统,采用控制台模式,使用VS2010进行开发,所用语言为C语言进行编程,实现加密解密;(2)能够完成只有一个明文分组的加解密,明文和密钥是ASCII码,长度都为16个字符(也就是固定明文和密钥为128比特),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;(3)程序运行时,能够按照要求输出最后两轮的轮密钥,以及最后两轮加密或解密之后的值,16进制表示;(4)程序有良好的人机交互操作;(5)能够实现从两个文件分别读取明文和密钥,并在程序中输出明文及密钥;(6)要求有与标准fips-197进行比较
7、的独立模块;(7)最后提供所设计系统的报告及完整的软件,关键代码等。2.2较高目标:能完成以下全部或部分功能:(1)如果从文件读取的明文不止一个分组,程序能完成分组,然后加密;最后一个分组长度不足时要求完成填充;输入信息可以是文本文档,或者普通文件。进行加密后,能够进行正确的解密;(2)密钥包括128bit、192bit、256bit三种情况,有三种情况时与标准fips-197进行比较的独立模块,且从文本文件读取。(3)程序代码有比较好的结构,模块划分合理,如用类进行封装,通过调用类的成员函数实现加密解密功能,函数的参数及返回值设置合理等;(4)对加密大文件的考虑;(5)多线程的使用;(6)界
8、面友好,程序设计实现有创新。 3、功能需求分析AES中的操作均是以字节作为基础的,用到的变量也都是以字节为基础。State可以用4×4的矩阵表示。AES算法结构对加密和解密的操作,算法由轮密钥开始,并用Nr表示对一个数据分组加密的轮数(加密轮数与密钥长度的关系如表2所示)。AES算法的主循环State矩阵执行轮迭代运算,每轮都包括所有 4个阶段的代换,分别是在规范中被称为 SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和AddRoundKey,(由于外部输入的加密密钥K长度有限 ,所以在算法中要用一个密钥扩展程序(Keyexpan
9、sion)把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。)最后执行只包括 3个阶段 (省略 MixColumns变换)的最后一轮运算。表2 AES参数密钥长度(bits)128192256明文分组长度(bits)128128128轮数101214每轮密钥长度(bits)128128128扩展密钥长度(bytes)176206240基本要求按标准分组,以128比特为分组大小。所以轮数为10轮,密钥长度也为128比特4、模块划分划分为三个部分,密钥调度,加密,解密, 4.1、密钥调度一密钥调度包括两个部分:密钥扩展和轮密钥选取。密钥扩展的作用是在数据加密/解密前得到轮变换中中使用
10、的轮密钥,其基本原则是:1) 轮密钥的密钥长度为分组长乘以(1 +Nr),如果分组长为128bit,轮数为了10,则轮密钥的长度为128*(10+1)= 1408bit;2) 种子密钥扩展为扩展密钥,种子密钥长度为4*NK个字节;3) 轮密钥由以下方法从扩展密钥中获得:对第1轮密钥由前Nb个字构成;第2轮密钥由第二个Nb个字节即第Nb + 1个字到第2Nb个字构成;以下依次类推。扩展密钥用数组w(Nb*(Nr + 1)表示,前Nk个字是原密钥,其它密钥字通过计算方法生成。子字节变换是一个返回4个字节的函数,每个字节都是它输入字中相应位置字节通过S盒作用后的结果。循环左移变换返回的是这4个字节经
11、循环置换后的字,即将该字循环左移一个字节,如输入字为w = (a0,a1,a2,a3),则变换后输出字为w = (a1,a2,a3,a0)。扩展密钥的前Nk个字由种子密钥构成,随后的字wi等于字wi-1经一些变换后得到的字temp和字Wi-Nk异或而成;而且对位置为Nk倍数的字变换中不仅运用了循环左移变换和子字节变换,还运用了轮常数Rcon对变换后的字temp进行异或。对轮常数的定义为:Rconi = (Rci,00,00,00)而Rci表示在有限域GF(28)中xi-1的值,即:Rci = 1 (即01)Rci=x·(Rci-1) = xi-1二关键代码/先将密钥数组的元素值存储在
12、3维数组中,然后对其扩展,扩展方式氛围两种,条件是Ki是否是4的倍数,两种密钥方式不同,复杂的是当为4的倍数时,要进行生成Ti-1,先是行移位,然后是进入S盒字节替代,最后与轮常数异或得到,再将此T与Ki-4异或void KeyExpansion(unsigned char *Key,unsigned charExpandKey44) unsigned char RC = 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36; /轮常数 int i,j,m,n;for(m=0;m<4;m+) for(n=0;n<4;n
13、+)ExpandKey0mn=Keyn*4+m; for(i=1;i<11;i+) for(j=0;j<4;j+)unsigned char Temp4; for(m=0; m<4; m+)Tempm = j ? ExpandKeyimj-1 : ExpandKeyi-1m3; /进行两种划分,先把密钥存在一个变量数组中,if(j = 0)unsigned char t = Temp0;for(m=0; m<3; m+)Tempm = SboxTemp(m+1)%4;Temp3 = Sboxt;Temp0 = RCi-1;for(m=0; m<4; m+) Exp
14、andKeyimj =ExpandKeyi-1mj Tempm; / 4.2、加密加密流程图:4.2.1、字节代替(SubBytes)一AES定义了一个S盒,State中每个字节按照如下方式映射为一个新的字节:把该字节的高4位作为行值,低4位作为列值,然后取出S盒中对应行和列的元素作为输出。例如,十六进制数84。对应S盒的行是8列是4,S盒中该位置对应的值是5F。S盒是一个由16x16字节组成的矩阵,包含了8位值所能表达的256种可能的变换。S盒按照以下方式构造:(1) 逐行按照升序排列的字节值初始化S盒。第一行是00,01,02,OF;第二行是10,l1,1F等。在行X和列Y的字节值是xy。
15、(2) 把S盒中的每个字节映射为它在有限域GF()中的逆。GF代表伽罗瓦域,GF()由一组从0x00到0xff的256个值组成,加上加法和乘法。00被映射为它自身00。(3) 把S盒中的每个字节记成。对S盒中每个字节的每位做如下变换:上式中是指值为63字节C第i位,即。 符号()表示更新后的变量的值。AES用以下的矩阵方式描述了这个变换:最后完成的效果如图:二关键代码 直接采取让4x4矩阵的值进入S盒,这是因为数组元素的要求前四位作为行数,后四位作为列数,而元素值刚好是16进制表示形如:AB,元素的值=A*16+B,这个刚好就是S盒的位置,void SubBytes(unsigned char
16、 State4) int i,j; for(i=0; i<4; i+) for(j=0; j<4; j+) Stateij = SboxStateij; 4.2.2、行移位(ShiftRows)一State的第一行字节保持不变,State的第二行字节循环左移一个字节,State的第三行字节循环左移两个字节,State的第四行循环左移三个字节。行移位左偏移量:变化如图2所示。二关键代码void ShiftRows(unsigned char State4) /采用最原始的办法,以分别为0.1.2.3字节 unsigned char k; k=State10; State10=Stat
17、e11; State11=State12; State12=State13; State13=k; k=State21; State21=State23;State23=k;k=State20;State20=State22;State22=k; k=State33;State33=State32;State32=State31;State31=State30;State30=k;4.2.3、列混合(MixColumn)一列混合变换是一个替代操作,是AES最具技巧性的部分。它只在AES的第0,1,Nr一1轮中使用,在第N r轮中不使用该变换。乘积矩阵中的每个元素都是一行和一列对应元素的乘积之和
18、。在MixColumns变换中,乘法和加法都是定义在GF()上的。State的每一列 () 1=0,,3;J=0,被理解为 GF()上的多项式,该多项式与常数多项式相乘并模约化。这个运算需要做GF()上的乘法。但由于所乘的因子是三个固定的元素02、03、01,所以这些乘法运算仍然是比较简单的(注意到乘法运算所使用的模多项式为)。设一个字节为b=(b7b6b5b4b3b2b1b0),则b×01=b; b×02=(b6b5b4b3b2b1b00)+(000b7b70b7b7); b×03=b×01+b×02。(请注意,加法为取模2的加法,即逐比特异
19、或)写成矩阵形式为:最后完成的效果如图:二关键代码/其中调用小函数xtime,根据02乘法原理编写,最后03乘是在02乘的基础上进行了03=(21+1 ),同理进行一次02乘,在与本省异或void MixColumns(unsigned char State4) unsigned char output44;int i, j; for(j=0; j< 4; j+) for(i=0; i<4; i+) outputij = xtime(Statei%4j) /0x02乘法 ( State ( i + 1 ) % 4j xtime( State ( i + 1 ) % 4j ) ) /
20、0x03乘法 State ( i + 2 ) % 4j /0x01乘法 State ( i + 3 ) % 4j; /0x01乘法 for(i=0; i<4; i+) for(j=0; j< 4; j+)Stateij=outputij; 02乘法函数:unsigned char xtime (unsigned char input) int temp; temp = input<<1; if(input & 0x80) temp = 0x1b; return temp; 4.2.4、轮密钥加(AddRoundKey)一Add RoundKey称为轮密钥加变换,
21、128位的State按位与 128位的密钥XOR:对 j=0, ,L-1 轮密钥加变换很简单,却影响了 State中的每一位。密钥扩展的复杂性和 AES的其他阶段运算的复杂性,却确保了该算法的安全性。最后完成的效果如图:二关键代码void AddRoundKey(unsigned char State4,unsigned char Key4) int i,j;for(i=0;i<4;i+)for(j=0;j<4;j+)Stateji=Keyji;4.2.5、加密主函数关键代码/根据加密函数流程图,进行架构加密主函数,参数分别是一个密钥数组,一个明文分组进入,参与运算,其中密钥一进入
22、就进入密钥扩展,为以后的加密产生密钥,void Encryption(unsigned char input16,unsigned char Key16) KeyExpansion(Key,ExpandKey); unsigned char State44; int i,j,k; for(i=0; i<4; i+) for(j=0; j<4 ;j+) Stateij= input4*j+i; AddRoundKey(State,ExpandKey0); for(i=1; i<=10; i+) SubBytes(State); ShiftRows(State); if(i!=1
23、0)MixColumns(State); AddRoundKey(State,ExpandKeyi); if(i>=9) printf("n第%d轮加密密钥矩阵为:n",i); int m,n; for(m=0;m<4;m+) for(n=0;n<4;n+) printf("%X,",ExpandKeyinm); printf("n"); printf("第%d轮加密出的密文为:",i); for(m=0;m<4;m+) for(n=0;n<4;n+) printf("%X,
24、",Statenm); printf("n"); for(j=0; j<4; j+) for(k=0; k<4 ;k+)input4*k+j=Statejk; 4.3、解密解密流程:4.3.1、逆字节替代(InvSubBytes)关键代码与字节代替类似,逆字节代替基于逆S盒实现。直接进图逆S盒,原理很简单,与字节替代相同,只是盒子不同void InvSubBytes(unsigned char State4) int i,j; for(i=0; i<4; i+) for(j=0; j<4; j+) Stateij = InvSboxStat
25、eij; 4.3.2、逆行移位(InvShiftRows)关键代码/与加密时的行移位区别在于移位方向相反。即向右移动void InvShiftRows(unsigned char State4) char k;k=State13; State13=State12;State12=State11;State11=State10;State10=k;k=State23; State23=State21; State21=k;k=State22;State22=State20;State20=k;k=State30; State30=State31;State31=State32;State32=S
26、tate33;State33=k;4.3.3、逆列混合(InvMixCloumns)关键代码/逆列混合操作与列混合一样,只是多项式d(x)不同,因而可以表示为矩阵相乘来实现,输入矩阵与固定矩阵(十六进制)相乘, void InvMixColumns(unsigned char State4) unsigned char output44; int i, j; for(j=0; j< 4; j+) for(i=0; i<4; i+) outputij = (xtime(xtime(xtime(Statei % 4j) xtime(xtime(Statei % 4j)xtime(Sta
27、tei % 4j) /0x0E=14乘法 (xtime(xtime(xtime(State ( i + 1 ) % 4j) xtime(State ( i + 1 ) % 4j) State ( i + 1 ) % 4j) /0x0B=11乘法 (xtime(xtime(xtime(State ( i + 2 ) % 4j) xtime(xtime(State ( i + 2 ) % 4j) State ( i + 2 ) % 4j) /0x0D=13乘法 (xtime(xtime(xtime(State ( i + 3 ) % 4j) State ( i + 3 ) % 4j); /0x09
28、乘法 for(i=0; i<4; i+) for(j=0; j< 4; j+)Stateij=outputij; 4.3.4、轮密钥加(AddRoundKey)与加密完全相同4.3.5、解密主函数关键代码/与加密函数不同的是,过程相反,根据流程图构造解密主函数,轮数相同,由于是AES本质是对称函数,所以是相反的而已void InvEncryption(unsigned char input16,unsigned char Key16) int i,j,k;KeyExpansion(Key,ExpandKey);unsigned char State44; for(j=0; j<
29、;4; j+) for(k=0; k<4 ;k+) Statejk = inputk*4+j; AddRoundKey(State,ExpandKey10); for(i=9; i>=0; i-) InvShiftRows(State);InvSubBytes(State); AddRoundKey(State, ExpandKeyi);if(i)InvMixColumns(State);if(i<=1) /* 输出最后解密两轮密钥和密文 */ printf("n第%d轮密钥矩阵为:n",10-i); int m,n; for(m=0;m<4;m+)
30、 for(n=0;n<4;n+) printf("%X,",ExpandKeyinm); printf("n"); printf("第%d轮解密出的消息为:",10-i); for(m=0;m<4;m+) for(n=0;n<4;n+) printf("%X,",Statenm); printf("n"); printf("n最后解密出的明文消息为:"); for(int m=0;m<4;m+) for(int n=0;n<4;n+) print
31、f("%c ",Statenm); printf("n");for(j=0;j<4;j+) for(k=0; k<4 ;k+) inputk*4+j = Statejk; 5.测试报告由于加密解密分两种方式,一种是由键盘输入进行加密解密。另一种是文件读入加密解密5.1主界面根据数字选择使用软件,下面分开测试:5.2测试键盘输入明文和密钥加密键盘输入1,选择加密,并输入:IloveYouYouKnow? 共计16个字符,再任意输入16字符的密钥,为方便起见,测试时,输入为11111111111111111,最后加密成功之后输出中间密钥与密文状态其中最后加密密文为:A1,00,E9,BD,13,9A,CC,51,76,6A,3F,B8,AA,34,6A,C5.3测试键盘输入密文和密钥加密选择3,进入解密界面。为测试是否成功加密,采用上次加密时的密文进行输入,如图结果说明加密解密是成功的。5.3测试文件输入明文和密钥加密/选择2进入文件加密界面,输入保存有明文的文件名:Mingwen.txt.密钥文件名:Key.txt 输出到空文件State.txt中进行保存5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 清洁处理承包合同协议书
- 渠道承包合同协议书模板
- 渣土车司机劳务合同范本
- 网上买卖设备的合同范本
- 电力产权分界协议协议书
- 湖北省劳动合同补充协议
- 艺人与酒吧合作合同范本
- 材料未签合同的进场协议
- 电梯维修安全协议书合同
- 签了合作协议不履行合同
- 快乐读书吧《人类起源的故事:爷爷的爷爷哪里来》导读课课件【知识精研】四年级语文下册统编版
- 三级教育培训试题及答案
- 物业工程考核管理办法
- 学生资助推动一站式学生社区建设研究
- 河南省郑州市2024-2025学年高一下期期末考试数学试卷
- 怀旧庙会活动方案
- 精密空调原理培训
- GB/T 33804-2025肥料级腐植酸钾
- 2025至2030中国精酿啤酒行业深度产业运行态势及投资规划深度研究报告
- 2025年山东中考语文试卷真题解读及复习备考指导
- 糖尿病酮症酸中毒护理问题和措施讲课件
评论
0/150
提交评论