kaiyun官方注册
您所在的位置: 首页> 嵌入式技术> 业界动态> 基于MFC的DES算法演示平台的设计与实现

基于MFC的DES算法演示平台的设计与实现

2009-07-22
作者:周彦伟, 吴振强

摘 要:在对DES分组密码算法详细介绍的基础上,基于MFC设计实现了DES算法的可视化演示平台。该平台动态显示DES加密过程中每一阶段密文和密钥的变换情况,通过再现DES加/解密过程的途径,使人们容易理解这一复杂的迭代过程.

关键词:MFC; DES; 可视化; 密钥

随着计算机和Internet技术的普及,网络通信已经渗透到社会的各个方面,信息安全问题已受到人们极大的关注。如何保证信息在传送时不会被窃密者窃取并破译,是网络技术人员以及密码学家们所面临的问题。要想使信息可靠传输,发信者必须对所发的数据(即明文)通过加密系统变成密文,收信者收到密文后再用相应的解密系统对密文解密恢复成明文。而《密码学新动向》的发表和美国数据加密标准DES的颁布实施标志着密码学的诞生,密码学在网络安全方面发挥着越来越重要的作用。

目前常用的密码系统根据其加密方式,可分为基于信息理论的密码系统和基于复杂性理论的密码系统,前者是以香农定理为理论依据,后者则是通过复杂算法来实现,主要有RSA公钥密码算法和DES分组密码算法. 在国内,随着三金工程(金桥工程、金关工程和金卡工程)、尤其是金卡工程的启动,DES算法在Pos、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛使用,以此来实现关键数据的保密。如信用卡持卡人的PIN加密传输、IC卡与Pos间的双向认证、金融交易数据包的MAC校验等均用到DES算法。本文将详细介绍DES分组密码算法,并且设计实现基于MFC的DES算法可视化演示平台。该平台的设计与实现能方便观测DES算法加/解密过程中密文和密钥在各阶段的变化过程,形象地再现了DES算法加/解密的迭代过程。

1 DES分组密码算法

DES (Data Encryption Standard )算法是1977年由美国国家标准局NBS(National Bureau of Standard)颁布的标准,用于商业和非机密的政府应用领域的加密,是在IBM的Lucifer算法的基础上设计的,后被国家标准局采用[2]

简单地说,密码算法只不过是两种基本加密技术——混乱和扩散的组合。DES基本分组也是这些技术的组合(先代替后置换),它基于密钥作用于明文。DES有16轮,这意味着要在明文分组上16次实施相同的组合技术,如图1所示。

DES算法的入口参数有Key、Data、Mode三个,其中Key为8 B,共64 bit,是DES算法的工作密钥;Data是8 B、64 bit的被加/解密的数据;Mode为工作方式,有解密和加密两种。

在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行加密,然后以密文形式在公共通信网(如电话网)中传输到目的地后,用同样的Key对密文进行解密,便再现了明文形式的核心数据。这样就保证了核心数据在公共网络中传输的安全性和可靠性。通过定期同时更新通信网络中源端和目的端的Key,便能提高数据的保密性。

1.1 DES算法概述

DES是一个分组加密算法,一次加密64 bit的明文分组,输出是64 bit的密文分组。DES对64 bit的明文分组进行操作,首先通过一个初始置换,将明文分成左半部分和右半部分,各长32 bit,然后进行16轮完全相同的运算。经过16轮后,左、右半部分合在一起经过一个末置换(初始置换的逆过程),这样就完成了该算法。

其中Bi是第i次迭代结果,Li和Ri是Bi的左半部分和右半部分,Ki是第i轮的密钥,F是实现代替、置换及密钥异或等运算的函数。

如图2所示,从密钥的56 bit中选出48 bit,通过一个扩展置换将数据的右半部分扩展成48 bit,并通过一个异或操作与48 bit密钥结合;通过8个S盒将48 bit替代成新的32 bit数据,再将其置换一次,这四步运算构成了函数F(Ri,Ki+1)。通过一个异或运算将函数F(Ri, Ki+1)的输出与左半部分结合,原来的右半部分即成为左半部分。将该操作重复16次便实现了DES的16轮运算。

1.2 函数F(Ri,Ki+1)的计算

如图3所示,E盒扩展置换、与密钥间的异或运算、S盒压缩替代和P盒置换构成了函数F(Ri,Ki+1),函数的计算过程为:

(1)利用固定扩展E将Ri扩展成一个长度为48 bit的串E(Ri)。

并将结果分成8个长度为6的bit串。

(3) 48 bit的输入数据通过8个S盒S1、S2、S3、S4、S5、S6、S7、S8后,输出32 bit的数据Y。

(4)将长度为32 bit的串Y通过一个固定置换P,将最终的置换结果记为F(Ri,Ki+1)(0≤i≤15)。

1.3 密钥置换

DES算法一开始,由于不考虑每个字节的第8 bit,DES的密钥由64 bit减至56 bit,每个字节的第8 bit作为奇偶校验位以确保密钥不发生错误。在DES的每一轮中,从56 bit的密钥产生出不同的48 bit子密钥, 这些子密钥根据文献[3]中给出的置换方式确定。

首先,56 bit密钥被分成两部分,每部分28 bit。其次根据轮数,这两部分分别循环左移1 bit或28 bit。从第1轮到第16轮的移动位数分别为:1、1、2、2、2、2、2、2、1、2、2、2、2、2、2、1,最后从56 bit中选出48 bit。因为这个运算不仅置换了每位的顺序,同时也选择了密钥,因而被称为压缩置换,这个运算提供了一组48 bit的集。文献[4]中给出具体的压缩置换方法。例如将处在第33 bit的那一位在输出时移动到第35 bit的位置,而处于第18 bit的那一位被略去。图4所示为DES算法密钥的生成过程。

对于每一个i(0≤i≤16),有Ci=LSi(Ci-1)、Di=LSi(Di-1)、Ki=PC-2(CiDi),其中LSi表示一个或两个位置的左循环移位,不同轮次移位的位数不同。PC-1和PC-2是两种不同的基本置换。

1.4 S盒压缩

S盒是DES算法强大功能的源泉, S盒定义了DES算法的替换模式,每个S盒有16列和4行,它的每个元素是一个4 bit的块,通常用十进制表示。S盒的列号为0~15,而行号为0~3,共有8种不同的S盒。48 bit的输入数据经过S盒压缩替代后变为32 bit的输出数据。S盒的压缩替代原理为:对于每个S盒而言有6 bit的输入数据,假如输入数据为b1b2b3b4b5b6b7b8,Si盒以b1b6的值为行标,以b2b3b4b5的值为列标,在Si盒中找出相应位置的值作为输出。该值的二进制表示长度为4 bit,这样Si盒就将6 bit的输入数据压缩替代为4 bit输出数据。

参考文献[5]中详细描述了8个S盒的内部设计形式,并且总结出S盒的特征为:

(1) S盒的每行是列号的一个非线性映射,这种非线性特征给定了一个输入输出值的集合,很难预计S盒的输出。

(2) 改变S盒的一个输入位,至少会改变两位输出。

1.5 DES算法安全性描述

DES分组加密算法具有极高的安全性,到目前为止,除了穷举搜索法对DES算法攻击外,还没有发现更有效的方法。而56 bit长密钥的穷举空间为256,这就意味着,如果一台计算机的速度为一秒钟检测一百万个密钥,则它搜索完所有的密钥需要2 285年的时间,可见,这是很难实现的,随着科学技术的发展,当出现高速计算机后,可以考虑把DES密钥的长度增长一些,以提高算法的安全性,达到更高的保密程度,如3DES。

DES算法中只用到64 bit密钥中的56 bit,而第8、16、24、32、40、48、56和64 bit并没有参与DES运算,即DES的安全性是基于除这8 bit以外的其余56 bit的组合空间256得以保证的。在实际应用中,应避开这8 bit作为有效数据,才能保证DES算法安全可靠的发挥作用。如果使用密钥Key的这8 bit作为有效数据,将不能保证DES加密数据的安全性,会对运用DES来达到保密作用的系统产生的数据带来被破译的危险,留下被攻击的极大隐患。这8 bit的作用只是作为密钥的奇偶校验位,在实际应用中能比较容易地避开这8 bit用其他56 bit作为有效数据。

2 演示平台功能模块设计

根据DES算法的加/解密过程,基于MFC的DES算法可视化演示平台包含如图5所示的模块。

该演示平台主要有两大功能模块,即加密模块和解密模块,其中加密模块是将输入的8 B明文在密钥的作用下经过一系列的变换转化为十六进制的密文,在该模块中动态实现DES算法16轮中每轮密钥和密文的输出,同时给出每轮密文的内部变换过程。而解密模块是加密模块的逆过程,该模块将十六进制的密文在密钥的作用下还原为初始的明文。

3 技术实现

3.1 加密模块

(1) 密钥的产生

加密模块是对输入平台的8 bit明文进行加密,产生16进制密文的过程,这一过程中需要密钥与密文进行16轮的相关操作,而该密钥可以由用户自主输入8 B的字符,也可以由平台随机产生。密钥的随机产生函数如下:

void GetChar() //获取随机密钥

{ ……

CString String_Array='1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

str= new char[5200]; //申请内存

for(i=0;i<100;i++)//构建辅助数组,限制密钥的形式

for(j=0;j<52;j++)

str[i*52+j]= String_Array [j]; //形成序列数组

srand(GetTickCount()); //用时间做随机种子

for(i=0;i<5200;i++)

  {

  k=(rand()+i)%5200; //随机生成序号以便交换

…… //交换数组中str[i]和str[k]的值

}

…… //从辅助数组中随机选取8个字符作为密钥

delete[] str; //释放空间

}

(2) 加密过程

加密过程要求输入64 bit的明文数据,首先对该明文数据进行初始置换,在密钥控制下对输入的明文进行16轮的迭代,最后对迭代后的输出结果经过末置换变换后输出64 bit的密文数据。因为这一过程对所有传输的数据都进行了加密,所以加密过程对用户是透明的。本文加密函数的主要部分如下所示:

void DES_JiaMiFunction()

{ ……

DES_Process(); //DES处理,获取密钥与左右各32 bit密文

FinalIP(Lbts,Rbts,outbts); //末置换

……

Show_Text(m_cfile); //显示最后的加密密文

}

void DES_Process()

{ ……

GetDlgItemText(IDC_EDIT2,m_mfile); //获取明文字符串

…… //判断明文是否是8 B,将明文存储在数组中

chartobits(inch,inbts); //明文字符转化为比特流

GetDlgItemText(IDC_EDIT1,m_key); //获取密钥字符串,m_key位存放密钥的数组

……//判断密钥是否是8 B, 将密钥存储在数组中

chartobits(inkey,keybts); //密钥字符转化为比特流

InitIP(inbts,Lbts,Rbts); //初始置换,把明文比特流分成左右各32 bit分别保存在Lbts、Rbts中

pc1tran(keybts,Cbts28,Dbts28); //pc-1置换

for(cnt=0;cnt<16;cnt++)

  {

leftshift(Cbts28,ls[cnt]); //循环左移

leftshift(Dbts28,ls[cnt]); //循环左移

pc2tran(Cbts28,Dbts28,Kbts48); //pc-2置换

subkey[cnt]=Kbts48;

} //16轮密钥循环,pc-2置换后保存在数组中

for(cnt=0;cnt<16;cnt++)

{//经过16轮运算过后得到的Lbts、Rbts

oldLbts=Lbts[cnt];

Lbts[cnt+1]=Rbts[cnt];

ftran(Rbts,subkey.bitarr[cnt],fRes);

//F()函数运算

}

flag=1; //flag为全局变量,标记过程所处的阶段

}

(3) 密文内部变换过程的实现

平台需显示出每一轮操作中密文和密钥具体的变换过程,本文在实现该功能时,采用定义全局变量flag来标记变换过程所到达的阶段。因为F(Ri,Ki+1)函数中的各操作之间具有一定的先后顺序性,所以必须保证各操作按其相应的先后顺序进行。当点击相应的操作按钮(如图8所示)时,平台首先会对flag的值进行判断,根据flag的值,补充尚未进行的操作或者还原多余的操作。不同的flag值对应不同的操作阶段:flag=1加密结束;flag=2表示E盒置换完毕;flag=3表示与密钥进行了异或操作;flag=4表示S盒代替结束;flag=5表示P盒置换完成。

3.2 解密模块

在经过所有的代替、置换、异或和循环移动之后,会认为解密算法和加密算法完全不同,且像加密算法一样具有很强的混乱效果。其实恰恰相反,经过选择的各种操作,获得了一个非常有用的性质:加密和解密可使用相同的算法,即DES算法是对称的。

DES使用相同的函数来加密或解密每个分组是可能的,二者唯一的不同之处在于密钥的次序相反。就是说,如果各轮的加密密钥分别是K1、K2、K3……K16,则解密密钥就是K16、K15、K14、……K1,为各轮产生密钥的算法也是循环的。密钥向右移动,每次移动的次数分别是0、1、2、2、2、2、2、2、1、2、2、2、2、2、2、1。

void DES_JieMiFunction()

{ ……

GetDlgItemText(IDC_EDIT2,m_cfile); //获取密文 ……//判断密文是否是8 B

GetDlgItemText(IDC_EDIT1,m_key); //获取密钥

   …… //判断密钥是否是8 B,将密钥保存到数组中

chartobits(inkey,keybts); //密钥字符转化为比特流

   …… //将密文字符串中的空格去掉

   …… //将十六进制的密文数转化为二进制

InitIP(inbts,Rbts,Lbts);//初始置换

pc1tran(keybts,Cbts28,Dbts28);//pc-1置换

……//16轮密钥循环,pc-2置换

……//经过16轮运算后得到Lbts,Rbts

FinalIP(Rbts,Lbts,outbts);//末置换

   ……//将明文二进制结果转化为字符

Show_Text(m_mfile); //在文本框中显示明文

}

4 系统功能与测试

4.1 界面介绍

本平台主要包括加密和解密两大基本模块,下面将对平台的设计过程做详细介绍。

(1) 加密模块界面

在加密模块中,将16轮变换过程中的密文和密钥显示出来,同时该模块还将加密过程的内部变化过程,如E盒扩充、与密钥进行异或、S盒替换、P盒置换等操作单独显示其变换前后密文的变化情况,方便了解加密的具体过程;加密模块可以同时显示出每一轮的密钥和密文。经过一系列变换后,加密模块显示出最终的十六进制密文。

(2) 解密模块界面

该解密模块界面中将接收到的经过加密后的密文与密钥输入到该界面的文本框中,该模块经过变换后将密文还原成与其对应的明文。

4.2 演示效果测试

平台实现后,分别对该平台的加密和解密模块的效果进行了测试。

(1) 加密效果测试

本文使用系统随机产生的密钥对输入的明文进行加密效果测试。点击加密界面的“点击此处产生随机密钥” 按钮产生随机密钥:wlO6214G,同时输入明文:12点总攻。如图6所示,可以查看16轮变换过程中每一轮密钥和密文的具体值。点击“产生十六进制密文”按钮,平台显示最终的加密密文:fa 59 9f f0 1a f4 d7 11。

图7所示为加密过程中,某一轮函数F(Ri,Ki+1)计算过程中密文内部变换的演示,点击“E盒扩充”、“与密钥进行异或” “S盒替换”和“P盒置换”等按钮,文本框中将显示出该轮变换中相应操作前后密文的变化情况。

(2) 解密效果测试

加密过程结束后,记住加密过程所使用的密钥与密文,在解密模块的界面上相应文本框中输入密钥与密文,如图8所示。点击“解密”按钮,平台显示出与密文相对应的明文:12点总攻。

基于MFC的DES算法的可视化演示平台,可方便观测DES加/解密操作中各阶段密文和密钥的变化过程,本文提供了可用于网络安全教学过程的DES算法可视化演示平台。今后将进一步完善该平台,使其可以实现3DES过程的可视化演示;同时还将使平台能够通过自动读取文件实现批量数据的加密,将最终的密文写入到文件中。

参考文献

[1] 中国互联网络发展状况统计报告[EB/OL].http://tech.qq.com/a/20080724/000277.htm. 2008-9-27.

[2] 赵战生,杜虹,吕述望. 信息安全保密教程[M]. 合肥:中国科学技术大学出版社,2006:278-284.

[3] 许茂智,游林.信息安全与密码学[M]. 北京: 清华大学出版社,2007:61-70.

[4] SPILLMAN R. 经典密码学与现代密码学[M]. 叶阮健,曹英,张长富,译.北京:清华大学出版社,2005:125-141.

[5] BAUER F L. 密码编码和分析学原理与方法[M].吴世忠,宋晓龙,李守鹏,译. 北京:机械工业出版社, 2001.

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306116;邮箱:aet@chinaaet.com。
Baidu
map