随着Internet的快速发展,网络安全越来越重要,电子邮件作为人们在网络上应用相当普遍的交流工具之一,其安全问题应该得到重视。加密技术是电子邮件安全的重要基础,下面我们就利用Rijndael加密算法来看看电子邮件在传输中是如何加密与解密的。

一、Rijndael加密算法抽象类的设计

1、Rijndael加密算法简介

Rijndael加密算法是美国国家标准技术研究所(NISD在2000年10月2日公布的高级加密标准(AES-Advanccd EncryptionStandard)的最终候选算法之一。Rijndael算法派生于Square算法,它的设计策略是宽轨迹策略(Wide Trail Strategy),主要针对差分分析和线性分析。Rijndael算法是一个迭代分组密码,其分组长度和密钥长度是可变的,分组长度可以是128/192/256/5 12比特以及更高位数,密钥长度可以为128/192/256比特以及更高位数。Rijndael算法的体制模型如图1。

电子邮件传输中加密与解密的实现

其中,加密器把经过加密密钥加密的密文传送到解密器。以分组长度128比特,密钥长度I28比特为例。

(1)加密:X是Rijndael密码的128位比特输入,Y是128比特的输出。

(2)解密:解密是加密的逆。

(3)密钥方案:在加密过程中,需要r+1个子密钥,需要构作4(r+1)个32比特字。种子密钥为128比特时,构作4(r+1)个32比特字。

2、Rijndael算法的抽象类的设计

在具体的实现过程中,我们将Rijndael算法抽象成一个c++类,封装后的类可以直接被应用在需要加密技术的软件中去使用。C++封装Rijndael算法的类为CRijndael,用户可以调用该类利用提供的接口函数来实现加密/解密功能。

下面为CRijndael类的文本描述:

class CRijndacl

{

Private:

Kcy;//密钥

CiphcrKcy[i];//加密组

DeCiphcrKcy[i];//解密组

GcncraccCiphcrKcy();//加密子密钥生成器

GenerateDeCipherKcy();//解密子密钥生成器

CipherKcyAndDeCiphcrKcy0;加密解密128位Public:

CRijndacl();

~C R Jjndacl();

Codc();//加密

DeCode();//解密

SctCodc();//提供加密和解密密钥

StringCode0;//加密字符

StringDeCode0;//解密字符

}

其中,提供的接口函数有:Code();DeCode();SetCode(); StringCode(); StringDeCode()。

二、电子邮件加密和解密的实现过程

1、电子邮件加密的实现过程

在电子邮件加密的实现过程中,定义类CRijndael的对象,调用SetCode函数给加密密文提供对称密钥来设置加密密钥,然后Code()调用Rijndael算法加密。

首先,生成加密子密钥组,然后,打开要加密的文件,接着进入一个循环过程:读取文件取到要加密的字符串,调用StringCode函数进行字符串加密,将加密后的字符串进行存储。直到文件加密完毕,则跳出循环。这样就对电子邮件实施了加密功能。

在电子邮件负责传输的类SMTP中的加密响应函数OnEnCode()部分源代码如下:

Void CEmaiICodcDlg : : OnEnCodc()

{

UpdatcData( TRUE) ;

CRjjdael Rijndael;

CString Tcmp,

int Length=M_S tringAJl.GetLength()

if (M_ButtonEnC odc.GetTrue())

{ char *EmaiICodvM_StringCodc.GctBuffcr(MAX_EMAIL_LENGTH);

char *EmaiIMairrM StringMain.GctBuffer(MAX_EMNL_LENGTH);

char *EmaiITcmp Tcmp.GetBuffcr(MAX_EMAJL_LENGTH);

EmaijTcmp[Length+l]a\Or;

Rijndacl.SctCodc((unsigned char*) EmaiICodc);//提供加密密钥

Rijndacl.StringCode((unsigned char*) EmaijMain,(unsigncd char*)EmaiITcmp);

M StringCodc.RclcaseEmaiIBuffer();//释放缓冲区

M_StringMain.ReleaseEmaiIBuffer();

Tcmp.RcleaseEmaiIBuffcr();

M_StringAttcrEnCodFTcmp+“\o”;删字储加密后的邮件

MessageBox(”the cmail is Coded!”);

GctDlgltcm(IDC_EDIT- CODE)->EnablcWindow(FALSE);

}

else

f GetDJgltem(IDC_EDIT_CODEF>EnableWindovKTRUE);

}

当用户加密电子邮件输入密钥后,CRijndael类的SetCode()函数将得到用户的密钥,接着StringCodcO函数将对电子邮件的正文文件加密。

2、电子邮件解密的实现过程

电子邮件解密的实现过程与加密过程类似,只是调用的具体函数不同,这些函数都是相应加密函数的逆过程,其具体实现过程是:先定义类CRijndael的对象,调用SctCode函数给解密密文提供对称密钥来设置解密密钥,然后DeCode0调用Rijndael算法进行解密。

首先,生成解密子密钥组,然后,打开要解密的已被Rijndael算法加密的相应的文件,接着进入一个循环过程:读取文件取到要解密的字符串,调用StringDeCode函数进行字符串解密,将解密后的字符串进行存储。直到文件解密完毕,则跳出循环。这样就对电子邮件实施了解密功能。

在电子邮件负责接收的类POP3中的解密响应函数OnEnDeCode()部分源代码如下:

Void CEmaiIDcCodcDJg::OnEnDcCode()

{

CRijdael Rijndael;

CString M_StringCode;

M EditCodc.GctWindowSrring(M_StringCodc);

CString M_StringMain;

M_EditMain.GetWindowMain(M_Stnn8Main);

CString Temp;

int Lcngth=M_S tringAlI.GctLength0;

char*EmaiICodvM_StringCode.GctBu ffcr(MAX_EMAIL_LENGTH);

char*EmaiIMain=M_StringMain.GctBuffi:r(MAX_EMAIL_LENGTH);

char *EmaiITcmp=Tcmp.GetBuffer(MAX_EMAIL _LENGTI-D;

EmaiITemp[Lcngth+l]='D’;

RijndaeI.SetCode((unsigned char*) EmaijCode);//提供解密密钥

RjjndaeLStringDeCode((unsigned char*) EmailMain,(unsigncdchar*) EmaiITcmp);

Tcmp.RclcascEmaiIBuffer();//施放缓冲区

M_StringCodc.RcleaseEmaiIBuffcr();//施放缓冲区

M_S tringMain.ReleascEmaiIBuffer();

M_StringMaiI=Tcmp+“\0”;

McssagcBox(“tbc cmail is Dccodedl”)

M_EditMain.Clear();


当用户解密电子邮件输入密钥后,CRijndael类的SetDeCode0函数将得到用户的密钥,接着StringDcCode()函数将对电子邮件的正文进行解密。

三、电子邮件的传输过程

电子邮件的传输由用户代理、传输代理、接收代理3部分组成。用户代理是用户端的收发信程序,负责电子邮件的打包后发送至邮件服务器或从邮件服务器取出电子邮件进行解包。传输代理负责电子邮件的交换和传输,将电子邮件传输到电子邮件代理服务器,然后接收代理将电子邮件发送到电子邮箱。现在传输代理主要是基于SMTP协议,接收代理主要是基于POP3协议。

电子邮件的具体传输和接收过程:

(1)发送端主机的电子邮件管理程序将电子邮件进行分拆和封装成一个或多个传输层协议包(TCP Packet),传输到网络层(IP)后,又封装成IP包附上目的地IP地址;

(2)电子邮件软件按照目的IP地址,确定要连接的计算机,连接成功后,将IP包发送到Internet上,在Intemet上IP包经过路由选择和存储转发后,到达目的地计算机;

(3)接收端电子邮件程序将会把到达的IP包进行收集、分拆,取出信息,然后按照正确的次序将这些分拆后所得到包恢复成原始邮件传送给收件人。

在具体实现过程中,以C++为例。电子邮件的传输主要定义两个类即SMTP类和POP3类,其中类SMlP主要负责与对方的电子邮件服务器建立连接、发送邮件数据、接受邮件服务器的响应、断开连接、结束等;类POP3主要负责与自己的邮件服务器建立连接、获得授权、进行传输、更新状态、断开连接等。

四、性能评价

我们通过在内部网和Intemet上的测试,经过实施加密后的邮件,非法用户看到的只能是一堆杂乱的编码而己,很难被解密,并且对其进行了攻击。结果表明加密达到了很好的效果。但是作为一种实施的对称加密算法,由于其本身固有的缺陷,很难不被穷尽搜索方法攻击。我们应该探索将更好的加密技术应用到网络安全中去。

小知识之SMTP

SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。