IDEA加密算法在電子郵件加密中的應(yīng)用

電子郵件在網(wǎng)絡(luò)上以“存儲轉(zhuǎn)發(fā)”方式傳播,一封電子郵件在傳送過程中可能要經(jīng)過若干個中間主機(jī)的轉(zhuǎn)發(fā),途中所留下的拷貝,能被非法用戶閱讀、截獲或者篡改。所以提高郵件系統(tǒng)安全性的主要措施之一是對電子郵件加密,這樣郵件即使被他人截收,顯示的也是一些雜亂的不能讀懂的亂碼。下面我們就來看看IDEA加密算法是如何給電子郵件加密的。

一、IDEA加密算法簡介

IDEA加密算法是對稱密碼體制中的一種基于數(shù)據(jù)塊的分組加密算法,整個算法包含子密鑰產(chǎn)生、文件加密過程、文件解密過程三部分。IDEA加密算法規(guī)定明文與密文塊均為64b,密鑰長度為128b,加密與解密相同,只是密鑰各異,其基本工作原理如圖所示:

1、_IDEA加密算法文件加密過程

將明文中每64b文件塊分成X1,X2,X3和X4四個子塊,每一子塊16b,令這4個子塊作為第一輪迭代的輸入,全部共8輪迭代。每輪迭代都是4個子塊彼此間及16b的子密鑰間進(jìn)行異或運(yùn)算、mod 216加法運(yùn)算、mod(216+1)乘法運(yùn)算,任何一輪迭代第3和第4個子塊互換。最后與4個16b的子密鑰進(jìn)行輸出變換,輸出Y1~ Y4四個16b密文文件。

2、IDEA加密算法子密鑰產(chǎn)生

IDEA加密算法經(jīng)過8輪迭代,每輪需要6個子密鑰,最后一輪還需4個子密鑰,因此共需52個16b子密鑰塊。輸入128b密鑰k=k1k2…k128,將其分成8個子密鑰,每個子密鑰16b,依次為:Z1(1)=k1k2…k16、Z2(1)=k17k18…k32、…、Z6(1)=k81k82…k96、Z1(2)=k97k98…k112、Z2(2)=k113k114…k128; Zi(n)表示第n輪迭代中的第i個子密鑰。Z1(1) ~Z6(1)作為第一輪的6個子密鑰,剩下的Z1(2) 、Z2(2) 作為第二輪的子密鑰。再將k向左旋轉(zhuǎn)移位25b得k′=k26k27…k128k1k2…k25,同樣將其分成8個子密鑰,前4個Z3(2)、Z4(2)、Z5(2)、Z6(2)正好是第二輪的子密鑰,后4個作為第三輪的子密鑰。繼續(xù)向左旋轉(zhuǎn)移位25b,直到52個子密鑰生成完畢。

3、IDEA加密算法的文件解密過程

IDEA加密算法解密過程與加密過程完全一樣,只是解密子密鑰是由加密子密鑰加法逆或乘法逆構(gòu)成的,且兩者一一對應(yīng)。如解密運(yùn)算的第一輪用到的6個子密鑰依次是:(Z1(9))-1、-Z2(9)、-Z3(9)、(Z4(9))-1、Z5(8)、Z6(8) 。其中-Zi表示Zi mod 216的加法逆元,即-Zi+Zi≡0 mod 216;Zi-1表示Zi mod (216+1)的乘法逆元,即ZiZi-1≡1 mod (216+1),其它依此類推。

二、IDEA加密算法在電子郵件加密中的應(yīng)用

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

電子郵件正文加密,首先定義CIdea類對象,調(diào)用SetKey()函數(shù)提供對稱密鑰,然后EnString()調(diào)用IDEA算法實(shí)現(xiàn)郵件加密。該函數(shù)首先根據(jù)加密密鑰UserKey調(diào)用en_key_idea()生成加密子密鑰塊,然后打開郵件正文,獲得郵件正文的長度,并用空字符將其補(bǔ)成8倍數(shù)的長度,然后將其按每64b依次分塊讀出并調(diào)用cipher_idea()函數(shù)加密每個64b組,并將加密后的字符串存儲,直到郵件正文字符串全部加密完畢,跳出循環(huán)。

在電子郵件負(fù)責(zé)傳輸?shù)念怱MTP中加密響應(yīng)函數(shù)的部分關(guān)鍵代碼如下:

_void OnCheckEncrypt()

_{ CIdea idea; CString temp;

int len=m_strBody.GetLength();//獲得郵件正文長度

if(m_btnEncrypt.GetCheck())

{ char*pszKey=m_strKey.GetBuffer(MAX_MAIL_LENGTH);

char*pszBody=m_strBody.GetBuffer(MAX_MAIL_LENGTH);

char*pszTemp=temp.GetBuffer(MAX_MAIL_LENGTH);

pszTemp[len+1]='\0'; idea.SetKey((unsigned char*) pszKey);//提供對稱密鑰

idea.EnString((unsigned char*) pszBody,(unsigned char*) pszTemp);

m_strAfterEncrypt=temp+"\0";//保存加密后字符串

MessageBox("郵件已被成功加密!");

GetDlgItem(IDC_EDIT_KEY) ->EnableWindow (FALSE);

}

else {GetDlgItem(IDC_EDIT_KEY) ->EnableWindow (TRUE);}

}

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

電子郵件解密過程與加密過程基本類似,其具體實(shí)現(xiàn)是:先定義CIdea類對象,調(diào)用SetKey()設(shè)置對稱解密密鑰,然后DeString()調(diào)用IDEA加密算法進(jìn)行郵件解密。該函數(shù)首先根據(jù)解密密鑰并調(diào)用函數(shù)de_key_idea()生成解密子密鑰組。雙擊已接收的對應(yīng)郵件主題,打開要解密的郵件密文,接著進(jìn)入一個循環(huán)過程:讀取要解密的字符串,用空字符將密文補(bǔ)成8倍數(shù)的長度,然后將其按每64b分組,并調(diào)用cipher_idea()函數(shù)解密每個64b分組,并將解密后的字符串存儲。直到全部分組解密完畢,跳出循環(huán)。

在電子郵件負(fù)責(zé)接收的類POP3中解密響應(yīng)函數(shù)的部分代碼如下:

void OnButtonDecrypt()

{CIdea idea;CString m_strBody,temp; //獲取密鑰和郵件正文,定義并初始化指向密鑰、郵件正文和存放密文空間的指針

idea.SetKey((unsigned char *)pszKey);

idea.DeString((unsigned char *)pszBody,(unsigned char *)pszTemp);

temp.ReleaseBuffer();

m_strKey.ReleaseBuffer();

m_strBody.ReleaseBuffer();

m_strBody=temp+"\0";

MessageBox("信件已被成功解密!");

m_editBody.Clear();

m_editBody.SetWindowText(m_strBody);}

本系統(tǒng)除了基于IDEA加密算法的郵件加密、解密模塊外,還集成了郵件發(fā)送模塊和郵件接收模塊,分別通過為smtp協(xié)議提供支持的CSMTP類,為pop3協(xié)議提供支持的CPOP類,格式化郵件頭和郵件體的CMailMessage類來實(shí)現(xiàn)。

通過以上步驟,我們可以發(fā)現(xiàn),IDEA加密算法應(yīng)用于電子郵件系統(tǒng)中是非常有效的。

小知識對稱密碼:

對稱密碼術(shù)(也稱作秘鑰密碼術(shù))早已被人們使用了數(shù)千年,它有各種形式:從簡單的替換密碼到較復(fù)雜的構(gòu)造方式。不過,數(shù)學(xué)的發(fā)展和計算能力的不斷進(jìn)步使得創(chuàng)建牢不可破的密碼成為可能。對稱系統(tǒng)通常非??焖?,卻易受攻擊,因?yàn)橛糜诩用艿拿荑€必須與 需要對消息進(jìn)行解密的所有人一起共享。