DES算法的加密解密过程和原理_第1页
DES算法的加密解密过程和原理_第2页
DES算法的加密解密过程和原理_第3页
DES算法的加密解密过程和原理_第4页
DES算法的加密解密过程和原理_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、深圳大学考试答题纸(以论文、报告等形式考核专用)二 二 学年度第 学期课程编号2315202102课程名称信息平安技术主讲教师闫巧评分学 号2007130040姓名郭一锋专业年级计算机科学与技术1班教师评语:题目:DES算法的加密解密过程和原理DES算法虽然已经渐渐的步出了人们的视野,但其可靠地平安性还是使其在我们的生活中发挥着他的余温,这个学期有幸选修了老师的信息平安技术,对计算机的平安技术方向有了一个全方位的大概了解,对与各种算法,由于本身实力缺乏,所以选择了难度中等的DES算法作为期末的作业,作业中将分几块讨论这个算法。从原理到自己所编算法中的主要局部进行详解。一共分为五局部:一、 算法

2、思想二、 算法原理描述三、 算法实现步骤DES主算法数据结构以及重要函数解析和MFC实现局部MFC按钮函数解析。四、 Des算法的完整C代码直接复制不能通过,能通过的在压缩包里,这里只是DES算法步骤的源代码。五、 心得体会。其中第一局部的算法思想和第二局部的算法原理整理取材于网上以及?密码学-c程序讲解?,而第三局部算法实现步骤、第四局部C源代码网上上交的压缩版里有完整的源代码包括MFC实现局部,这里只是列出了实现DES算法的代码、第五局部心得体会由本人完成。一、 算法思想对称分组密码设计思想的设计绝大局部是基于Feistel结构的,DES就是一种典型的Feistel结构。Feistel网络

3、结构是由Horst Feistel在Lucifer分组密码的设计中首先提出的,Feistel网络的根本元素是F函数:一种非线性、通常不可逆的、基于密匙的映射。Feistel结构最大的优点是容易保证加解密相似,这一点在实现中尤为重要,而SP网络比拟难做到这一点,但是SP网络的扩散特性比拟好。 Feistel结构使用乘积密码的概念来逼近单代密码,乘积密码是指依次使用两个或者两个以上的根本密码,所得结果的密码强度将强于单个密码的强度,本质是开发一个分组密码。对称分组密码是满足混淆和扩散原那么,每一个分组密码都是明文到密文组的变换,另一方面,混淆那么是尽可能事密文和加密密匙之间的统计关系更加复杂,以阻

4、止攻击者拥有一些密文的统计特性,而恰好 Feistel密码结构就同时拥有对称结构在实际应用中的实用性,还要密码结构所需要的平安强度,其加密算法的输入是2t位的明文和密匙K,明文被分成两局部,L0和R0,两局部经过n轮迭代后变成密码文组,第i轮迭代输入Li-1和Ri-1来自上一轮的迭代输出,每轮迭代都是相同的结构,只是输入的K不同。代换作用在数据的左半局部,它通过用论函数f作用数据的右半局部,与左半局部数据进行异或来完成。DES综合运用了置换,代换,移位多种密码技术,是一种乘积密码。在算法结构上采用迭代结构,从而使其结构清晰,调理清楚,算法为对合运算,便于实现,运行速度快。DES使用了初始置换I

5、P和IP-1各一次相应的置换看算法描述图表置换P16次,安排使用这3个置换的目的是把数据彻底打乱重排。选择置换E一方面把数据打乱重排,另一方面把32位输入扩展为48位,算法中除了S-盒是非线性变换外,其余变换均为显示变换,所以保密的关键是选择S-盒。符合以下3条准那么:1、一个S-盒而言,没有任何线性方程式等价于此S-盒的输出输入关系,即是S-盒是非线性函数。2、s-盒的任何一位输入,都会导致两位以上的输出改变,即满足"雪崩效应"。3、定某一个位的输入时,S-盒的4个出位之间,其中0和1的个数之差小。这个准的本质是数据压缩,把四位输入压缩为4位输出。选择S-盒函数的输入中任

6、意改变数位,其输出至少变化两位。因为算法中使用了16次迭代,大大提高了保密性。 二、 算法原理描述1.1 密钥生成 取得密钥从用户处取得一个64位(本文如未特指,均指二进制位)长的密码key ,去除64位密码中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥.1.1.2 等分密钥表1. 5749413325179158504234261810259514335271911360504436表2.6555473931231576254463830221466153453729211352820124把在步中生成的56位输入密钥分成均等的A,B两局部,

7、每局部为28位,参照表1和表2把输入密钥的位值填入相应的位置. 按照表1所示A的第一位为输入的64位密钥的第57位,A的第2位为64位密钥的第49位,.,依此类推,A的最后一位最后一位是64位密钥的第36位。1.1.3 密钥移位表3. i12345678 11222222i91011121314151612222221DES算法的密钥是经过16次迭代得到一组密钥的,把在步中生成的A,B视为迭代的起始密钥,表3显示在第i次迭代时密钥循环左移的位数. 比方在第1次迭代时密钥循环左移1位,第3次迭代时密钥循环左移2位. 第9次迭代时密钥循环左移1位,第14次迭代时密钥循环左移2位. 第一次迭代:A(

8、1) = (1) A B(1) = (1) B第i次迭代:A(i) = (i) A(i-1)B(i) = (i) B(i-1)1.1.4 密钥的选取表4. 1417112415328156211023191242681672720132415231374755304051453348444939563453464250362932在步中第i次迭代生成的两个28位长的密钥为把合并按照表4所示k的第一位为56位密钥的第14位,k的第2位为56位密钥的第17位,.,依此类推,k的最后一位最后一位是56位密钥的第32位。 生成与进行第i次迭代加密的数据进行按位异或的48位使用密钥:1.1.5迭代DES

9、算法密钥生成需要进行16次迭代,在完成16次迭代前,循环执行1.1.3-1.1.4步.最终形成16套加密密钥:key0 , key1 , key2 ,. key14 , key15 .1. 2 数据的加密操作1.2.1 取得数据把明文数据分成64位的数据块,不够64位的数据块以适当的方式补足。1.2.2 初始换位表5. 58504234261810260524436282012462544638302214664564840322416857494133251791595143352719113615345372921135635547393123157按照表5所示把输入的64位数据的原第58

10、位换到第一位,原第50位换到第二位,.,依此类推,最后的得到新的64位数据. OldData newData 数据扩展表6.3212345456789891011121312131415161716171819202120212223242524252627282928293031321第一次迭代以步中生成的newData作为输入数据,第i (i > 1)次迭代以第i-1次的64位输出数据为输入数据,把64位数据按位置等分成左右两局部:保持left不变,根据表6把right由32位扩展成48位把扩展后的48位right与第i次迭代生成的48位加密密钥进行按位异或操作 形成一个新的48位的

11、right. 数据压缩表7.1  123456781-80xe0x00x40xf0xd0x70x10x49-160x20xe0xf0x20xb0xd0xb0xe17-240x30xa0xa0x60x60xc0xc0xb25-320x50x90x90x50x00x30x70x833-400x40xf0x10xc0xe0x80x80x241-480xd0x40x60x90x20x10xb0x749-560xf0x50xc0xb0x90x30x70xe57-640x30xa0xa0x00x50x60x00xd表7.2 1234 56781-80xf0x30x10xd0x80x40xe0x7

12、9-160x60xf0xb0x20x30x80x40xf17-240x90xc0x70x00x20x10xd0xa25-320xc0x60x00x90x50xb0xa0x533-400x00xd0xe0x80x70xa0xb0x141-480xa0x30x40xf0xd0x40x10x249-560x50xb0x80x60xc0x70x60xc57-640x90x00x30x50x20xe0xf0x9表7.3 123456781-80xa0xd0x00x70x90x00xe0x99-160x60x30x30x40xf0x60x50xa17-240x10x20xd0x80xc0x50x70xe2

13、5-320xb0xc0x40xb0x20xf0x80x133-400xd0x10x60xa0x40xd0x90x041-480x80x60xf0x90x30x80x00x749-560xb0x40x10xf0x20xe0xc0x357-640x50xb0xa0x50xe0x20x70xc表7.4  123456781-80x70xd0xd0x80xe0xb0x30x59-160x00x60x60xf0x90x00xa0x317-240x10x40x20x70x80x20x50xc25-320xb0x10xc0xa0x40xe0xf0x933-400xa0x30x60xf0x90x00

14、x00x641-480xc0xa0xb0xa0x70xd0xd0x849-560xf0x90x10x40x30x50xe0xb57-640x50xc0x20x70x80x20x40xe表7.5 123456781-80x20xe0xc0xb0x40x20x10xc9-160x70x40xa0x70xb0xd0x60x117-240x80x50x50x00x30xf0xf0xa25-320xd0x30x00x90xe0x80x90x633-400x40xb0x20x80x10xc0xb0x741-480xa0x10xd0xe0x70x20x80xd49-560xf0x60x90xf0xc0x00

15、x50x957-640x60xa0x30x40x00x50xe0x3表7.6 123456781-80xc0xa0x10xf0xa0x40xf0x29-160x90x70x20xc0x60x90x80x517-240x00x60xd0x10x30xd0x40xe25-320xe0x00x70xb0x50x30xb0x833-400x90x40xe0x30xf0x20x50xc41-480x20x90x80x50xc0xf0x30xa49-560x70xb0x00xe0x40x10xa0x757-640x10x60xd0x00xb0x80x60xd表7.7  123456781-80x

16、40xd0xb0x00x20xb0xe0x79-160xf0x40x00x90x80x10xd0xa17-240x30xe0xc0x30x90x50x70xc25-320x50x20xa0xf0x60x80x10x633-400x10x60x40xb0xb0xd0xd0x841-480xc0x10x30x40x70xa0xe0x749-560xa0x90xf0x50x60x00x80xf57-640x00xe0x50x20x90x30x20xc表7.8  123456781-80xd0x10x20xf0x80xd0x40x89-160x60xa0xf0x30xb0x70x10x417

17、-240xa0xc0x90x50x30x60xe0xb25-320x50x00x00xe0xc0x90x70x233-400x70x20xb0x10x40xe0x10x741-480x90x40xc0xa0xe0x80x20xd49-560x00xf0x60xc0xa0x90xd0x057-640xf0x30x30x50x50x60x80xb在步中形成了48位的right值, 需要把48位的right值转换成32位的right值.把right视为由8个6位二进制块组成, a,b.h都是6位,强制转换成10进制整数的值都不大于64 ,a,bh转成10进制整数后,在对应的表中根据转换后整数值取得对

18、应位置的替代值, a对应表7.1b对应表7.2c对应表7.3d对应表7.4e对应表7.5f对应表7.6g对应表7.7h对应表7.8比方:a = 32 ,那么到表7.1中找到32的位置,把对应的替代值0x8赋给a;d = 53 ,那么到表7.4中找到的位置,把对应的替代值 0x3赋给d ;g = 16, 那么到表7.7中找到16的位置,把对应的替代值0xa赋给g;每6位用一个4位替换这样就完成了从48位向32位数据的转换.有些资料中介绍6位转4位的实现方法与本文所采用的不同,但殊途同归,最终的结果是相同的. 1.2.5 数据换位表816720212912281711523265183110282

19、41432273919133062211425把步形成的32位right根据表8进行转换:数据的原第16位换到第一位,原第7位换到第二位,.,依此类推,最后得到新的32位数据.1.2.6 交换数据把right 和left按位异或后的值赋给right,然后将本轮输入的原始right值赋给left.1.2.7 迭代.1.2.8 数据整理表940848165624643239747155523633138646145422623037545135321612936444125220602835343115119592734242105018582633141949175725为保证加密和解密的对称性

20、,DES算法的前15次迭代每完成一次迭代都要交换left和right的值,第16次迭代不交换两者的数值. 到此把32位的left和right合并成64位的Data根据表9重新调整Data的位值数据的原第40位换到第一位,原第8位换到第二位,.,依此类推,最后的得到新的64位.Data即为密文. 1.3 数据的解密数据解密的算法与加密算法相同,区别在于步中和数据进行按位异或的密钥的使用顺序不同,在加密中是按照第i次迭代就采用第i次迭代生成的密钥进行异或,而解密时第i次迭代就采用第17-i次迭代生成的密钥和数据进行异或.以上的des算法过程摘抄于网上,本次des算法的实现主要依靠于网上的这份原理。

21、而在解密方面,由于其没有详细解答,在搜索资料后,补充:1.4 DES解密解密可以表示为:(这里加些对解密算法的说明) DES加解密过程:令i表示迭代次数,程:6416,2,1), (16,2,1)64(1616111100LRIPbitikRfLRiRLbitIPRL iiiiii><明文密文初始置换IP和初始逆置换IP1Li-1(32比特)Ri-1(32比特)Li(32比特)48比特存放器,选择扩展运算E48比特存放器子密钥Ki_table(48比特)32比特存放器选择压缩运算S置换运算PRi(32比特)Li=Ri-1DES的一轮迭代DES: Function FExpansio

22、n: 32 48S-box: 6 4Permutation选择运算 32 | 01 02 03 04 | 05 04 | 05 06 07 08 | 09 08 | 09 10 11 12 | 13 12 | 13 14 15 16 | 17 16 | 17 18 19 20 | 21 20 | 21 22 23 24 | 25 24 | 25 26 27 28 | 29 28 | 29 30 31 32 | 01对每个盒,6比特输入中的第1和第6比特组成的二进制数确定的行,中间4位二进制数用来确定的列.中相应行,列位置的十进制数的4位二进制数表示作为输出.例如的输入为101001,那么行数和

23、列数的二进制表示分别是11和0100,即第3行和第4列,的第3行和第4列的十进制数为3,用4位二进制数表示为0011,所以的输出为0011.Permutation 16 07 20 21 29 12 28 17 01 15 23 26 05 18 31 10 02 08 24 14 32 27 03 09 19 13 30 06 22 11 04 25 子密钥的产生 k1(56位) (48位)Ki_table(56位) (48位)64位密钥置换选择1C0(28位) D0(28位)循环左移循环左移C1(28位) D1(28位)循环左移循环左移Ci(28位) Di(28位)置换选择2置换选择2密钥

24、表的计算逻辑循环左移: 1 1 9 1,2 1 10 2,3 2 11 2,4 2 12 2,5 2 13 2,6 2 14 2,7 2 15 2,8 2 16 1置换选择1(PC-1)和置换选择2(PC-2)三、 算法主要步骤解析算法主要分为两个局部,第一个局部是des算法的实现,即加密和解密,第二局部是程序的接口的实现和链接,以及数据处理成des可使用的64位数据结构。下面将对第一局部进行代码主要步骤的详解。第一局部des算法加解密的实现:1. 重要数据和接口函数数据结构的说明:const static char PC1_Table56/存储等分密钥时需要的乱序的换位数据static co

25、nst char E_Table48/对16次迭代输入的R边进行扩展时需要的数据const static char LOOP_Table16/密钥进行16次移位时需要的数据const static char IP_Table64 /这个数组内保存了明文初始置换需要的位置数据const static char PC2_Table48/对密钥合并后进行换位时所需的数据const static char S_Box8416/对明文和密钥异或后的数据进行6位à4位时需要的数据。 在1 16步使用P置换,第16次使用末置换。const static char P_Table32/P置换,与密钥

26、进行异或后的R边数据进行换位所需数据const static char IPR_Table64/这个数组保存了明文转换为密文最后一步置换的数据/以上是数据处理中需要的重要数据结构,下面是各种重要的接口函数的说明/static void DES_Main (char Out8, char In8, const PS_Key PS_Key, bool Type);/函数完成数值输入、转换、初始置换。别离左右边,通过F_funchange函数引用子密钥进行E_Table置换和换位,接着S盒转换,将R和L异或,前十五轮中将本轮R赋值于下一轮的L。循环16次。其中PS_Key是子密钥。static vo

27、id GetAndSetKey(const char* Key, int Number);/ 初始化密钥,对输入的密钥进行处理并引用子密钥函数static void SetMiniKey(PS_Key PS_Key, const char Key8);/ 设置子密钥,使密钥转换成64位的数,再进行等分置换操作,并在此对密钥进行16次的左移。static void F_funchange(bool In32, const bool Ki_table48);/ des算法中主要局部,对输入的32位数处理并输出48位数据,主要是16位的迭代操作static void S_Change(bool Ou

28、t32, const bool In48);/ S 盒代替,将输入的6位的数值转换位4位数static void Transform(bool *Out, bool *In, const char *Table, int Number);/ 把输入的数组的值按规定数组的值的顺序排序,并输出。Number表示输入的数组的大小static void Xor(bool *InA, const bool *InB, int Number);/ 异或,在des算法中需要用到两次static void RollRight(bool *In, int Number, int loop);/ 循环左移,完成1

29、6次的循环移位static void ChangeToBit(bool *Out, const char *In, int Bs);/ 字节组转换成位组static void ChangeToByte(char *Out, const bool *In, int Bs);/ 位组转换成字节组bool DES:Des_Start (char *Out, char *In, long dataNumber, const char *Key, int keyNumber, bool Type)/实现屡次des算法2. 重要接口函数详细说明:void Transform(bool *Out, bool

30、 *In, const char *Table, int Number) for(int i=0; i<Number; +i) CCi = In Tablei-1 ; memcpy(Out, CC, Number);这个函数中将输入的*In中 按照*Table表的顺序转换 CCi = In Tablei-1 ;按照Number的大小for(int i=0; i<Number; +i),最后赋值到输出函数中 memcpy(Out, CC, Number);是算法中比拟重要的一个函数,因为des算法中屡次需要表顺序打乱。void DES_Main(char Out8, char In8

31、, const PS_Key PS_Key, bool Type) static bool M64, CC32, *Li=&M0, *Ri=&M32;/M用于存储64位二进制,输入的是8位英文。 ChangeToBit(M, In, 64);/转换 Transform(M, M, IP_Table, 64); /按表进行换位。 if( Type = ENCRYPT )/判断是否加密 for(int i=0; i<16; +i) memcpy(CC, Ri, 32);/Ri转换到CC中 F_funchange(Ri, (*PS_Key)i);/PS_Key存储子密钥 Xor

32、(Ri, Li, 32);/R和L异或 memcpy(Li, CC, 32); /将这次的R放入下次的L else for(int i=15; i>=0; -i) memcpy(CC, Li, 32); F_funchange(Li, (*PS_Key)i); Xor(Li, Ri, 32); memcpy(Ri, CC, 32); Transform(M, M, IPR_Table, 64); ChangeToByte(Out, M, 64);函数现将输入的8位数值进行转换 ChangeToBit(M, In, 64),再开始初始置换,接着判断是否加密,加密时,按加密步骤,解密时,执行

33、加密相反步骤。加密时,Ri转换到CC中,然后通过F_funchange函数进入下步,完成之后返回经过S盒加密后的R值,再通过Xor(Ri, Li, 32)函数进行异或,赋值r进入下一次的L。解密时相同,指示顺序相反,在最后一步,通过IPR表进行数据变换,再通过ChangeToByte进行64位到8位的转换,结束。void F_funchange(bool In32, const bool Ki_table48) static bool MR48; Transform(MR, In, E_Table, 48); Xor(MR, Ki_table, 48); S_Change(In, MR); T

34、ransform(In, In, P_Table, 32);这一个函数完成des算法中大局部的操作,输入了32位的R边之后,通过E表的转换Transform(MR, In, E_Table, 48),再与密钥进行一伙操作Xor(MR, Ki_table, 48),再通过S盒的置换 S_Change(In, MR),最后P表转换Transform(In, In, P_Table, 32)。这个函数通过DES_MAIN调用而使用。void RollRight(bool *In, int Number, int loop) memcpy(CC, In, loop); memcpy(In, In+lo

35、op, Number-loop); memcpy(In+Number-loop, CC, loop);左移函数,这个函数完成循环左移的操作,利用对字符串的赋值来实现,也因此省去了for循环所使用了的实践。先将In将被移走的数赋值到一个保持的数CC中,然后将In除去移走的位数移给In 即In(Number)=In(Number+移位位数(loop);。然后将开始保存的数赋值给In的右边几位.即In(i+Number-loop) = CC.即完成循环左移void ChangeToBit(bool *Out, const char *In, int Bs) for(int i=0; i<Bs;

36、 +i) Outi = (Ini>>3>>(i&7) & 1;void ChangeToByte(char *Out, const bool *In, int Bs) memset(Out, 0, Bs>>3); for(int i=0; i<Bs; +i) Outi>>3 |= Ini<<(i&7);这两个函数一起说吧。他们是一对函数,完成相反的操作。ChangeToBit中,将Byte转换成8位机器码,同理ChangeToByte将8位机器码转换为1个字母。其中i>>3相当于i/8,i&a

37、mp;7相当于i%7, for(   int   i   =   0;   i   <   Bs;   +i)             char   chr   =   In   i   /   8   ;         Outi   =   chr   >>   (   i &

38、#160; &   7   )   &   1;      也可这样写。bool DES: Des_Start (char *Out, char *In, long dataNumber, const char *Key, int keyNumber, bool Type)if( !( Out && In && Key && (dataNumber=(dataNumber+7)&0xfffffff8) ) ) return false;GetAndSet

39、Key(Key, keyNumber);if( !Is3DES ) / 1次DESfor(long i=0,j=dataNumber>>3; i<j; +i,Out+=8,In+=8)DES_MAIN(Out, In, &MiniKey0, Type);/一次DES加密:解密 else / 3次DES 加密:加(key0)-解(key1)-加(key0) 解密:解(key0)-加(key1)-解(key0)for(long i=0,j=dataNumber>>3; i<j; +i,Out+=8,In+=8) DES_Main(Out, In, &am

40、p;MiniKey0, Type);DES_Main(Out, Out, &MiniKey1, !Type);DES_Main(Out, Out, &MiniKey0, Type);return true;这个函数完成屡次的DES算法加密,到达更高的加密效果,算法开始,对算法前面运算的数值量进行判定,如果有一个为0时,没有内存对齐操作提高运行速度,证明输入错误。否那么进行判断,假设Is3DES为真,那么开始多重加密,3次DES 加密:加(key0)-解(key1)-加(key0) 解密:解(key0)-加(key1)-解(key0)。利用DES_MAIN引导实现。第二局部MFC

41、加解密的实现:/MFC局部参考于朋友一程序。软件界面如下:主界面含有“浏览文件,“文件加密,“文件解密,“查看源代码等局部,浏览文件后,执行“翻开,翻开后会看到输入文件路径栏出现选择文件的地址,之后浏览加密后文件存放的地址,单击“文件加密,界面会显示“加密成功,加密成功后,到选择的地址查看加密后的文件,显示.aen的文件,执行翻开,输入的内容为乱码,说明加密成功。选择加密后的文件执行文件解密,查看解密后的文件,翻开,内容为明文,说明解密成功。单击查看源代码,翻开后,显示.txt文件内容。图1主界面加密:加密可以对各类格式如.txt、.doc进行加密,在输入明文路径后,可选择密文的保存路径,加密

42、成功后即可在密文的路径中找到密文文件开以查看密文。解密:此时,输入文件路径中填的是要解密的密文路径,并选择要输出的解密后的文件保存路径,可以把密文复原为明文。密钥初始值为12345678,可以根据自己的需要改动初始值,记得要记住自己的密钥。以下为演示过程:1.选择密文文件点击浏览,选择查找范围,确定文件类型,之后翻开选定的文件。浏览框显示文件存放地址。 实现代码如下:void CDESlxpDlg:Onsefile() UpdateData(TRUE);CFileDialog dlg(1,NULL,NULL,OFN_HIDEREADONLY ,"All Files(*.*)|*.*|

43、");if(IDOK!=dlg.DoModal()return;m_filename=dlg.GetPathName();UpdateData(FALSE);void CDESlxpDlg:Onsavefile() UpdateData(TRUE);CFileDialog dlg(1,NULL,NULL,OFN_HIDEREADONLY ,"All Files(*.*)|*.*|");if(IDOK!=dlg.DoModal()return;m_savefile=dlg.GetPathName();UpdateData(FALSE);2.选择密钥,默认密钥为071

44、30040void CDESlxpDlg:OnButton2() UpdateData(TRUE);/*int z = m_enc.GetLength();char *inbuff= new charz;char *skey= new charz;char *oubuff= new charz;for(int i=0;i<z;i+)inbuffi =m_enci;skeyi=m_keyi;*/char skey32; char inbuff32,oubuff32;memcpy(skey,(LPCTSTR)m_key,8);memcpy(inbuff,(LPCTSTR)m_enc,8);C

45、String strTmp,str;DES jm;jm.Des_Go(oubuff, inbuff, sizeof(inbuff),skey, sizeof(skey), DECRYPT);for(int i=0;i<8;i+) str +=oubuffi;m_back=str;UpdateData(FALSE);3. 点击加密文件。点击加密文件,开始进行des加密,控制界面代码包含在des.h中,设置类别属性为push button。属性Class的对应值为相应的编号Id为IDC_BUTTON3。具体实现代码为下void CDESlxpDlg:Onfileenc() 中,函数的代码如下

46、。void CDESlxpDlg:Onfileenc() UpdateData(TRUE);if(m_filename="")return;CFile ff(m_filename,CFile:modeRead);long lFileLen=ff.GetLength();long c=lFileLen/8;long d=lFileLen%8;if (m_savefile="")m_savefile=m_filename+".aen" CFile fp(m_savefile,CFile:modeCreate|CFile:modeWrite

47、); fp.SeekToBegin(); ff.SeekToBegin();/CString inbuff;DES jm;char inbuff8,oubuff8,skey8;/*char *cr=NULL;for(int j=0;j<16;j+) CString str=m_filekey.Mid(2*j,2);skeyj=unsigned char(strtol(str,&cr,16);*/memcpy(skey,(LPCTSTR)m_filekey,8); CTime tm1,tm2;tm1=CTime:GetCurrentTime();for(long i=0;i<

48、c;i+)ff.Read(inbuff,8);jm.Des_Go(oubuff, inbuff, sizeof(inbuff), skey,sizeof(skey), ENCRYPT);fp.Write(oubuff,8);if(d>0)ff.Read(inbuff,d);jm.Des_Go(oubuff, inbuff, sizeof(inbuff), skey,sizeof(skey), ENCRYPT);fp.Write(oubuff,8); tm2=CTime:GetCurrentTime();CTimeSpan tmSpan=tm2-tm1CString strspan=tmS

49、pan.Format("Seconds:%S"); m_sd=strspan+"s"ff.Close();fp.Close();AfxMessageBox("加密成功!");UpdateData(FALSE);4. 如果加密文件在运行会显示如图5. 选择需要解密的文件,并解密成功,如图显示.加密成功后,在选择的文件路径中找到加密文件,翻开,显示乱码,表示加密成功。其中,关键的参数设置AfxMessageBox("解密成功!");加密后的文件路径的参数,以完成数据绑定。这个函数的代码如下。void CDESlxpDlg:Onfiledec() U

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论