关键字 IDEA;电子邮件;加密;解密
目前电子邮件是Internet上主要的信息传输手段,也是电子商务应用的主要途径之一。电子邮件在网络上以“存储转发”方式传播,一封电子邮件在传送过程中可能要经过若干个中间主机的转发,途中所留下的拷贝,能被非法用户阅读、截获或者篡改。目前Internet中邮件系统大多实现了邮件收发、管理功能,却无法保障电子邮件安全性、完整性、抗抵赖性、不可否认性等问题。提高邮件系统安全性的主要措施之一是对邮件内容加密,这样邮件即使被他人截收,显示的也是一些杂乱的不能读懂的乱码,但合法用户通过拥有的密钥对邮件解密而正确地阅读邮件,这样就达到了数据保密的功能,大大提高了邮件系统的安全性。
2 邮件系统工作原理
2.1 邮件系统的构成
一个电子邮件系统包含用户代理,传输代理和协议三大部分。用户代理是一个用户端发信和收信程序;传输代理负责信件交换和传输,又可将其细分为邮件发送传输代理和邮件接收传输代理;协议,包括用于发送邮件的SMTP和用于接收邮件的POP3。[1]
2.2 电子邮件的传输过程
(1)发送方邮件管理程序将邮件进行拆分并封装成一个或多个TCP邮包。TCP邮包按照IP协议封装成IP包,并附上目的计算机的IP地址。
(2)根据目的IP地址确定与哪一台计算机相连,若连接成功,便将IP邮包送上网络。
(3)IP邮包在传递过程中,经过路由选择,通过某些主机的存储转发,最后到达接收邮件的目的计算机。
(4)在接收端,将IP邮包收集起来,按照正确的次序将其复原成初始的邮件。
3 网络信息加密技术
计算机网络安全问题所涉及的内容非常广泛,ISO7498-2提出了五种计算机安全防护措施:认证、访问控制、数据保密、数据完整性、防止否认,而数据加密是实现所有安全服务的基础。 目前密码体制主要有两大类:一类是对称密码体制,包括序列密码和分组密码,如DES、IDEA算法;另一类是非对称密码体制,包括双钥加密模型和双钥认证模型,如RSA算法[2]。两种密码体制各有优缺点,对称密码体制,密钥管理过于复杂,难以解决对数签名验证的问题,而非对称密码体制,加、解密速度慢,算法实现效率低。
本文结合IDEA算法,描述了VC编程环境下邮件加密和解密的实现过程,保障了邮件传输的安全性。
4 IDEA算法简介
IDEA算法是对称密码体制中的一种基于数据块的分组加密算法,整个算法包含子密钥产生、数据加密过程、数据解密过程三部分。该算法规定明文与密文块均为64b,密钥长度为128b,加密与解密相同,只是密钥各异,其基本工作原理如图1所示。

图1 IDEA工作原理
4.1 数据加密过程
将明文中每64b数据块分成X1,X2,X3和X4四个子块,每一子块16b,令这4个子块作为第一轮迭代的输入,全部共8轮迭代。每轮迭代都是4个子块彼此间及16b的子密钥间进行异或运算、mod 216加法运算、mod(216+1)乘法运算,任何一轮迭代第3和第4个子块互换。最后与4个16b的子密钥进行输出变换,输出Y1~ Y4四个16b密文数据。IDEA算法结构如图2所示。

图2 IDEA算法结构
4.2 IDEA子密钥产生[3]
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个子密钥生成完毕。
4.3 数据解密过程
算法解密过程与加密过程完全一样,只是解密子密钥是由加密子密钥加法逆或乘法逆构成的,且两者一一对应。如解密运算的第一轮用到的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),其它依此类推。
5 IDEA算法抽象类的设计
将IDEA算法抽象成一个C++类CIdea,该类可以直接被应用在需要应用加密技术的软件中。用户可以调用该类提供的接口函数来实现加密/解密功能。下面是CIdea类的文本描述,相应接口函数的实现可参考文献4。
class CIdea
{private:
bit8 UserKey[16]; //加密、解密密钥
bit16 EnSubKeys[52]; //加密子密钥
bit16 DeSubKeys[52];
void en_key_idea(bit8 *userkey,bit16 *Z);
void cipher_idea(bit8 *bu1,bit8 *bu2,bit16 *Z);
//加密解密64b数据
public:
void EnString(unsigned char*,unsigned char*);
//加密字符串方法
void DeString(unsigned char*,unsigned char*);
int IdeaEncrypt(char *f1,char *f2); //加密方法
int IdeaDecrypt(char *f1,char *f2);
bit16 inv(bit16 x); //乘法求逆
void SetKey(unsigned char *);//设置密钥
};
6 基于IDEA算法的邮件加密和解密实现过程
6.1 邮件加密实现
邮件正文加密,首先定义CIdea类对象,调用SetKey()函数提供对称密钥,然后EnString()调用IDEA算法实现邮件加密。该函数首先根据加密密钥UserKey调用en_key_idea()生成加密子密钥块,然后打开邮件正文,获得邮件正文的长度,并用空字符将其补成8倍数的长度,然后将其按每64b依次分块读出并调用cipher_idea()函数加密每个64b组,并将加密后的字符串存储,直到邮件正文字符串全部加密完毕,跳出循环。