电子邮件在网络上以“存储转发”方式传播,一封电子邮件在传送过程中可能要经过若干个中间主机的转发,途中所留下的拷贝,能被非法用户阅读、截获或者篡改。所以提高邮件系统安全性的主要措施之一是对电子邮件加密,这样邮件即使被他人截收,显示的也是一些杂乱的不能读懂的乱码。下面我们就来看看IDEA加密算法是如何给电子邮件加密的。
一、IDEA加密算法简介
IDEA加密算法是对称密码体制中的一种基于数据块的分组加密算法,整个算法包含子密钥产生、文件加密过程、文件解密过程三部分。IDEA加密算法规定明文与密文块均为64b,密钥长度为128b,加密与解密相同,只是密钥各异,其基本工作原理如图所示:
1、_IDEA加密算法文件加密过程
将明文中每64b文件块分成X1,X2,X3和X4四个子块,每一子块16b,令这4个子块作为第一轮迭代的输入,全部共8轮迭代。每轮迭代都是4个子块彼此间及16b的子密钥间进行异或运算、mod 216加法运算、mod(216+1)乘法运算,任何一轮迭代第3和第4个子块互换。最后与4个16b的子密钥进行输出变换,输出Y1~ Y4四个16b密文文件。
2、IDEA加密算法子密钥产生
IDEA加密算法经过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向左旋转移位25b得k′=k26k27…k128k1k2…k25,同样将其分成8个子密钥,前4个Z3(2)、Z4(2)、Z5(2)、Z6(2)正好是第二轮的子密钥,后4个作为第三轮的子密钥。继续向左旋转移位25b,直到52个子密钥生成完毕。
3、IDEA加密算法的文件解密过程
IDEA加密算法解密过程与加密过程完全一样,只是解密子密钥是由加密子密钥加法逆或乘法逆构成的,且两者一一对应。如解密运算的第一轮用到的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加密算法在电子邮件加密中的应用
1、电子邮件加密的实现
电子邮件正文加密,首先定义CIdea类对象,调用SetKey()函数提供对称密钥,然后EnString()调用IDEA算法实现邮件加密。该函数首先根据加密密钥UserKey调用en_key_idea()生成加密子密钥块,然后打开邮件正文,获得邮件正文的长度,并用空字符将其补成8倍数的长度,然后将其按每64b依次分块读出并调用cipher_idea()函数加密每个64b组,并将加密后的字符串存储,直到邮件正文字符串全部加密完毕,跳出循环。
在电子邮件负责传输的类SMTP中加密响应函数的部分关键代码如下:
_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、电子邮件解密实现过程
电子邮件解密过程与加密过程基本类似,其具体实现是:先定义CIdea类对象,调用SetKey()设置对称解密密钥,然后DeString()调用IDEA加密算法进行邮件解密。该函数首先根据解密密钥并调用函数de_key_idea()生成解密子密钥组。双击已接收的对应邮件主题,打开要解密的邮件密文,接着进入一个循环过程:读取要解密的字符串,用空字符将密文补成8倍数的长度,然后将其按每64b分组,并调用cipher_idea()函数解密每个64b分组,并将解密后的字符串存储。直到全部分组解密完毕,跳出循环。
在电子邮件负责接收的类POP3中解密响应函数的部分代码如下:
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);}
本系统除了基于IDEA加密算法的邮件加密、解密模块外,还集成了邮件发送模块和邮件接收模块,分别通过为smtp协议提供支持的CSMTP类,为pop3协议提供支持的CPOP类,格式化邮件头和邮件体的CMailMessage类来实现。
通过以上步骤,我们可以发现,IDEA加密算法应用于电子邮件系统中是非常有效的。
小知识对称密码:
对称密码术(也称作秘钥密码术)早已被人们使用了数千年,它有各种形式:从简单的替换密码到较复杂的构造方式。不过,数学的发展和计算能力的不断进步使得创建牢不可破的密码成为可能。对称系统通常非常快速,却易受攻击,因为用于加密的密钥必须与 需要对消息进行解密的所有人一起共享。