c语言如何加密系统,课内资源 - 基于C语言的AES加密系统

一、课程设计功能简介

题目

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

功能要求

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

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

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

二、技术要求

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

三、软件模块设计流程

403ef3847b0cc626cca6d53fb900ad2c.png

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

eee0edc9a99f7586ad7f08e24a7c869f.png

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]异或运算。

93c15f9255d2c4b394e4348fdc418453.png

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

四、测试结果

3f88e7d66d1457f628665c17c2aabd4e.png

c75c6a4b6845b198b7c96b3ade1e1347.png

32f552e50e61a8e3f3758d55bf72969d.png

五、总结

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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值