摘要:
AES加密算法已经在现实中得到了广泛的应用,本文主要阐述了当代主流加密算法AES的研究背景,算法简介和具体实现方法,包括对AES标准中运行时间过程的函数进行优化,和WINDOWS下AES软件开发的简介。
关键词:AES 加密算法 算法实现 程序优化
一、 当代加密算法AES
(一)AES算法简介
AES的全称是Advanced Encryption Standard,即高级加密标准。20xx年10月,NIST(美国国家标准和技术协会)宣布通过从15种候选算法中选出的一项新的密钥加密标准。Rijndael被选中成为将来的AES。Rijndael是在19xx年下半年,由研究员Joan Daemen和Vincent Rijmen创建的。AES正日益成为加密各种形式的电子数据的实际标准。
高级加密标准(AES)是美国标准与技术研究院针对电子数据的加密所制定的规范,他将要成为公认的数字信息(包括财务数据、电信数据和政府数据)加密方法,AES是一种可以用来保护电子数据的新型加密算法。可以只用128、192和256位密钥的迭代式对称密钥块密码,并且可以对128位(16个字节)的数据块进行加密和解密。
(二)AES在现实中的应用
AES算法标准给出了数学说明以及部分程序伪码,但是程序运行效率较低,无法达到实际应用要求。同时改进后的程序普遍涉及到版权问题,无法在实际开发中直接使用。尽管如此在程序人员对AES程序进行自主改进后,AES作为新一代的数据加密标准的优点,强安全性、高性能、高效率、易用和灵活等优点就完全体现出来,因此AES加密算法成为美国乃至世界心的数据加密标准而被广泛应用在各个领域。
二、 AES加密算法的实现
(一)系统结构
系统结构的文字描述:AES加密算法包括加密和解密两大部分,加密部分具体实现对数据的加密和参数文件的生成,解密部分具体实现对已加密文件的解密
1
和参数文件的删除。AES 是分组密钥,算法输入 128 位数据,密钥长度也是 128 位。用 Nr 表示对一个数据分组加密的轮数。每一轮都需要一个与输入分组具有相同长度的扩展密钥的参与。由于外部输入的加密密钥 K 长度有限,所以在算法中要用一个密钥扩展程序把外部密钥 K 扩展成更长的比特串,以生成各轮的加密和解密密钥。
(二)AES加密算法的优化
优化原因:按照AES算法的理论设计的,在实际的应用中运行速度慢,加密10M的文件需要几十秒的时间,无法达到实际应用的要求,所以需要针对标准算法进行优化。
优化方法:1.将所有的乘除运算转换为位运算,例如,A*16可以转换为将A左移4位,这种方法根据客户的测试的结论,可以提高50%的运行速度。2.修改加密的算法逻辑,将其中最耗时的MixColumns函数改进。具体的方法是简化MixColumns函数中进行的矩阵运算。把矩阵运算先计算出来,以数组方式直接在头文件中定义,在运算时直接使用这个数组。同时,为使用预先计算的数组,需要将四个函数的算法统一编写,形成新的程序结构。
MixColumns函数代码如下:
Void MixColumns(wordB a[4] [MAXBC])
{
/*Mix the four bytes of every column in a linear way*/
Word8 b[4][MAXBC];
Int i,j;
For(j=0;j<BC;j++)
For(i=0;i<4;i++) B[i][j]=mul (2,a[i][j])
^mul(3,a[(i+1)%4][j])
^a[(i+2)%4][j]
^a[(i+3)%4][j];
For (i=0;i<4;i++)
此代码运行时间过长,先将此矩阵结果算出后能大大缩短程序运行时间。
(三)基于WINDOWS操作系统的AES加密软件设计
2
For(j=0;j<BC;j++) a[i][j]=b[i][j]; }
1.开发环境
参数文件生成程序:运行环境为Windows XP操作系统。使用MSC开发,可以使用MFC,程序要求可以在未安装VC++的系统中运行。
解密程序:运行环境为Cygwin。使用ANSIC开发,使用GCC编译。
2.参数文件的定义
AES加密算法中的参数文件使用文本形式,主要包含内容有:
(1) 密钥长度:AES提供128、192和256三种密钥长度可任意选择。
(2) 密钥生成方式:有DEFAULT、FILE或INPUT三种方式生成密钥,DEFAULT
表示默认方法,FILE表示通过哈希算法生成密钥,INPUT表示通过用户自己输入密钥。
(3) 保存密钥:密钥生成后保存在参数文件中。(如果是FILE方式生成密
钥则保存密钥路径)。
(4) 输入路径:待加密文件路径。
(5) 输出路径:加密后文件输出路径。
3.详细式样设计
(1)加密部分:加密部分主要包含密钥生成、密钥长度选择、参数文件生成路径、输出和输入路径等等、
1>密钥长度指定,可以建立一个下拉菜单,设置128、192和256三种选项。
2>密钥生成:有三项选择具体为默认密钥生成:用哈希算法产生的密钥文件作为密钥;用户随记输入密钥。
3>输出输入路径设置:输入路径为待加密文件路径,输出路径为文件加密后生成的加密文件保存路径,可以设置为默认项,也可以由用户自己设置。 4>参数文件指定:生成参数文件的保存路径。
(2)解密部分:解密部分包含密钥输入、参数文件调用、待解密文件输入、解密文件输出等、
1>密钥输入可以选择默认密钥和用户自己输入加密时密钥,还可以放弃输入密钥直接调用参数文件。
2>参数文件调用:调用和待解密文件相匹配的参数文件,参数文件包含通过哈希算法计算出来的密钥,待解密文件路径等。
3>路径选择:包括待解密文件路径(如果不输入路径可以直接输入文件名);输出路径为文件解密完成后的输出路径。
4>解密完成后参数文件会被删除。
3
三、 结论
AES加密算法已经在现实中得到了广泛的应用,学习AES加密算法的编程能让你更加了解当代加密算法的具体形式与逻辑,正是因为AES加密算法这样的为保护信息安全软件的产生才能让IT技术更加健康的向前发展,在电子交易,宽带通信,信息传输等等方面都有AES加密算法的影子,本文以较小的篇幅从几个方面简单的分析了AES加密算法,介绍了AES在WINDOWS下的软件编写和详细的式样分析,从几个方面简单的分析了AES加密算法。
参考文献 :
1 宋震,等. 密码学. 北京:中国水利水电出版社,2002
2 杨义先.现代密码新理论.北京:科学出版社,2002
3 谷大武,等.高级加密标准 (AES) 算法—Rijndael 的设计.北京: 清华大学出版社, 2003
4 耿德根,等.AVR 单片机应用技术.北京:北京航空航天大学出版社,2002 5 宋建国,等.AVR 高速嵌入式单片机原理与应用.北京:北京航空航天大学出版 社,2001
6 NIST. Advanced Encryption Standard (AES) .Federal Information Processing Standards Publication,2001 3
4
第二篇:AES加密算法实现C
AES加密算法实现C/S模式的通信
设计任务:
掌握AES的加密算法原理;
掌握用socket编程实现C/S模式的加密通信。
设计内容:
Socket编程实现客户端和服务器模式的通信;
编程实现AES加解密的过程;
将AES应用在C/S的通信中,对信息进行加密传输。
设计原理:
1、socket编程实现C/S模式的通信,当用户在客户端发出请求时,会在服务器端做出相应的反应,并给出应答信息返回给客户端。
2、AES――对称密码新标准:高级加密标准。对称密码体制的发展趋势将以分组密码为重点。分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成。密钥扩展算法将b字节用户主密钥扩展成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。混乱和密钥扩散是分组密码算法设计的基本原则。抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的设计要点。AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。19xx年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。19xx年3月完成了第二轮AES 2的分析、测试。最终将Rijndael数据加密算法作为高级加密标准AES。在应用方面,尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。但是DES迟早要被AES代替。
3、AES的主要算法原理:
AES 算法是基于置换和代替的。置换是数据的重新排列,而代替是用一个单元数据替换另一个。AES 使用了几种不同的技术来实现置换和替换。为了阐明这些技术,让我们用 Figure 1 所示的数据讨论一个具体的 AES 加密例子。下面是你要加密的128位值以及它们对应的索引数组:
00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
192位密钥的值是:
00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13 14 15 16 17
0 1 2 3 4 5 6 7 8 9 10 1112 13 14 15 16 17 18 19 20 21 22 23
Figure 2 S-盒( Sbox )
当 AES 的构造函数(constructor)被调用时,用于加密方法的两个表被初始化。第一个表是代替盒称为S-盒。它是一个16×16的矩阵。S-盒的前五行和前五列如 Figure 2 所示。在幕后,加密例程获取该密钥数组并用它来生成名为w[]的
密钥调度表,Figure 3 所示。
Figure 3 密钥调度表(Key Sched)
w[] 最初的 Nk (6) 行被作为种子,用原始密钥值(0x00 到0x17)。剩余行从种子密钥来产生。变量 Nk 代表以 32 位字为单位的种子密钥长度。稍后我分析 AES 实现时你将清楚地看到 w[] 是怎样产生的。 关键是这里现在有许多密钥使用而不只是一个。这些新的密钥被称为轮密钥(round keys)以将它们与原始种
子密钥区别开来。
Figure 4 State (态)数组
AES 加密例程开始是拷贝 16 字节的输入数组到一个名为 State 的 4×4 字节矩阵中。AES 加密算法 取名为 Cipher,它操作 State[]。在规范中,加密算法实现的一个预备的处理步骤被称为 AddRoundKey(轮密钥加)。AddRoundKey 用密钥调度表中的前四行对 State 矩阵实行一个字节一个字节的异或(XOR)操作,
并用轮密钥表 w[c,r] 异或 输入 State[r,c]。
举个例子,如果 State 矩阵的第一行保存的字节是{ 00, 44, 88, cc }第一列密钥调度表是{ 00, 04, 08, 0c },那么新的 State[0,2] 值是用 w[2,0]( 0x08
或 0x80 )异或 State[0,2](0x88)的结果:
1 0 0 0 1 0 0 0
0 0 0 0 1 0 0 0 XOR
1 0 0 0 0 0 0 0
AES 算法的主循环对 State 矩阵执行四个不同的操作,在规范中被称为 SubBytes(字节替换)、ShiftRows(行位移变换)、MixColumns(列混合变换) 和 AddRoundKey。除了每次循环 AddRoundKey 都被调用并使用密钥调度表的下面四行外,AddRoundKey 与预备处理步骤中的 AddRoundKey 相同。SubBytes 例程是一个代替操作,它将 State 矩阵中的每个字节替换成一个由 Sbox 决定的新字节。比如如果 State[0,1]的值是 0x40 如果你想找到它的代替者,你取 State[0,1] 的值 (0x40) 并让 x 等于左边的数字(4)并让 y 等于右边的数字(0)。然后你用 x 和 y 作为索引 进到 Sbox 表中寻找代替值,如 Figure 2 所
示。
ShiftRows 是一个置换操作,它将 State 矩阵中的字节向左旋转。Figure 6 示范了 ShiftRows 如何操作 State[]。State 第0行被向左旋转0个位置,State 第1行被向左旋转1个位置,State 第2行被向左旋转2个位置,而 State 的
第3行被向左旋转3个 位置。
Figure 6 对 State 进行 ShiftRows 操作
MixColumns 是一个代替操作,它是理解 AES 算法时最具技巧(或者说是最需要动脑筋的部分)的部分。它用 State 字节列的值进行数学域加和域乘的结果代替每个字节。假设 State[0,1] 的值是0x09,并且列1上的其它值分别为 0x60,
0xe1 和 0x04,那么,
State[0,1] = (State[0,1] * 0x01) + (State[1,1] * 0x02) +(State[2,1] * 0x03)
+(State[3,1] * 0x01)
= (0x09 * 0x01) + (0x60 * 0x02) + (0xe1 * 0x03) +(0x04 * 0x01)
= 0x57
此处加法和乘法是专门的数学域操作,而不是平常整数的加法和乘法。
SubBytes、ShiftRows、MixColumns 和 AddRoundKey 四个操作在一个执行 Nr 次的循环里被调用,Nr 为给定密钥大小的轮数减 1。加密算法使用的轮数要么是10,12,要么是14,这依赖于种子密钥长度是128位、192 位还是 256 位。在这个例子中,因为 Nr 等于12, 则这四个操作被调用11次。该迭代完成后,在拷贝 State 矩阵到输出参数前,加密算法调用 SubBytes、ShiftRows 和 AddRoundKey 后结束。
大致说来,AES 加密算法的核心有四个操作。AddRoundKey 使用从种子密钥
值中生成的轮密钥代替 4 组字节。SubBytes 替换用一个代替表 替换单个字节。ShiftRows 通过旋转 4字节行 的 4 组字节进行序列置换。MixColumns 用域加和域乘的组合来替换字节。