密码学课程设计AES加密解密文档

上传人:r****d 文档编号:123986009 上传时间:2022-07-23 格式:DOC 页数:24 大小:296KB
收藏 版权申诉 举报 下载
密码学课程设计AES加密解密文档_第1页
第1页 / 共24页
密码学课程设计AES加密解密文档_第2页
第2页 / 共24页
密码学课程设计AES加密解密文档_第3页
第3页 / 共24页
资源描述:

《密码学课程设计AES加密解密文档》由会员分享,可在线阅读,更多相关《密码学课程设计AES加密解密文档(24页珍藏版)》请在装配图网上搜索。

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

2、17151310设计创新1098764答辩效果302825221915答辩小组成员签名答辩小组组长签名: 年 月 日课程设计成绩评定表成绩汇总评分项目评分比例分数课程设计总分指导老师评分50%答辩小组评分50%目 录1 背景12.系统设计1系统主要目标1主要软件需求(运行环境)2功能模块与系统结构23 系统功能程序设计4基本要求部分43.1.1 字节替换4行移位5列混合6密钥加6密钥扩展7字节替换8行移位9列混合93.1.9 加密103.1.10 解密114. 测试报告125结论21参考文献211 背景AES,密码学中的高级加密标准(Advanced Encryption Standard,A

3、ES),又称 Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。AES 有一个固定的128位的块大小和128,192或256位大小的密钥大小。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄

4、选流程。(Rijdael的发音近于 Rhine doll。)AES在软体及硬件上都能快速地加解密,相对来说较易于实作,且只需要很少的记忆体。作为一个新的加密标准,目前正被部署应用到更广大的范围.2.系统设计2.1系统主要目标基本要求部分:1在深入理解AES加密/解密算法理论的基础上,设计一个AES加密/解密软件系统;2完成一个明文分组的加解密,明文和密钥是十六进制,长度都为64比特(16个16进制数),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密;3. 程序运行时,要求输出每一轮使用的密钥,以及每一轮加密或解密之后的16进制表示的值;4. 要求提供所设计系统的报告及完整的软件。较高

5、要求部分:1.如果明文不止一个分组,程序能完成分组,然后加密;最后一个分组长度不足时要求完成填充;密钥长度不足时能进行填充,过长则自动截取前面部分。2.密钥采用ASCII码,明文要求输入信息可以是文字(可以是汉字或英文,信息量要求不止一个加密分组长度),任意字符,或者是文本文档,或者普通文件。进行加密后,能够进行正确的解密;3.程序代码有比较好的结构,模块划分合理,如用类进行封装,通过调用类的成员函数实现加密解密功能,函数的参数及返回值设置合理等;4.界面友好,程序实现有新意。 2.2主要软件需求(运行环境)本软件适用VC语言编写,编译成功后的EXE文件可以在装有windows系统的任何计算机

6、上使用。测试平台:Windows XP Professional2.3功能模块与系统结构主要功能模块如下:1. 字节替换SubByteA0,0A0,1A0,2A0,3A1,0A1,1A1,2A1,3A2,0A2,1A2,2A2,3A3,0A3,1A3,2A3,3B0,0B0,1B0,2B0,3B1,0B1,1B1,2B1,3B2,0B2,1B2,2B2,3B3,0B3,1B3,2B3,3(S盒)1.取逆2.仿射变换 2. 行移位ShiftRow 通过逆S盒的映射变换得到与加密时的行移位区别在于移位方向相反。加密与解密系统流程图如下所示,3 系统功能程序设计 基本要求部分.1 字节替换SubBy

7、tes()变换是一个基于S盒的非线性置换,它用于将输入或中间态的每一个字节通过一个简单的查表操作,将其映射为另一个字节。映射方法是把输入字节的高四位作为S盒的行值,低四位作为列值,然后取出S盒中对应的行和列的元素作为输出。unsigned char subbytes(unsigned char state44) printf(after subbyte:n); /取出中间态state映射到S盒中的值赋给中间态statefor(i=0;i4;i+)for(j=0;j4;j+)stateij=sboxstateij; for(i=0;i4;i+) /输出到屏幕显示statefor(j=0;j4;j

8、+)printf(tt%02x ,stateij); printf(n);printf(n); return 0; 3.1.2行移位ShiftRows()完成基于行的循环移位操作,变换方法是第0行不动,第一行循环左移一个字节,第二位循环左移两个字节,第三行循环左移三个字节。unsigned char shiftrows(unsigned char state44) printf(after shiftrows:n); / 在中间态的行上, k=state10; / 第0行不变 state10=state11; / 第一行循环左移一个字节 state11=state12; / 第二行循环左移两个

9、字节 state12=state13; / 第三行循环左移三个字节 state13=k; k=state20; state20=state22; state22=k; k=state21; state21=state23; state23=k; k=state30; state30=state33; state33=state32; state32=state31; state31=k; for(i=0;i4;i+) /输出到屏幕显示statefor(j=0;j4;j+)printf(tt%02x ,stateij); printf(n); printf(n); return 0; 3.1.3

10、列混合MixColumns()实现逐列混合,方法是s(x)=c(x)*s(x)mod(x4+1)unsigned char mixcolumns(unsigned char state44) printf(after mixcolumns:n);/ 实现 (02 03 01 01) 与中间态state分别相乘后异或得相应值for(i=0;i4;i+) / (01 02 03 01) / (01 01 02 03) k=state0i; / (03 01 01 02) temp0 = state0i state1i state2i state3i ; temp1 = state0i state1

11、i ; temp1 = xtime(temp1); state0i = temp1 temp0 ; temp1 = state1i state2i ; temp1 = xtime(temp1); state1i = temp1 temp0 ; temp1 = state2i state3i ; temp1 = xtime(temp1); state2i = temp1 temp0 ; temp1 = state3i k ; temp1 = xtime(temp1); state3i = temp1 temp0 ; for(i=0;i4;i+) /输出到屏幕显示statefor(j=0;j4;j

12、+)printf(tt%02x ,stateij); printf(n); printf(n);return 0;3.1.4轮密钥加AddRoundKey()用于将输入或中间态S的每一列与一个密钥字ki进行按位异或,每一个轮密钥由Nb个字组成。unsigned char addroundkey(unsigned char state44,unsigned char w44)printf(addroundkey %d:n,round+); /将中间态state中的每一列与一个密钥字(w44中的一列)进行按位异或for(i=0;i4;i+) /完了又赋值给statefor(j=0;j4;j+)st

13、ateij=wij;for(i=0;i4;i+) /输出到屏幕显示出来statefor(j=0;j4;j+)printf(tt%02x ,stateij);printf(n);printf(n); return 0; 3.1.5密钥扩展 通过生成器产生Nr+1个轮密钥,每个轮密钥由Nb个字组成,共有Nb(Nr+1)个字。在加密过程中,需要Nr+1个轮密钥,需要构造4(Nr+1)个32位字。首先将输入的4个字节直接复制到扩展密钥数组的前4个字中,得到W0,W1,W2,W3;然后每次用4个字填充扩展密钥数余下的部分。/keyexpand printf(after keyexpand:n);for(

14、i=4;i8;i+) if(i%4=0) rotword0=w1i-1; rotword1=w2i-1; rotword2=w3i-1; rotword3=w0i-1; printf(rotword():); for(j=0;j4;j+) printf(%02x ,rotwordj); for(j=0;j4;j+) subwordj=sboxrotwordj; printf(nsubword():); for(j=0;j4;j+) printf(%02x ,subwordj); printf(nn); for(j=0;j4;j+) rconj=subwordj RconNj ; printf(

15、after Rcon():); for(j=0;j4;j+) printf(%02x ,rconj); printf(nn);for(j=0;j4;j+) wji%4=rconj wji-4 ;printf(w%d :,count);for(j=0;j4;j+) printf( %02x ,wji%4) ; count+; else for(j=0;j4;j+)wji%4=wji%4wj(i%4)-1;printf(w%d :,count);for(j=0;j4;j+) printf( %02x ,wji%4); count+; printf(nn);printf(密钥扩展 Round key

16、:n);for(i=0;i4;i+)for(j=0;j4;j+)printf(tt%02x ,wij);printf(n);printf(n);3.1.6逆字节替换与字节代替类似,逆字节代替基于逆S盒实现。unsigned char InvSubbytes(unsigned char state44) for(i=0;i4;i+) /基于逆S盒的映射替代 for(j=0;j4;j+) stateij = rsboxstateij; printf(after InvSubbyte:n); for(i=0;i4;i+)for(j=0;j4;j+) /输出到屏幕显示stateprintf(tt%02

17、x ,stateij); printf(n);printf(n);return 0;3.1.7逆行移位与行移位相反,逆行移位将态state的后三行按相反的方向进行移位操作,即第0行保持不变,第1行循环向右移一个字节,第2行循环向右移动两个字节,第3行循环向右移动三个字节。unsigned char InvShiftRows(unsigned char state44) k=state13; state13=state12; /对中间态state进行移位操作 state12=state11; / 第0行保持不变 state11=state10; / 第1行循环右移一个字节 state10=k;

18、/ 第2行循环右移两个字节 / 第3行循环右移三个字节 k=state20; state20=state22; state22=k; k=state21; state21=state23; state23=k; k=state30; state30=state31; state31=state32; state32=state33; state33=k;printf(after InvShiftRows:n);for(i=0;i4;i+) /输出到屏幕显示statefor(j=0;j4;j+)printf(tt%02x ,stateij); printf(n); printf(n); retu

19、rn 0;3.1.8逆列混合逆列混淆的处理办法与MixColumns()类似,每一列都通过与一个固定的多项式d(x)相乘进行交换。unsigned char InvMixColumns(unsigned char state44)printf(after InvMixColumns :n); /实现(0e 0b 0d 09)与中间态state分别相乘后异或得相应值 for(i=0;i4;i+) / (09 0e 0b 0d) temp0 = state0i; / (0d 09 0e 0b) temp1 = state1i; / (0b 0d 09 0e) temp2 = state2i; te

20、mp3 = state3i; state0i = Multiply(temp0, 0x0e) Multiply(temp1, 0x0b) Multiply(temp2, 0x0d) Multiply(temp3, 0x09); state1i = Multiply(temp0, 0x09) Multiply(temp1, 0x0e) Multiply(temp2, 0x0b) Multiply(temp3, 0x0d); state2i = Multiply(temp0, 0x0d) Multiply(temp1, 0x09) Multiply(temp2, 0x0e) Multiply(te

21、mp3, 0x0b); state3i = Multiply(temp0, 0x0b) Multiply(temp1, 0x0d) Multiply(temp2, 0x09) Multiply(temp3, 0x0e); for(i=0;i4;i+) /输出到屏幕显示statefor(j=0;j4;j+)printf(tt%02x ,stateij);printf(n);printf(n);return 0;3.1.9 加密加密部分我分了两种情况,一种是自动检查加密程序的正确性,之前在程序里给明文和密钥赋上初值,运行程序检验结果是否正确;另一种是用户手动输入32位的十六进制数,进行加密,我是把

22、每一具体项模块化,将功能在每个具体模块中实现,只需要直接调用,视觉效果强,一目了然。 下面是实现加密功能一些关键代码void AES_encrypt(unsigned char StateN, unsigned char RoundKeyN)message16=0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x37,0x07,0x34;key16=0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c; fo

23、r(i=0;i4;i+) for(j=0;j4;j+) / 分别获取明文和密钥 stateji=messagem;wji=keym;m+; .addroundkey(state,w);for(round=2;round11;round+)printf(第 %d 轮加密 : n,round);subbytes(state); shiftrows(state);mixcolumns(state);keyexpand(w, round);addroundkey(state,w);subbytes(state); /最后一轮shiftrows(state);keyexpand(w, 10);addro

24、undkey(state,w);3.1.10 解密AES解密我也是分成了两个部分,第一部分是在程序中对密文和密钥赋初值,通过与标准对照检查解密过程的正确性;第二部分是用户手动输入密文和密钥,程序对其进行解密,得到最后的明文。解密过程基本如下:1)获取输入的明文和密钥 2)通过密钥扩展过程获取各轮密钥 3)轮密钥加变换过程 4)逆行移位 5)逆字节替代 6)轮密钥加变换 7)逆列混淆47步共9次循环,最后一轮实现46步,完成解密过程。主要代码如下:void AES_decrypt(unsigned char StateN, unsigned char wN)key16=0x2b,0x7e,0x1

25、5,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c;cipher16=0x39,0x25,0x84,0x1d,0x02,0xdc,0x09,0xfb,0xdc,0x11,0x85,0x97,0x19,0x6a,0x0b,0x32;printf(%02x ,keyi);printf(n); /获取密文和密钥 for(i=0;i4;i+) for(j=0;j 0; i -)/1-9轮 InvShiftRows(state);InvSubbytes(state);Keyexpand(w,round );AddRound

26、Key(State, w); InvMixColumns(State);InvShiftRows(State); /最后一轮InvSubBytes(State); Keyexpand(w,0 );AddRoundKey(State, w);4. 测试报告 为检验程序的正确性,需要将结果与标准相对照。参照老师课件里的AES运行程序的运行结果,与我的运行结果对照如下: 下面是我的运行界面: 上面的是标准,接着的是我的运行测试,下面的是我从终端中复制的过程:密钥扩展 Round key: ef a8 b6 db 44 52 71 0b a5 5b 25 ad 41 7f 3b 00addroundk

27、ey 5 : e0 c8 d9 85 92 63 b1 b8 7f 63 35 be e8 c0 50 01第 6 轮加密 :after subbyte: e1 e8 35 97 4f fb c8 6c d2 fb 96 ae 9b ba 53 7cafter shiftrows: e1 e8 35 97 fb c8 6c 4f 96 ae d2 fb 7c 9b ba 53after mixcolumns: 25 bd b6 4c d1 11 3a 4c a9 d1 33 c0 ad 68 8e b0after keyexpand:rotword():0b ad 00 dbsubword()

28、:2b 95 63 b9after Rcon():3b 95 63 b9w20 : d4 d1 c6 f8w21 : 7c 83 9d 87w22 : ca f2 b8 bcw23 : 11 f9 15 bc密钥扩展 Round key: d4 7c ca 11 d1 83 f2 f9 c6 9d b8 15 f8 87 bc bcaddroundkey 6 : f1 c1 7c 5d 00 92 c8 b5 6f 4c 8b d5 55 ef 32 0c第 7 轮加密 :after subbyte: a1 78 10 4c 63 4f e8 d5 a8 29 3d 03 fc df 23 f

29、eafter shiftrows: a1 78 10 4c 4f e8 d5 63 3d 03 a8 29 fe fc df 23after mixcolumns: 4b 2c 33 37 86 4a 9d d2 8d 89 f4 18 6d 80 e8 d8after keyexpand:rotword():f9 15 bc 11subword():99 59 65 82after Rcon():b9 59 65 82w24 : 6d 88 a3 7aw25 : 11 0b 3e fdw26 : db f9 86 41w27 : ca 00 93 fd密钥扩展 Round key: 6d 1

30、1 db ca 88 0b f9 00 a3 3e 86 93 7a fd 41 fdaddroundkey 7 : 26 3d e8 fd 0e 41 64 d2 2e b7 72 8b 17 7d a9 25第 8 轮加密 :after subbyte: f7 27 9b 54 ab 83 43 b5 31 a9 40 3d f0 ff d3 3fafter shiftrows: f7 27 9b 54 83 43 b5 ab 40 3d 31 a9 3f f0 ff d3after mixcolumns: 14 46 27 34 15 16 46 2a b5 15 56 d8 bf ec

31、 d7 43after keyexpand:rotword():00 93 fd casubword():63 dc 54 74after Rcon():23 dc 54 74w28 : 4e 54 f7 0ew29 : 5f 5f c9 f3w30 : 84 a6 4f b2w31 : 4e a6 dc 4f密钥扩展 Round key: 4e 5f 84 4e 54 5f a6 a6 f7 c9 4f dc 0e f3 b2 4faddroundkey 8 : 5a 19 a3 7a 41 49 e0 8c 42 dc 19 04 b1 1f 65 0c第 9 轮加密 :after sub

32、byte: be d4 0a da 83 3b e1 64 2c 86 d4 f2 c8 c0 4d feafter shiftrows: be d4 0a da 3b e1 64 83 d4 f2 2c 86 fe c8 c0 4dafter mixcolumns: 00 b1 54 fa 51 c8 76 1b 2f 89 6d 99 d1 ff cd eaafter keyexpand:rotword():a6 dc 4f 4esubword():24 86 84 2fafter Rcon():a4 86 84 2fw32 : ea d2 73 21w33 : b5 8d ba d2w3

33、4 : 31 2b f5 60w35 : 7f 8d 29 2f密钥扩展 Round key: ea b5 31 7f d2 8d 2b 8d 73 ba f5 29 21 d2 60 2faddroundkey 9 : ea 04 65 85 83 45 5d 96 5c 33 98 b0 f0 2d ad c5第 10 轮加密 :after subbyte: 87 f2 4d 97 ec 6e 4c 90 4a c3 46 e7 8c d8 95 a6after shiftrows: 87 f2 4d 97 6e 4c 90 ec 46 e7 4a c3 a6 8c d8 95after mixcolumns: 47 40 a3 4c 37 d4 70 9f 94 e4 3a 42 ed a5 a6 bcafter keyexpand:rotword():8d 29 2f 7fsubword():5d a5 15 d2after Rcon():46 a5 15 d2w36 : ac 77 66 f3w37 : 19 fa dc 21w38 : 28 d1 29 41w39 : 57 5c 00 6e密钥扩展 Round key: ac 19 28 57 77

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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