電子郵件傳輸中加密與解密的實(shí)現(xiàn)

隨著Internet的快速發(fā)展,網(wǎng)絡(luò)安全越來(lái)越重要,電子郵件作為人們?cè)诰W(wǎng)絡(luò)上應(yīng)用相當(dāng)普遍的交流工具之一,其安全問(wèn)題應(yīng)該得到重視。加密技術(shù)是電子郵件安全的重要基礎(chǔ),下面我們就利用Rijndael加密算法來(lái)看看電子郵件在傳輸中是如何加密與解密的。

一、Rijndael加密算法抽象類的設(shè)計(jì)

1、Rijndael加密算法簡(jiǎn)介

Rijndael加密算法是美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所(NISD在2000年10月2日公布的高級(jí)加密標(biāo)準(zhǔn)(AES-Advanccd EncryptionStandard)的最終候選算法之一。Rijndael算法派生于Square算法,它的設(shè)計(jì)策略是寬軌跡策略(Wide Trail Strategy),主要針對(duì)差分分析和線性分析。Rijndael算法是一個(gè)迭代分組密碼,其分組長(zhǎng)度和密鑰長(zhǎng)度是可變的,分組長(zhǎng)度可以是128/192/256/5 12比特以及更高位數(shù),密鑰長(zhǎng)度可以為128/192/256比特以及更高位數(shù)。Rijndael算法的體制模型如圖1。

電子郵件傳輸中加密與解密的實(shí)現(xiàn)

其中,加密器把經(jīng)過(guò)加密密鑰加密的密文傳送到解密器。以分組長(zhǎng)度128比特,密鑰長(zhǎng)度I28比特為例。

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

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

(3)密鑰方案:在加密過(guò)程中,需要r+1個(gè)子密鑰,需要構(gòu)作4(r+1)個(gè)32比特字。種子密鑰為128比特時(shí),構(gòu)作4(r+1)個(gè)32比特字。

2、Rijndael算法的抽象類的設(shè)計(jì)

在具體的實(shí)現(xiàn)過(guò)程中,我們將Rijndael算法抽象成一個(gè)c++類,封裝后的類可以直接被應(yīng)用在需要加密技術(shù)的軟件中去使用。C++封裝Rijndael算法的類為CRijndael,用戶可以調(diào)用該類利用提供的接口函數(shù)來(lái)實(shí)現(xiàn)加密/解密功能。

下面為CRijndael類的文本描述:

class CRijndacl

{

Private:

Kcy;//密鑰

CiphcrKcy[i];//加密組

DeCiphcrKcy[i];//解密組

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

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

CipherKcyAndDeCiphcrKcy0;加密解密128位Public:

CRijndacl();

~C R Jjndacl();

Codc();//加密

DeCode();//解密

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

StringCode0;//加密字符

StringDeCode0;//解密字符

}

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

二、電子郵件加密和解密的實(shí)現(xiàn)過(guò)程

1、電子郵件加密的實(shí)現(xiàn)過(guò)程

在電子郵件加密的實(shí)現(xiàn)過(guò)程中,定義類CRijndael的對(duì)象,調(diào)用SetCode函數(shù)給加密密文提供對(duì)稱密鑰來(lái)設(shè)置加密密鑰,然后Code()調(diào)用Rijndael算法加密。

首先,生成加密子密鑰組,然后,打開(kāi)要加密的文件,接著進(jìn)入一個(gè)循環(huán)過(guò)程:讀取文件取到要加密的字符串,調(diào)用StringCode函數(shù)進(jìn)行字符串加密,將加密后的字符串進(jìn)行存儲(chǔ)。直到文件加密完畢,則跳出循環(huán)。這樣就對(duì)電子郵件實(shí)施了加密功能。

在電子郵件負(fù)責(zé)傳輸?shù)念怱MTP中的加密響應(yīng)函數(shù)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();//釋放緩沖區(qū)

M_StringMain.ReleaseEmaiIBuffer();

Tcmp.RcleaseEmaiIBuffcr();

M_StringAttcrEnCodFTcmp+“\o”;刪字儲(chǔ)加密后的郵件

MessageBox(”the cmail is Coded!”);

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

}

else

f GetDJgltem(IDC_EDIT_CODEF>EnableWindovKTRUE);

}

當(dāng)用戶加密電子郵件輸入密鑰后,CRijndael類的SetCode()函數(shù)將得到用戶的密鑰,接著StringCodcO函數(shù)將對(duì)電子郵件的正文文件加密。

2、電子郵件解密的實(shí)現(xiàn)過(guò)程

電子郵件解密的實(shí)現(xiàn)過(guò)程與加密過(guò)程類似,只是調(diào)用的具體函數(shù)不同,這些函數(shù)都是相應(yīng)加密函數(shù)的逆過(guò)程,其具體實(shí)現(xiàn)過(guò)程是:先定義類CRijndael的對(duì)象,調(diào)用SctCode函數(shù)給解密密文提供對(duì)稱密鑰來(lái)設(shè)置解密密鑰,然后DeCode0調(diào)用Rijndael算法進(jìn)行解密。

首先,生成解密子密鑰組,然后,打開(kāi)要解密的已被Rijndael算法加密的相應(yīng)的文件,接著進(jìn)入一個(gè)循環(huán)過(guò)程:讀取文件取到要解密的字符串,調(diào)用StringDeCode函數(shù)進(jìn)行字符串解密,將解密后的字符串進(jìn)行存儲(chǔ)。直到文件解密完畢,則跳出循環(huán)。這樣就對(duì)電子郵件實(shí)施了解密功能。

在電子郵件負(fù)責(zé)接收的類POP3中的解密響應(yīng)函數(shù)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();//施放緩沖區(qū)

M_StringCodc.RcleaseEmaiIBuffcr();//施放緩沖區(qū)

M_S tringMain.ReleascEmaiIBuffer();

M_StringMaiI=Tcmp+“\0”;

McssagcBox(“tbc cmail is Dccodedl”)

M_EditMain.Clear();


當(dāng)用戶解密電子郵件輸入密鑰后,CRijndael類的SetDeCode0函數(shù)將得到用戶的密鑰,接著StringDcCode()函數(shù)將對(duì)電子郵件的正文進(jìn)行解密。

三、電子郵件的傳輸過(guò)程

電子郵件的傳輸由用戶代理、傳輸代理、接收代理3部分組成。用戶代理是用戶端的收發(fā)信程序,負(fù)責(zé)電子郵件的打包后發(fā)送至郵件服務(wù)器或從郵件服務(wù)器取出電子郵件進(jìn)行解包。傳輸代理負(fù)責(zé)電子郵件的交換和傳輸,將電子郵件傳輸?shù)诫娮余]件代理服務(wù)器,然后接收代理將電子郵件發(fā)送到電子郵箱。現(xiàn)在傳輸代理主要是基于SMTP協(xié)議,接收代理主要是基于POP3協(xié)議。

電子郵件的具體傳輸和接收過(guò)程:

(1)發(fā)送端主機(jī)的電子郵件管理程序?qū)㈦娮余]件進(jìn)行分拆和封裝成一個(gè)或多個(gè)傳輸層協(xié)議包(TCP Packet),傳輸?shù)骄W(wǎng)絡(luò)層(IP)后,又封裝成IP包附上目的地IP地址;

(2)電子郵件軟件按照目的IP地址,確定要連接的計(jì)算機(jī),連接成功后,將IP包發(fā)送到Internet上,在Intemet上IP包經(jīng)過(guò)路由選擇和存儲(chǔ)轉(zhuǎn)發(fā)后,到達(dá)目的地計(jì)算機(jī);

(3)接收端電子郵件程序?qū)?huì)把到達(dá)的IP包進(jìn)行收集、分拆,取出信息,然后按照正確的次序?qū)⑦@些分拆后所得到包恢復(fù)成原始郵件傳送給收件人。

在具體實(shí)現(xiàn)過(guò)程中,以C++為例。電子郵件的傳輸主要定義兩個(gè)類即SMTP類和POP3類,其中類SMlP主要負(fù)責(zé)與對(duì)方的電子郵件服務(wù)器建立連接、發(fā)送郵件數(shù)據(jù)、接受郵件服務(wù)器的響應(yīng)、斷開(kāi)連接、結(jié)束等;類POP3主要負(fù)責(zé)與自己的郵件服務(wù)器建立連接、獲得授權(quán)、進(jìn)行傳輸、更新?tīng)顟B(tài)、斷開(kāi)連接等。

四、性能評(píng)價(jià)

我們通過(guò)在內(nèi)部網(wǎng)和Intemet上的測(cè)試,經(jīng)過(guò)實(shí)施加密后的郵件,非法用戶看到的只能是一堆雜亂的編碼而己,很難被解密,并且對(duì)其進(jìn)行了攻擊。結(jié)果表明加密達(dá)到了很好的效果。但是作為一種實(shí)施的對(duì)稱加密算法,由于其本身固有的缺陷,很難不被窮盡搜索方法攻擊。我們應(yīng)該探索將更好的加密技術(shù)應(yīng)用到網(wǎng)絡(luò)安全中去。

小知識(shí)之SMTP

SMTP(Simple Mail Transfer Protocol)即簡(jiǎn)單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來(lái)控制信件的中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議族,它幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地。通過(guò)SMTP協(xié)議所指定的服務(wù)器,就可以把E-mail寄到收信人的服務(wù)器上了,整個(gè)過(guò)程只要幾分鐘。SMTP服務(wù)器則是遵循SMTP協(xié)議的發(fā)送郵件服務(wù)器,用來(lái)發(fā)送或中轉(zhuǎn)發(fā)出的電子郵件。