基于C语言的AES加密系统

邱丑丑

发布日期: 2019-06-04 09:36:13 浏览量: 549
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一、课程设计功能简介

题目

对称算法AES的实现,在深入理解AES加密/解密算法理论的基础上,设计一个AES加密/解密软件系统。

功能要求

  • 编程实现算法的加密过程、解密过程和密钥生成过程

  • 完成一个明文分组的加密、解密,明文和密钥是ASCII码。进行加密后,能够进行正确的解密

  • 提供良好的用户界面,界面有有加密/解密选择、输入明文/密文栏、密钥栏、和加/解密结果显示栏

二、技术要求

运用所掌握的数据结构、以及编程语言对各种密码学算法进行分析和设计,加深学生对密码算法的理解,提高学生算法设计与分析的能力。提高学生在应用C语言、数据结构编写大型算法的能力。

三、软件模块设计流程

AES加密函数中,首先进行密钥扩展,然后把128位长度的字符串读进一个4*4的整数数组中,这个数组就是状态矩阵。例如,pArray[0][0] = S0,pArray[1][0] = S1, pArray[0][1] = S4。这个读取过程是通过 convertToIntArray()函数来实现的。每个轮操作的函数都对pArray进行修改,也就是对状态矩阵进行混淆。在执行完10轮加密后,会把pArray转换回字符串,再存入明文p的字符数组中,所以,在加密完后,明文p的字符串中的字符就是加密后的字符了。这个转换过程是通过convertArrayToStr()函数来实现的。

3.1 密钥扩展的实现

在开始加密前,必须先获得第一轮加密用到的密钥,故先实现密钥扩展。

下面是密钥扩展函数的实现,这个函数传入密钥key的字符串表示,然后从字符串中读取W[0]到W[3],函数getWordFromStr()用于实现此功能。读取后,就开始扩展密钥,当i是4的倍数的时候,就会调用T()函数来进行扩展,因为T函数的行为与加密的轮数有关,故要把加密的轮数 j 作为参数传进去。

3.2 字节代换的实现

字节代换的代码很简单,就是把状态矩阵中的每个元素传进getNumFromSBox()函数中,然后取得前面8位中的高4位作为行值,低4位作为列值,然后返回S[row][col],这里的S是储存S盒的数组。

3.3 行移位的实现

行移位的时候,首先把状态矩阵中第2,3,4行复制出来,然后对它们行进左移相应的位数,然后再复制回去状态矩阵array中。

3.4 列混合的实现

列混合函数中,先把状态矩阵初始状态复制一份到tempArray中,然后把tempArray与colM矩阵相乘,colM为存放要乘的常数矩阵的数组。其中的GFMul()函数定义了矩阵相乘时的乘法,加法则直接通过异或来实现。GFMul()通过调用乘以各个数对应的函数来实现乘法。例如,S1 2 刚通过调用GFMul2(S1)来实现。S1 3 刚通过GFMul3(S1)来实现。在这里,主要实现GFMul2()函数就行了,其它的都可以通过GFMul2()的组合来实现。举个例子吧,为计算下面这条等式,需要像下面这样调用函数:

  1. s = GFMul3(0xC9) ^ 0x7A ^ 0x63 ^ GFMul2(0xB0)

3.5 轮密钥加的实现

轮密钥加的实现很简单,就是根据传入的轮数来把状态矩阵与相应的W[i]异或运算。

AES解密过程,解密过程仍为10轮,每一轮的操作是加密操作的逆操作。由于AES的4个轮操作都是可逆的,因此,解密操作的一轮就是顺序执行逆行移位、逆字节代换、轮密钥加和逆列混合。同加密操作类似,最后一轮不执行逆列混合,在第1轮解密之前,要执行1次密钥加操作。

四、测试结果

五、总结

本次课程设计,让我获益匪浅,不仅更深入的了解密码学这门学科,整个设计过程是不断学习,不断发现问题、分析问题、解决问题的过程使我受益良多。设计期间有很多感触、想法,使自己有了继续探索的兴趣,对以后的学习、工作有很大的益处。

于个人而言,在程序设计的过程中,我深感“认真严谨”这个词的重要性,一点点小的马虎,便会导致整个程序不能正常运行。在今后的学习中,我定将“认真严谨”对待。总之,此次课程设计在我今后的学习生涯中起到了至关重要的作用。

上传的附件 cloud_download 密码学程序设计.7z ( 505.56kb, 5次下载 )
error_outline 下载需要11点积分

发送私信

精品资源尽在此

50
文章数
0
评论数
最近文章
eject