密码学课程方案AES加密解密文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
个人资料整理仅限学习使用
成都信息工程学院课程设计报告
AES加密解密的实现
课程名称:应用密码算法程序设计
学生姓名:
学生学号:
专业班级:
任课教师:
年月日
个人资料整理仅限学习使用
附件:课程设计成绩评价表
个人资料整理仅限学习使用目录
1.背景
AES,密码学中的高级加密标准 密钥大小。 该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael之命名之,投稿高级加密标准的甄选流程。 2.系统设计 2.1系统主要目标 基本要求部分: 1.在深入理解AES加密/解密算法理论的基础上,设计一个AES加密/解密软件系统;2.完成一个明文分组的加解密,明文和密钥是十六进制,长度都为64比特<16个16进制数),输入明文和密钥,输出密文,进行加密后,能够进行正确的解密; 3.程序运行时,要求输出每一轮使用的密钥,以及每一轮加密或解密之后的16进制表示的值; 4.要求提供所设计系统的报告及完整的软件。 较高要求部分: 1.如果明文不止一个分组,程序能完成分组,然后加密;最后一个分组长度不足时要求完成填充;密钥长度不足时能进行填充,过长则自动截取前面部分。 2.密钥采用ASCII码,明文要求输入信息可以是文字<可以是汉字或英文,信息量要求不止一个加密分组长度),任意字符,或者是文本文档,或者普通文件。进行加密后,能够进行正确的解密; 3.程序代码有比较好的结构,模块划分合理,如用类进行封装,通过调用类的成员函数实现加密解密功能,函数的参数及返回值设置合理等; 4.界面友好,程序实现有新意。 2.2主要软件需求<运行环境) 本软件适用VC语言编写,编译成功后的EXE文件可以在装有windows系统的任何计算机上使用。 测试平台:Windows XP Professional 使用软件:Visual C++ 6.0 2.3功能模块与系统结构 主要功能模块如下: 2.行移位ShiftRow 3.列混合MixColumn 4.轮密钥加AddRoundKey 5.逆字节替换 通过逆S盒的映射变换得到 6.逆行移位InvShiftRow 与加密时的行移位区别在于移位方向相反。 7.逆列混淆 加密与解密系统流程图如下所示, 3 系统功能程序设计 3.1基本要求部分 3.1.1字节替换 SubBytes<)变换是一个基于S 盒的非线性置换,它用于将输入或中间态的每一个字节通过一个简单的查表操作,将其映射为另一个字节。映射方法是把输入字节的高四位作为S 盒的行值,低四位作为列值,然后取出S 盒中对应的行和列的元素作为输出。unsigned char subbytes(unsigned char state[4][4]> {printf("after subbyte:\n">。 //取出中间态state 映射到S 盒中的值赋给中间态state for(i=0。i<4。i++> 1 {for(j=0。j<4。j++> state[i][j]=sbox[state[i][j]]。 } for(i=0。i<4。i++> //输出到屏幕显示state {for(j=0。j<4。j++> printf("\t\t%02x ",state[i][j]>。 printf("\n">。 } printf("\n">。 return 0。 } 3.1.2行移位 ShiftRows<)完成基于行的循环移位操作,变换方法是第0行不动,第一行循环左移一个字节,第二位循环左移两个字节,第三行循环左移三个字节。 unsigned char shiftrows(unsigned char state[4][4]> {printf("after shiftrows:\n">。 // 在中间态的行上, k=state[1][0]。 // 第0行不变 state[1][0]=state[1][1]。 // 第一行循环左移一个字节 state[1][1]=state[1][2]。 // 第二行循环左移两个字节 state[1][2]=state[1][3]。 // 第三行循环左移三个字节 state[1][3]=k。 k=state[2][0]。 state[2][0]=state[2][2]。 state[2][2]=k。 k=state[2][1]。 state[2][1]=state[2][3]。 state[2][3]=k。 k=state[3][0]。 state[3][0]=state[3][3]。 state[3][3]=state[3][2]。 state[3][2]=state[3][1]。 state[3][1]=k。 for(i=0。i<4。i++> //输出到屏幕显示state {for(j=0。j<4。j++> printf("\t\t%02x ",state[i][j]>。 printf("\n">。 } printf("\n">。 return 0。 } 3.1.3列混合 MixColumns<)实现逐列混合,方法是s’(x>=c(x>*s(x>mod(x^4+1>