软件保护是信息安全领域研究的一个热门问题,能否成功解决这个问题,直接关系到计算机软件能否安全、可靠地运行。应用软件保护平台将实现以下目标:服务器端具有用户管理、口令管理、用户数管理、访问控制管理、加密功能和解密功能。其中,数据文件加密是极其重要的一个过程,下面我们就对数据文件加密给予分析和实现。
一、AES加密算法
随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NIST公开征集新的数据加密标准,即AES加密算法,它汇聚了强安全性、高性能、高效率、易用和灵活等优点。AES及iam算法设计有三个密钥长度:128、192、256位,相对而言,AES加密算法的128密钥比DES的56密钥强1021倍。 AES加密算法主要包括三个方面:轮变化、圈数和密钥扩展。本文以128为例,介绍加密算法的基本原理;结合AVR汇编语言,实现高级数据加密算法AES。
AES加密算法是一个可变数据块长和可变密钥长的分组迭代加密算法,数据块长和密钥长可分别为128、192或256比特,但为了满足AES加密算法的要求,分组长度为128比特,密钥长度为128、192或256比特rSJ oAES密码算法采用的是代替一置换网络(SPN)结构,每一轮操作由4层组成:第1层(字节替换)为非线性层,用S盒对每一轮中的单个字节分别进行替换;第2层(行移位)和第3层(列混合)是线性混合层,对当前的状态阵按行移位,按列混合;第4层(密钥加层)用子密钥与当前状态阵进行字节上的异或算法结构如图1所示。
图1中,(a)图给出了算法的整体结构,输入明文X与子密钥KO异或,然后经过:轮迭代最终生成密文Y,其中第1到r—l轮迭代结构为图(b),第r轮与前面各轮稍微有点不同,缺少混合层。
二、数据文件加密层次
数据文件加密可以在通信的三个层次中实现:链路加密、节点加密和端到端加密。链路加密和节点加密类似,在一条由节点分开的通信链路中,在节点之间对数据进行加密传输,而在节点上数据可能以明文形式存在,而端到端加密允许数据在从源点到终点的传输过程中始终以密文形式存在,采用端到端加密,消息在被传输到终点之前时不进行解密。因为消息在整个传输过程中均受到保护,所以即使有中间节点被损坏也不会使消息泄露。
而端到端加密系统的实施费用较少,与链路加密和节点加密相比更可靠,更容易设计、实现和维护。端到端加密还避免了其他加密系统所固有的同步问题。因为每个数据包均是独立被加密的,所以一个数据包所发生的传输错误不会影响后续的数据包。此外,从用户对安全需求的直觉上讲,端到端加密更自然些。因此,安全平台采用了AES加密算法对网络数据进行端到端加密。
三、应用软件平台架构
应用软件保护平台采用C/S架构,无论客户端还是服务器端,都具备AES加解密模块,具体任务有以下几点:
(1)从内存映射文件读取用户会话密钥信息;
(2)客户端AES加密和解密模块负责加密从客户端发往服务器的所有网络数据包,同时解密服务器发回的网络数据包;
(3)服务器AES加密和解密模块负责解密从客户端接收的网络数据包,同时加密服务器发往客户端的网络数据包;
(4)一旦客户端退出认证则停止对上层应用的加密和解密服务,清除所有密钥信息,释放缓存空间。其各部分架构图如图2和图3。
在上面两个架构图中,实线部分表明的主要是身份认证过程中的数据通信过程及其涉及的模块,虚线部分表明的是具体应用的数据通信过程。AES加密和解密模块属于应用通信过程和认证通信过程共用模块,对进出网络的所有正常通信数据进行加密和解密处理,以确保数据文件在网上传输时的安全性和可靠性。
四、AES加密算法如何在应用软件保护平台中实现
1、AE加密算法流程
AES加密算法属十迭代的分组加密算法,支持128、192、256比特的两种密钥长度,并且用128位(16字节)分组加密和解锘数据,其核心是对明文矩阵进行Nr次轮操作(Nr由密钥长度决定)。AES加密算法中每一次轮操作都由位变换、行移位、列混淆和轮密钥加4个函数组成,第Nr次轮操作不包含列混淆函数,每一轮操作需要用一个轮密钥,轮密钥由初始密钥经密钥扩展后得到。解密算法为加密算法的逆运算。
在软件保护平台的实际使用中,选用的是128位的密钥长度,因此Nr=10,即需要做10轮变换。
2、 AES加密算法实现
对于AES加密过程,先说明一下AES的几个必备参数的初始化:
typedef struct _AES{
int Nb;//明文或密文的行数
int Nr;//加密或解密时的轮数
int Nk;//密钥的行数
unsigned long.Word;//指向密钥库的指针
unsigned long.Stace;//指向每一轮加密或解后的结果
}AES;
这里统一为4列n行,可以用unsigned long效组表示。
Nb=明文或密文长度14;Nk=密钥长度/4;加密轮数Nr=Nb<Nk?Nk:Nb+6;
(1)密钥库的生成过程
①计算库的行数并分配内存库行数=Nb.(Nr+1);
②初始化密钥库
库的第一个密钥为原密钥——直接将密钥拷贝到密钥库中;
③开始计算轮密钥
unsigned long temp;
for (int c=Nk;c<Nb.(Nr+1);++c)
{//把上一轮的最后一行放入temp
temp=w[c-l];//判断是不是每一轮密钥的第一行
if(c% Nk==0)
{//左旋8位
temp=(temp<<8) l(temp>>24);11查Sbox表
SubWord(( byte*)&temp);
temp‘=Rcon[ c/Nk];
}
else if(Nk>6&&(c%Nk=- 4))
{
SubWord((byce*)&temp);
{//w[c - Nk]为上一轮密钥的第一行
w[c]=w[c - Nk]‘temp;
(2)State生成
为了实现快速列混淆(这里应该是行混淆),State需要多出三行作为缓冲区。
所以State=new unsi8;ned long[Nb+3];当解密时State+=3;加密时不变。AES加密算法中行混淆的实现:
加密时第1、2、3列(从O开始)分别上旋(解密时下旋)l、2、3个字节。先拷贝前三行到State的最后三行(就是拷贝到多出来的那三行)。设temp(un8ignedchar temp)为行混淆后第n行的数据。设Nb=4,那么加密时的逻辑结构为:(空白为无效数据)拷贝前:拷贝盾:处理完后的结果:
则temp={s0,s5,s8,sf};temp值经其他运算后放入State的第n行。
下面是解密时的情况
拷贝前:拷贝后:处理完后的结果:
(3)开始加密
①初始化第一轮
State‘=密钥库的第一轮密钥。
②共Nr-1轮
i、先拷贝前三行到State的最后兰行(就是拷贝到多出来的那三行)。
ii、temp={Sbox[ s0),Sbox[ s5J,Sbox[ sa] ,Sbox[sf]};
iii、Stace第n行
第一个字节=Log_02[temp [O]]‘Log_03[ temp[1]‘temp[2]^temp[3];
第二个字节=Log_02[ temp[1]]‘Log_03[ temp[2]‘temp[ 3J‘temp[0];
第三个字节=Log_02( temp[2]]‘Log_03[ temp[3]‘temp[0]‘temp[1];
第四个字节= Log_02[temp[ 3]‘Log_03[temp[0]]‘temp[1]‘temp[2];
③State的当前行‘=密钥库的第n轮密钥相应行;再跳到(2),进行State的下一行计算。
④最后一轮
i、先拷贝前三行到State的最后三行(就是拷贝到多出来的那三行)。
ii、State的当前行={Sbox[s0],Sbox[ s5],Sbox[ sa],Sbox[sf]};
iii、State的当前行‘=密钥库的最后一轮密钥相应行;再跳到(2),进行State的下一行计算。
3、AES加密算法封装
为了便于应用程序的调用,AES加密算法被封装成一个动态链接库文件AES.dll,并导出Encryption()和Decryption()函数作为程序接口,SPI加密和解密模块只需在程序开始时导人这两个函数,即可直接使用它们来进行加密和解密操作了。
小知识之应用软件
应用软件(application software)是用户可以使用的各种程序设计语言,以及用各种程序设计语言编制的应用程序的集合,分为应用软件包和用户程序。应用软件包是利用计算机解决某类问题而设计的程序的集合,供多用户使用。计算机软件分为系统软件和应用软件两大类。应用软件是为满足用户不同领域、不同问题的应用需求而提供的那部分软件。 它可以拓宽计算机系统的应用领域,放大硬件的功能。