電子郵件傳輸中加密與解密的實(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。

其中,加密器把經(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ā)出的電子郵件。









