> # ♻️ 资源
> **大小:**507KB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100013213**](https://www.yuque.com/sxbn/ks/100013213)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/88244444**](https://download.csdn.net/download/s1t16/88244444)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
# 基于C语言的AES加密系统
# 一、课程设计功能简介
**题目**
对称算法AES的实现,在深入理解AES加密/解密算法理论的基础上,设计一个AES加密/解密软件系统。
**功能要求**
- 编程实现算法的加密过程、解密过程和密钥生成过程
- 完成一个明文分组的加密、解密,明文和密钥是ASCII码。进行加密后,能够进行正确的解密
- 提供良好的用户界面,界面有有加密/解密选择、输入明文/密文栏、密钥栏、和加/解密结果显示栏
# 二、技术要求
运用所掌握的数据结构、以及编程语言对各种密码学算法进行分析和设计,加深学生对密码算法的理解,提高学生算法设计与分析的能力。提高学生在应用C语言、数据结构编写大型算法的能力。
# 三、软件模块设计流程
![image.png](https://cdn.nlark.com/yuque/0/2023/png/2469055/1692762879468-56449918-bdf9-45c5-ad6f-e4f3532b1fe5.png#averageHue=%23fdfdfd&clientId=u8cb61bd8-3289-4&from=paste&height=280&id=ue9e688d9&originHeight=350&originWidth=864&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=106370&status=done&style=none&taskId=u6d8bba94-5f68-4d5d-8570-94862cb11fc&title=&width=691.2)
AES加密函数中,首先进行密钥扩展,然后把128位长度的字符串读进一个4*4的整数数组中,这个数组就是状态矩阵。例如,pArray[0][0] = S0,pArray[1][0] = S1, pArray[0][1] = S4。这个读取过程是通过 convertToIntArray()函数来实现的。每个轮操作的函数都对pArray进行修改,也就是对状态矩阵进行混淆。在执行完10轮加密后,会把pArray转换回字符串,再存入明文p的字符数组中,所以,在加密完后,明文p的字符串中的字符就是加密后的字符了。这个转换过程是通过convertArrayToStr()函数来实现的。
![image.png](https://cdn.nlark.com/yuque/0/2023/png/2469055/1692762899936-b01b2ba6-10c6-4c7e-850b-0cb40d2092e2.png#averageHue=%23fbfbfb&clientId=u8cb61bd8-3289-4&from=paste&height=1152&id=u812337a3&originHeight=1440&originWidth=865&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=315587&status=done&style=none&taskId=u3936c7b0-d04e-435c-8c1f-eef2301fe3e&title=&width=692)
## 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()的组合来实现。举个例子吧,为计算下面这条等式,需要像下面这样调用函数:
```
s = GFMul3(0xC9) ^ 0x7A ^ 0x63 ^ GFMul2(0xB0)
```
## 3.5 轮密钥加的实现
轮密钥加的实现很简单,就是根据传入的轮数来把状态矩阵与相应的W[i]异或运算。
![image.png](https://cdn.nlark.com/yuque/0/2023/png/2469055/1692762935023-52537b9e-1e9c-48e3-a52f-ed599f1da556.png#averageHue=%23fbfbfb&clientId=u8cb61bd8-3289-4&from=paste&height=1163&id=u5110ae27&originHeight=1454&originWidth=679&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=229054&status=done&style=none&taskId=u07e8bf4f-2e8f-48a7-bc08-a4bde55f96e&title=&width=543.2)
AES解密过程,解密过程仍为10轮,每一轮的操作是加密操作的逆操作。由于AES的4个轮操作都是可逆的,因此,解密操作的一轮就是顺序执行逆行移位、逆字节代换、轮密钥加和逆列混合。同加密操作类似,最后一轮不执行逆列混合,在第1轮解密之前,要执行1次密钥加操作。
# 四、测试结果
![image.png](https://cdn.nlark.com/yuque/0/2023/png/2469055/1692762995456-0ddc5fea-8cd5-4892-98d0-fdb9cf6377ef.png#averageHue=%231e1d1c&clientId=u8cb61bd8-3289-4&from=paste&height=444&id=u47cfce81&originHeight=555&originWidth=764&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=218933&status=done&style=none&taskId=u59ca9219-0d49-4247-8c51-d24e9d788fb&title=&width=611.2)![image.png](https://cdn.nlark.com/yuque/0/2023/png/2469055/1692763023143-749ae95e-1a71-4cc8-9f0f-29c3bb4f346e.png#averageHue=%23212120&clientId=u8cb61bd8-3289-4&from=paste&height=417&id=uc934e1ef&originHeight=521&originWidth=763&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=165029&status=done&style=none&taskId=ud61a789f-afe1-448b-a8b5-a9ea2c5306d&title=&width=610.4)![image.png](https://cdn.nlark.com/yuque/0/2023/png/2469055/1692763041499-ea5ff47c-2277-4720-b015-b7303e5c186c.png#averageHue=%231e1d1c&clientId=u8cb61bd8-3289-4&from=paste&height=432&id=u74c0cc3f&originHeight=540&originWidth=766&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=185841&status=done&style=none&taskId=u48125af7-c77d-452a-811c-1396be7879b&title=&width=612.8)
# 五、总结
本次课程设计,让我获益匪浅,不仅更深入的了解密码学这门学科,整个设计过程是不断学习,不断发现问题、分析问题、解决问题的过程使我受益良多。设计期间有很多感触、想法,使自己有了继续探索的兴趣,对以后的学习、工作有很大的益处。
于个人而言,在程序设计的过程中,我深感“认真严谨”这个词的重要性,一点点小的马虎,便会导致整个程序不能正常运行。在今后的学习中,我定将“认真严谨”对待。总之,此次课程设计在我今后的学习生涯中起到了至关重要的作用。