




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 西北工业大学 专业课程设计 题目:_ AES加解密软件_ 学院_ _ 专业_信息安全专业_ 学号_ _ 姓名_ _ _ 2014年07月0213日一、 目的AES(Rijndael)密码算法属于对称密码算法,支持128、192或256位密钥,适合批量数据的加解密,是DES、3DES的替代算法,可广泛应用于数据加密存储和网络安全传输应用中,试用C/C+语言(核心代码可用汇编语言)实现支持各种密钥长度的AES算法,对其进行测试和设计优化;在此基础上,使其能够对任何类型的文件进行加密,生成密文文件,也能对指定的密文文件进行解密,得到加密前的明文文件。二、 要求1、 用C/C+语言实现AES算法,支
2、持128、192或256位密钥,具有通用性;2、 用标准测试向量测试密码算法实现的正确性;3、 编写对文件进行加解密的接口函数;4、 用不同大小和类型的文件测试密码算法的功能和性能;5、 进行优化设计,使其对批量数据的加解密速度尽可能快。三、 设计1 方法(算法)原理及描述1) AES是一个迭代的、对称密钥分组的密码,它可以使用128、192和256位密钥,并且用128位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations)和
3、替换(substitutions)输入数据。2) AES加密算法包括字节替换SubBytes()、行移位ShiftRows0、列混合MixColumns0和密钥加AddRoundKey()等函数。本文只研究分组长度和密钥长度均为128位的情况,记做AES一128。AES一128算法对状态矩阵进行操作。状态矩阵是128位数据按列优先原则排列的4x4矩阵,矩阵中的每一个元素为一个字节。AES一128算法要进行10轮轮变换,加密时轮变换主要有字节替换SubBytes()、行移位ShiftRows0、列混合MixColumns0和密钥加AddRoundKey()运算。对于每次轮变换,AES算法需要一个
4、轮密钥,该轮密钥由初始密钥经密钥扩展函数生成。3) AES算法设计原理简述l GF()中乘法使用的多项式是8次不可约多项式列表中的第一个多项式。ByteSubstitution(称为S盒)在设计时考虑到抵抗差分密码分析、线性密码分析的要求,应满足以下条件:a) 可逆性; 、b) 输入比特的线性组合与输出比特的组合之间的最大非平凡相关性的极小化;c) 异或差分表中最大非平凡值的极小化;d) GF()中代数表示的复杂性; e) 描述的简单性。满足前3条准则的S盒的构造方法已被给出,AES的作者从众多候选构造中选择将x映射到它的逆的S盒。该映射过于简单,为了抵抗插入攻击,加入仿射变换:模数多项式选择
5、为可能是最简单的模数多项式。可以找到其它的S盒满足以上准则。l MixColumn变换符合以下准则: a) 可逆性; b) GF()中的线性性; c) 适当的扩散性能;d) 8位处理器上实现速度快;e) 对称性;f) 描述的简单性。选择模数多项式可满足准则2、5、6。准则1、3、4要求系数的值要小,故选00、01、02 、 03。l ByteRotation符合以下准则:a) 4个位移量互不相同且;b) 能抵抗差分截断攻击;c) 能抗Square攻击; d) 简单。从满足准则2和准则3出发,AES的作者选取了最简单的组合。2 软件程序(程序流程、设计程序及分析)1) AES算法框架描述AES算
6、法是一个可变数据块长和可变密钥长的分组迭代加密算法,数据块长和密钥长可分别为128,192或256比特,但为了满足AES的要求,分组长度为128比特,密钥长度为128,192或256比特。AES密码算法采用的是代替一置换网络(SPN)结构,每一轮操作由4层组成:第1层(字节替换)为非线性层,用S盒对每一轮中的单个字节分别进行替换;第2层(行移位)和第3层(列混合)是线性混合层,对当前的状态阵按行移位,按列混合;第4层(密钥加层)用子密钥与当前状态阵进行字节上的异或。具体算法结构如图1所示。图1中,(a)图给出了算法的整体结构,输入明文x与子密钥I(0异或,然后经过r轮迭代最终生成密文Y,其中第
7、1到r一1轮迭代结构为图(b),第r轮与前面各轮稍微有点不同,缺少混合层。2) 加密与解密系统流程图3) 程序设计模块代码a) 密钥扩展通过生成器产生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(i=4;i8;i+) if(i%4=0) rotword0=w1i-1; rotword1=w2i-1
8、; 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(after Rcon():); for(j=0;j4;j+) printf(%02x ,rconj);
9、 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:n);for(i=0;i4;i+)for(j=0;j4;j+)printf(tt%02x ,wij)
10、;printf(n);printf(n);b) 字节替换SubBytes()变换是一个基于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
11、;i4;i+) /输出到屏幕显示statefor(j=0;j4;j+)printf(tt%02x ,stateij); printf(n);printf(n); return 0; c) 行移位ShiftRows()完成基于行的循环移位操作,变换方法是第0行不动,第一行循环左移一个字节,第二位循环左移两个字节,第三行循环左移三个字节。unsigned char shiftrows(unsigned char state44) printf(after shiftrows:n); / 在中间态的行上, k=state10; / 第0行不变 state10=state11; / 第一行循环左移一个
12、字节 state11=state12; / 第二行循环左移两个字节 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
13、(n); printf(n); return 0; d) 列混合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 sta
14、te3i ; temp1 = state0i state1i ; 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;
15、i+) /输出到屏幕显示statefor(j=0;j4;j+)printf(tt%02x ,stateij); printf(n); printf(n);return 0;e) 轮密钥加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+) /
16、完了又赋值给statefor(j=0;j4;j+)stateij=wij;for(i=0;i4;i+) /输出到屏幕显示出来statefor(j=0;j4;j+)printf(tt%02x ,stateij);printf(n);printf(n); return 0; f) 逆字节替换与字节代替类似,逆字节代替基于逆S盒实现。unsigned char InvSubbytes(unsigned char state44) for(i=0;i4;i+) /基于逆S盒的映射替代 for(j=0;j4;j+) stateij = rsboxstateij; printf(after InvSubb
17、yte:n); for(i=0;i4;i+)for(j=0;j4;j+) /输出到屏幕显示stateprintf(tt%02x ,stateij); printf(n);printf(n);return 0;g) 逆列混合逆列混淆的处理办法与MixColumns()类似,每一列都通过与一个固定的多项式d(x)相乘进行交换。unsigned char InvMixColumns(unsigned char state44)printf(after InvMixColumns :n); /实现(0e 0b 0d 09)与中间态state分别相乘后异或得相应值 for(i=0;i4;i+) / (0
18、9 0e 0b 0d) temp0 = state0i; / (0d 09 0e 0b) temp1 = state1i; / (0b 0d 09 0e) temp2 = state2i; temp3 = 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(temp
19、3, 0x0d); state2i = Multiply(temp0, 0x0d) Multiply(temp1, 0x09) Multiply(temp2, 0x0e) Multiply(temp3, 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
20、 0;h) 加密变换加密部分我分了两种情况,一种是自动检查加密程序的正确性,之前在程序里给明文和密钥赋上初值,运行程序检验结果是否正确;另一种是用户手动输入32位的十六进制数,进行加密,我是把每一具体项模块化,将功能在每个具体模块中实现,只需要直接调用,视觉效果强,一目了然。 下面是实现加密功能一些关键代码void AES_encrypt(unsigned char StateN, unsigned char RoundKeyN)message16=0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,0x31,0x31,0x98,0xa2,0xe0,0x37,0x0
21、7,0x34;key16=0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c; for(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);keyexp
22、and(w, round);addroundkey(state,w);subbytes(state); /最后一轮shiftrows(state);keyexpand(w, 10);addroundkey(state,w);i) 解密变换AES解密我也是分成了两个部分,第一部分是在程序中对密文和密钥赋初值,通过与标准对照检查解密过程的正确性;第二部分是用户手动输入密文和密钥,程序对其进行解密,得到最后的明文。解密过程基本如下:1)获取输入的明文和密钥 2)通过密钥扩展过程获取各轮密钥 3)轮密钥加变换过程 4)逆行移位 5)逆字节替代 6)轮密钥加变换 7)逆列混淆47步共9次循环,最后一轮实
23、现46步,完成解密过程。主要代码如下:void AES_decrypt(unsigned char StateN, unsigned char wN)key16=0x2b,0x7e,0x15,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;
24、i+) for(j=0;j 0; i -)/1-9轮 InvShiftRows(state);InvSubbytes(state);Keyexpand(w,round );AddRoundKey(State, w); InvMixColumns(State);InvShiftRows(State); /最后一轮InvSubBytes(State); Keyexpand(w,0 );AddRoundKey(State, w);四、 调试(调试过程、测试方法、数据、结果、讨论)为检验程序的正确性,需要将结果与标准相对照。参照计算机密码学教材中的AES运行程序的运行结果,与我的运行结果对照如下: 下
25、面是我的运行界面: 上面的是标准,接着的是我的运行测试,下面的是我从终端中复制的过程:密钥扩展 Round key: ef a8 b6 db 44 52 71 0b a5 5b 25 ad 41 7f 3b 00addroundkey 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 b
26、a 53after mixcolumns: 25 bd b6 4c d1 11 3a 4c a9 d1 33 c0 ad 68 8e b0after keyexpand:rotword():0b ad 00 dbsubword():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
27、 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 feafter 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
28、 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 11 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 sh
29、iftrows: 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 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 subbyte: 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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年酱香型白酒 项目合作计划书
- 出差安全协议书范本
- 宠物赠与免责协议书范本
- 2025年稳相微波射频同轴电缆项目发展计划
- 校园接送安全协议书范本
- 汽修授权协议书范本
- 突发疾病的防治课件
- 2025年铝压延加工材合作协议书
- 空难急救知识培训课件
- 空调工程施工图识图课件
- 校长选拔试题及答案
- 社区网格化管理工作手册
- 陕西商洛“7·19”高速公路桥梁垮塌灾害调查评估报告学习及警示教育
- 医院保安服务投标方案(技术方案)
- 2025年海南会考试题及答案地理
- 【高考真题】2023年高考理综物理真题试卷-全国甲卷(含答案)
- 2025慢性阻塞性肺病(GOLD)指南更新要点解读课件
- 智能小区业主委员会职责与科技应用
- 2025年上半年湖北黄冈黄梅县乡镇综合执法中心招聘工作人员15人易考易错模拟试题(共500题)试卷后附参考答案
- 招标代理机构选取突发情况应急处理预案
- 2025版家族信托遗产分配与管理执行合同3篇
评论
0/150
提交评论