基于AES算法的文件加密
2017-07-12张文锦周荣高燕
张文锦+周荣+高燕
摘要:介绍AES算法的基本理论,并应用到具体软件实现中。在AES算法实现中,预先存储正反S盒查找表,提高算法执行的运行速度;使用密文挪用技术,解决待处理数据长度不是分组长度整数倍的问题;提出优化文件读写方案,使用多线程和缓存技术,提高系统加密解密的吞吐量。测试加密软件的基本功能,并对软件性能作量级测试。
关键词:AES;加密;解密;密文挪用;分组密码
DOIDOI:10.11907/rjdk.171097
中图分类号:TP309.7
文獻标识码:A 文章编号:1672-7800(2017)006-0180-03
0 引言
随着信息化的推进,“互联网+”应用不断深入。信息化渗透到人们学习、工作、生活等各方面,为人们提供便利服务的同时,也面临着信息安全的巨大挑战。个人信息安全是信息安全的重要组成部分,个人电脑或U盘中毒丢失都会造成个人信息的泄露。创建一个保护用户个人信息的工具具有重要意义。
1 AES算法简介
1.1 算法背景
高级加密标准(即AES[1]),又称Rijndael加密法,是一种区块加密标准,用来替代原先的DES,已经被多方分析且广泛应用。经过5年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已成为对称密钥加密中最流行的算法之一。
1.2 算法流程
AES加密算法的处理单元是分组,分组的128bit数据(16字节)会按照顺序赋值到4*4的状态矩阵(state)中,所有变换都是基于状态矩阵完成的。AES变换是多轮迭代的轮变换实现的,迭代次数与密钥长度有关(以AES-128为说明)。轮变换包括4步变换,包括字节替换(SubBytes())、行变换(ShiftRows())、列混合(MixColumns()[2])和密钥加(AddRoundKey())[3]。通过非线性变换、混合函数变换,将字节代换运算产生的非线性扩散,达到重复混合,使得加密完成后的分组扩散更均匀。轮密钥扩展将原始密码扩展成11组,每轮迭代使用不同的密钥。加密流程如图1所示。
2 算法实现
2.1 密钥扩展
按照列优先的方式将种子密钥排列成4*4矩阵,矩阵每一列就可以称为一个32bit的字。密钥扩展的目的就是将种子密钥由4个字扩展成44个字,每一轮加密需要4个字,为了方便描述,第一个字为w[0],第二个字为w[1]…依次类推,最后一个字为w[43]。
前4个字可以用种子密钥初始化,然后,对数组w扩充40个新字。递归方式:
(1)若i不是4的倍数,那么w[i]=w[i-4]^w[i-1]。
(2)若i是4的倍数,那么w[i]=w[i-4]^T(w[i-1]);其中,T是一个函数。
函数T由3个部分组成:字循环、字节代换与轮常量异或。
(3)字循环:将一个字中的4个字节分别向左移动一个字节。即[x0,x1,x2,x3]变换为[x1,x2,x3 ,x0]
(4)字节代换:即S盒置换。
(5)轮常量异或:将前两步的结果与轮常量Rcon[j]进行异或。
2.2 S盒置换和逆S盒置换
S盒置换又称字节代换。正S盒(Sbox),逆S盒(Inv Sbox)提前计算存储在代码中,字节代换可以简化成一个简单的查表操作。通过下标取出对应的值就是这个映射操作,如图2所示。S盒置换使用正S盒,逆S盒置换使用逆S盒。
2.3 行移位变换与逆向行移位变换
行移位的功能是将字节矩阵通过简单的左循环移位操作。当密钥长为128bit,状态矩阵的第i行左移i个字节,如图3所示。逆行移位就是还原行移位,状态矩阵向右循环移位,状态矩阵的第i行右移i个字节。
2.4 列混合变换和逆列混合变换
列混合算法:使用GF()域[4]算术特性替代
根据矩阵的乘法可知,在列混淆过程中,每个字节对应的值只与该列的4个值有关系。此处的乘法和加法都定义在GF(28)有限域上。
需要注意如下几点:
(1)将某个字节的值乘2,即该值的二进制位左移一位,如果该值的最高位为1(即该数值不小于128),则还需要将移位后的结果异或00011011。
(2)乘法对加法满足分配率,例如:07·S0,0=(01⊕02⊕04)·S0,0= S0,0⊕(02·S0,0)(04·S0,0)。
(3)此处矩阵乘法与矩阵的乘法不同,各个值在相加时使用的是模2加法(相当于是异或运算)。
逆列混合操作同样使用GF()域上算术特性替代,只是多项式c(x)不同。
2.5 轮密钥加
将128位轮密钥与状态矩阵中的数据进行按位异或操作。因为异或操作的逆操作即是本身,所以解密轮密钥加也是本身。
3 软件优化
3.1 密文挪用
AES算法是分组加密算法,所以不可避免地要处理待处理数据不是分组数据的整数倍的问题。如果不处理这部分不够的数据,那么加密解密以后得到的原始信息将在最后一个分组多出一部分错误信息,而没有被赋值的数据往往就是内存中的垃圾值,从而影响正确信息的可读性。本软件在实现过程中采取的方法是“密文挪用”。
为了便于解释,设分组长度为blen;待处理(加密/解密)的数据为d,长度为dlen;待处理剩余的数据为rd,长度为rdlen。已经处理数据s。加密实现过程如图4所示。
(1)当rdlen>=blen,即剩余数据大于分组长度,转2;否则,转3。
(2)从rd的头部取大小为blen的数据作加密操作,所得数据拼接到s尾部,转1。
(3)若rdlen>0,即剩余数据不够一个分组。在已经加密的数据s末尾取出大小为blen-rdlen的数据与rd拼接构成一个长度为blen的分組数据块,对其加密并将结果拼接到已经加密数据(除被取出的blen-rdlen的数据)后,转4。
(4)若relen==0,所有数据加密完成,结束加密。S为密文。
原文被分成n个组,第n个分组不足一个分组长度。前面n-2个分组直接加密即可,第n-1分组加密后要借给n分组然后对n分组加密。解密实现过程如图5所示。
setp1:当rdlen>2*blen,转2;否则,转3。
setp2:rd的头部取出blen长的数据做解密操作,结果拼接到s尾部,转1。
setp3:当rdlen=2*blen,转4;否则,转5。
setp4:取出rdlen数据解密。直到rdlen==0;结果拼接到s尾部,转6。
setp5:取出剩余数据rd末尾blen大小的数据块(剩余的rd-blen大小数据块记作rd)并作解密操作,得到数据块data2;对剩余的待解密数据rd与data2的头部b1en-rdlen的数据进行拼接、解密,得到data3。顺序拼接s,data3,data2的末尾rdlen个位数据,得到完整解密数据、转6。
setp6:所有密文均被解密成原文。结束解密。
说明:密文被分成n个分组,前n-2分组直接解密。结尾部分,先取出后面一个分组,然后n-1分组和解密完的前面部分组成一个分组解密,然后拼接起来。
3.2 多线程I/0优化
文件读取和加解密处理的速度是不匹配的。如每次处理一个分组就读写文件一次显然会处于空等状态,而且多次打开关闭文件相当费时间,而待加密的文件也是可大可小的,可能是几K的文本,也有可能遇到几个G的图像视频等,全部读取到内存中也是不可能的。考虑到以上问题,设置缓冲区。
文件处理过程如图6所示,系统主进程实现加密解密操作,读文件操作由文件读进程实现,写文件操作由文件写进程实现。待处理数据和待写入文件数据缓冲区使用循环队列实现,主进程直接在缓存区读取数据,并将数据存入写缓冲区。
4 软件运行测试
4.1 基本功能测试
测试文件test.txt。内容 “这是基于AES加密算法的测试用例,张文锦zhangwenjin”。加密结果如图7。
进行解密操作能够还原文件原来的内容。
4.2 性能测试
软件处理大小不同文件的性能如表1。
5 结语
本文介绍了AES加密算法的实现原理和过程,并给出了算法密钥加、行移位、S盒置换、列混合等关键操作的实现方法。在实际应用过程中应用密文挪用技术,巧妙处理分组问题,为了提高文件处理效率使用了缓冲区技术 。通过测试,加密软件不但在功能上满足要求,性能方面也令人满意。
参考文献:
[1]何明星,范平志.新一代私钥加密标准AES进展与评述[J].计算机应用研究,2001,18(10):4-6.
[2]曾祥勇,张焕国.高级加密标准Mixcolumn变换设计分析[J].武汉大学学报:理学版,2003,49(5):597-600.
[3]何明星,林昊.AES算法原理及其实现[J].计算机应用研究,2001,18(10):4-6.
[4]Announcing the Advanced Encryption Standard(AES) [p].NIST,2001:1-53.
(责任编辑:陈福时)