当前位置:文档之家› AES算法加密与解密的设计与实现

AES算法加密与解密的设计与实现

AES算法加密与解密的设计与实现
AES算法加密与解密的设计与实现

成都信息工程学院课程设计报告

AES算法加密与解密的设计与实现

课程名称:密码算法程序设计

学生姓名:张佐权

学生学号: 2010122031

专业班级:信安101

任课教师:张金全

2012年6月3日

目录

1. 背景 (1)

2 信息安全技术 (2)

2.1 信息加密技术概述 (2)

2.2 对称密码技术体制概述 (2)

2.3 非对称密码技术体制概述 (3)

2.4 消息摘要概述 (3)

3 高级加密标准 (4)

3.1概念 (4)

3.2 AES加密 (4)

4实现加密算法

5.测试 (6)

5.1 AES类控制台各功能模块测试 (10)

5.1.1 密钥扩展(KeyExpansion) (10)

5.1.2轮密钥加(AddRoundKey) (10)

5.1.3 字节代替(SubKytes) (10)

HYPERLINK \l _Toc27866 5.1.4 行移位(ShiftRows) (10)

5.1.5 列混合(MixColumns) (10)

5.1.6 轮结构加密验证 (10)

5.2消息加解密功能测试 (11)

5.2.1 与FIPS-197(AES)比对验证 (11)

5.2.2 ASCII加密验证 (13)

5.5.3 加密模式验证 (14)

结论 (17)

参考文献 (18)

1. 背景

近年来,随着Internet的迅猛发展,计算机网络技术正在日益广泛的应用到商业,金融,国防等各个领域,Internet在人民的日程生活中发挥着越来越重要的作用。World Wide Web(WWW)系统已经从最初的提供信息查询浏览一类的静态服务发展成可提供动态交互的综合系统,Internet提供的互联性和开放性使信息的交换和共享成为现实,为社会带来了巨大的收益。然而,Internet是一个给予TCP/IP协议的开放系统,它建立的初衷是为了使用者提供一种快捷的通信和资源的共享方式,并没有考虑到数据传输的安全性,机密性和通信实体的身份鉴别等安全因素,因此在Internet的日益广泛应用的同时,通信安全问题也日益突出。如何保证数据的安全传输已经成为了一个重要问题,这一问题也是当今网络通信技术研究的一个热点。

国际化标准组织定义了安全服务,安全机制,安全管理以及安全方面其他问题综合形成的整套安全体系,此外,通过对现实中网络方面所面临的各种安全问题的分析和总结,还定义了11种威胁,为了避免网络遭受这些威胁,在该标准中明确规定了五大安全服务的功能:身份认证服务,访问控制服务,数据保密服务,数据完整性服务和不可否认服务。概括的讲,这五大服务的主要功能如下:(1)保密性。为了防止被动攻击而对所传输的数据进行加密,一般是指采用密码学技术,将需要保密的信息转化为另外一种隐蔽的形式,使未授权者无法提取有用的信息。

(2)完整性。数据完整性用于确认数据在存储和传输的过程中未被修改。

(3)身份认证。认证就是确认实体的身份或数据的来源,即实体与它自己声明的身份是否一致,包括实体身份认证和数据来源认证。

(4)访问控制。访问控制是指控制或限制通信链路对某些网络资源的访问,防止非法用户侵入或合法用户不慎操作所造成的破坏。

(5)不可否认性。可用来防止两个对话实体对曾经执行过的操作提出异议,从而确认某个实体确实发送或接受过信息。

2 信息安全技术

2.1 信息加密技术概述

加密的基本思想是通过变换信息的表示形式来伪装需要保护的信息,使非授权者不能理解被保护信息的含义。加密前的原始信息称为明文(M),用某种方法伪装信息以隐藏它的内容的过程称为加密(encrption),加密后的信息称为密文(ciphertext,记做C),而把密文转变为明文的过程称为解密(decrytion),加密和解密的过程组成加密系统,明文和密文统称为报文。

密码是实现秘密通讯的主要手段。凡是用特种符号按照通讯双方约定的方法把信息的原形隐蔽起来,不为第三者所识别的通讯方式称为密码通讯。在计算机通讯中,采用密码技术将信息隐蔽起来,再将隐蔽后的信息传输出去,即使信息在传输过程中即使被窃取或载获,窃取者也不能了解信息的内容,从而保证信息传输的安全。

任何一个加密系统至少包括下面四个组成部分:

(1)、未加密的报文,也称明文。

(2)、加密后的报文,也称密文。

(3)、加密解密设备或算法。

(4)、加密解密的密钥。

发送方用加密密钥,通过加密设备或算法,将信息加密后发送出去。接收方在收到密文后,用解密密钥将密文解密,恢复为明文。由于信息以密文的形式在信道中传输,所以,即使信道中的信号被截获,未授权者也不能识别和理解。同样,未授权者也不能伪造合理的报文,因为不能篡改和破坏数据。

如果在一个密码体制中,加密密钥等于解密密钥,则称为对称密码体制;反之,则称为非对称密码体制。

2.2 对称密码技术体制概述

对称密码体制也称私钥密码体制,在这种体制下,加密和解密使用同一个密钥,因此,信息的发送方和接收方必须共享同一个密钥。

按照加密方式的不同,对称密码体制分为流密码和分组密码两种。在流密码中,将明文信息按字符逐位加密(如RC4);在分组密码中,将明文信息分组(每组包含多个字符),逐组进行加密,常用的分组密码有DES,3DES,AES等。

对称密码体制效率高,算法简单,系统开销小,速度比非对称密码体制快得多,适合加密大量的数据。对称密码体制也存在一些缺点,其主要问题是发送方和接收方必须预先共享密钥而不能让其他人知道,密钥的传递需要可靠信道,存在密钥分配和管理方面的不足,不能提供数字签名,身份认证等功能。

AES(Advanced Encryption Standard)是一种常见的对称密钥加密算法。它

又称为Rijndael加密算法,是美国联邦政府采用的一种分组加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。AES的设计力求满足以下3条标准:

(1)抵抗所有已知的攻击。

(2)在多可平台上速度快,编码紧凑。

(3)设计简单。

AES作为新一代的数据加密标准,汇聚了强安全性、高性能、高效率、易用和灵活等优点,并且相对实现简单,利于软件实现。

2.3 非对称密码技术体制概述

非对称密钥加密也称为公开密钥加密。公开密钥加密使用两个不同的密钥:一个用来加密信息,称为加密密钥,另一个用来解密信息,称为解密密钥。用户把加密密钥公开,因此加密密钥也称为公开密钥,简称公钥。解密密钥要保密,因此解密密钥也称为私有密钥。

非对称密钥体制不仅可以用于数据保护,还可以用于数据签名。若以公钥加密,以私钥解密,可实现多个用户加密信息,只能由一个用户解读,用于保密通信,若以私钥加密,公钥解密,能实现一个用户加密的信息而多个用户解读,用于数字签名。

非对称密钥体制的优点恰好弥补了对称密码体制的缺点,密钥分配协议简单,极大地简化了密钥管理,缺点是计算开销大,处理速度慢。

2.4 消息摘要概述

消息摘要(Message Digest)是一种函数,它接收任意长度的消息为输入,并产生了一个表示消息的定长字符串。消息摘要最重要的属性就是不可逆性。给定一个消息的摘要值,要想计算出它所对应消息是极其困难的。可能的(任意长度)消息远比定长特征值长,从而使得几乎不可能存在函数的逆。然而要想让一个摘要是安全的,就必须难以生成摘要值为该值的任何信息。我们所讲的困难就是指为了找到匹配的消息文本,需要搜索与摘要值尺寸成比例的消息空间。消息摘要值的第二个属性就是想要产生具有相同摘要值的两条信息M和M’应当是困难的,该属性被称为抗冲突性。

消息摘要又称哈希函数、杂凑函数,是在信息安全领域有广泛和重要应用的密码算法,主要作用是数据完整性验证和消息认证。它有一种类似于指纹的应用,所以有时候我们也把它叫做“数字指纹”。因为它具有以下特性:原始信息只要改

变一点点,哪怕是几比特,对应的消息摘要也会改变很大。常用的消息摘要有MD5,SHA,以及由SHA衍生出来的SHA1,SHA256,SHA384等。

安全哈希算法(Secure Hash Algorithm,即SHA1)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。

SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息产生同样的消息摘要在计算上是不可能的。

3 高级加密标准

3.1概念

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称高级加密标准

Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijndael 之命名之,投稿高级加密标准的甄选流程。(Rijdael的发音近于"Rhinedoll"。)3.2 AES加密

对称密码体制的发展趋势将以分组密码为重点。分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成。密钥扩展算法将b字节用户主密钥扩展成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。混乱和密钥扩散是分组密码算法设计的基本原则。抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的设计要点。

AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。

AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。1999年3月完成了第二轮AES2的分析、测试。2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen 和 Vincent Rijmen 提出的一种密码算法RIJNDAEL 作为AES.

在应用方面,尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生

产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。但是DES迟早要被AES代替。流密码体制较之分组密码在理论上成熟且安全,但未被列入下一代加密标准。

AES加密数据块和密钥长度可以是128比特、192比特、256比特中的任意一个。AES加密有很多轮的重复和变换。大致步骤如下:1、密钥扩展(KeyExpansion),2、初始轮(Initial Round),3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(Final Round),最终轮没有MixColumns。

4实现RSA加密解密算法

文件分别命名为gjsRSA.h、gjsRSA.cpp,实现了数据的加密和解密过程,是本程序的核心部分,也是RSA加密算法的关键。该部分程序基于RSA加解密原理,生成互素的两个大数p、q,得到Φ(n);生成与Φ(n)互素的数e,然后利用Euclid算法计算得到d。最后实现加密过程ci=mi^e(modn)(a),反过来也可以实现解密mi=ci^d(modn)(b)。

具体代码如下:

//gjsRSA.h的内容如下======================================== #ifndef_gjs_RSA_H

#define_gjs_RSA_H

#defineg_ENC_KEY65537//3//7

gChargGenerateKey(gBigInt*n,gBigInt*e,gBigInt*d):

char*gEncRSA(unsignedchar*data,gBigInt*e,gBigInt*n,\

unsignedlonginlen,unsignedlong*outlen)://加密

char*gDecRSA(unsignedchar*data,gBigInt*e,gBigInt*n,\

unsignedlonginlen,unsignedlong*outlen)://解密

#endif

//gjsRSA.cpp的内容如下====================================== #include"gjsBigInt.h"

#include"gjsPrime.h"

#include"gjsRSA.h"

#include"stdlib.h"

#include"mem.h"

gChargGenerateKey(gBigInt*n,gBigInt*e,gBigInt*d)

{//生成密钥

gBigIntp,q,t:

if(n==NULL||e==NULL||d==NULL)

return0:

gMovInt(n,0):

gMovInt(e,0):

gMovInt(d,0):

gGeneratePrime(&p)://生成p

do{//生成q

gGeneratePrime(&q):

}while(gCmp(&p,&q)==0):

gMov(n,&p):

gMul(n,&q)://n=pq

gSubInt(&p,1)://p-1

gSubInt(&q,1)://q-1

gMul(&p,&q)://(p-1)(q-1)

/*do{//生成和(p-1)(q-1)互素的e

gGeneratePrime(e):

gMov(&t,e):

gGcd(&t,&p):

}while(gCmpInt(&t,1)!=0):*/

if(g_ENC_KEY

gMovInt(e,g_ENC_KEY)://

else

{//溢出

gMovInt(e,g_UINT_MAX):

gAddInt(e,g_ENC_KEY-g_UINT_MAX):

}

gMov(d,e):

gEuc(d,&p)://ed%(p-1)(1-1)=1

return1:

}

char*gEncRSA(unsignedchar*data,gBigInt*e,gBigInt*n,\ unsignedlonginlen,unsignedlong*outlen)

{//加密

char*ret,*p:

inttn=0,tn1=0,rlen=0,i,j:

gBigInttbi:

if(data==NULL||e==NULL||n==NULL||inlen==0)

returnNULL:

if(gCmpInt(e,0)==0||gCmpInt(n,0)==0)

returnNULL:

gMov(&tbi,n):

while(gCmpInt(&tbi,0)!=0)

{//计算n的位数(字节数)

gDivInt(&tbi,0x100):

tn++:

}

tn1=tn-1:

rlen=inlen/tn1:

if(inlen%tn1!=0)

rlen=rlen+1:

rlen=rlen*tn+4:

*outlen=rlen://密文长度

if((ret=(char*)malloc(rlen+1))==NULL)

returnNULL://开辟内存失败

memset(ret,0,rlen+1):

p=ret://把明文长度保存起来

*p=inlen>>24:p++:

*p=inlen>>16:p++:

*p=inlen>>8:p++:

*p=inlen:p++:

for(i=0:i

{//将明文分组

j=0:gMovInt(&tbi,0):

while(j

{//提取一组明文

gMulInt(&tbi,0x100):

gAddInt(&tbi,*(data+i+j)):

j++:

}

gMon(&tbi,e,n)://加密运算

for(j=0:j

{//将密文保存起来

*(p+tn-j-1)=(char)tbi.value[0]:

gDivInt(&tbi,0x100):

}

p=p+tn:

}

returnret:

}

char*gDecRSA(unsignedchar*data,gBigInt*d,gBigInt*n,\ unsignedlonginlen,unsignedlong*outlen)

{//解密

char*ret,*p:

inttn=0,tn1=0,rlen=0,tlen=0,i,j:

gBigInttbi:

if(data==NULL||d==NULL||n==NULL)

returnNULL:

if(gCmpInt(d,0)==0||gCmpInt(n,0)==0)

returnNULL:

gMov(&tbi,n):

while(gCmpInt(&tbi,0)!=0)

{//计算n的位数(字节数)

gDivInt(&tbi,0x100):

tn++:

}

tn1=tn-1:

rlen=(*data<<24)+(*(data+1)<<16)+(*(data+2)<<8)+*(data+3):*outlen=rlen://密文长度

tlen=rlen/tn1:

if(rlen%tn1!=0)

tlen=tlen+1:

tlen=tlen*tn+4:

if(inlen

returnNULL://校验失败

elseinlen=tlen:

if((ret=(char*)malloc(rlen+1))==NULL)

returnNULL://开辟内存失败

memset(ret,0,rlen+1):

p=ret:

for(i=4:i

{//将密文分组

j=0:gMovInt(&tbi,0):

while(j

{//提取一组密文

gMulInt(&tbi,0x100):

gAddInt(&tbi,*(data+i+j)):

j++:

}

gMon(&tbi,d,n)://解密运算

for(j=0:j0:j++,rlen--)

{//将明文保存起来

tlen=rlen<(tn1-j)?rlen:(tn1-j):

*(p+tlen-1)=(char)tbi.value[0]:

gDivInt(&tbi,0x100):

}

p=p+tn1:

}

returnret:

5.测试

5.1 AES类控制台各功能模块测试

5.1.1 密钥扩展(KeyExpansion)

5.1.2轮密钥加(AddRoundKey)

5.1.3 字节代替(SubKytes)

5.1.4 行移位(ShiftRows)

5.1.5 列混合(MixColumns)

5.1.6 轮结构加密验证

5.2消息加解密功能测试

5.2.1 与FIPS-197(AES)比对验证

密钥长度128位时:

加密结果(红框内为填充内容的密文)

解密结果:

通过与文件标准比对得到,128位密钥长度时加密正确。

密钥长度192位时:

加密结果(红框内为填充内容的密文)

解密结果

通过与文件标准比对得到,192位密钥长度时加密正确。密钥长度256位时:

加密结果(红框内为填充内容的密文)

解密结果

通过与文件标准比对得到,256位密钥长度时加密正确。

5.2.2 ASCII加密验证

ASCII字符加密

ASCII字符解密

5.5.3 加密模式验证

EBC模式:由于前面都使用的EBC模式,验证略。CBC模式:

加密:

解密:

加密:

解密:

加密:

解密:

结论

本文是在学习了相关密码学算法及程序设计的知识之上进行的设计,本设计采用VC++设计系统类的实现与用户功能界面,实现了EBC、CBC、CFB、OFB 种模式下的加解密功能,为大文件加密提供节很好的基础。支持128、192、256三种长度密钥的加解密,并且消息与密钥均可以ASCII码与十六进制数字的方式输入。结果也可以ASCII码与十六进制数字的方式输出。可视化的图形界面,人机界面友好,操作简单,方便各类用户使用。

在安全加密体系方面,加密算法主要采用对称加密的方式,主要参考文件:

fips-197(AES)。并且所有正确性验证数据均是以此文件为基准。

由于本人水平有限,在程序可读性和规范性上有着一定的欠缺,而在实现功能上也显得不是很完善,需要在进一步的学习中得到提高。

参考文献

[1] 张仕斌张金全.应用密码学.西安:西安电子科技大学出版社,2009.12

[2] 郑莉. C++语言程序设计[M].北京:清华大学出版社,2003.12

[3] Ivor Horton (姜玲玲译).Visual C++ 2008 入门经典.北京:清华大学出版社,2009.2

[4]谭浩强. C程序设计[M].北京:清华大学出版,1999.12

[5] fips-197(AES).ADVANCED ENCRYPTION STANDARD (AES).November 26, 2001

相关主题
文本预览
相关文档 最新文档