一、课程设计功能简介

题目

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

功能要求

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

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

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

二、技术要求

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

三、软件模块设计流程

C语言AES域乘法 c语言实现aes_c语言如何加密系统

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

C语言AES域乘法 c语言实现aes_c语言如何加密系统_02

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

C语言AES域乘法 c语言实现aes_字符串_03

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

四、测试结果

C语言AES域乘法 c语言实现aes_c语言如何加密系统_04

C语言AES域乘法 c语言实现aes_加密/解密_05

C语言AES域乘法 c语言实现aes_数组_06