DES加密算法实现论文_第1页
DES加密算法实现论文_第2页
DES加密算法实现论文_第3页
DES加密算法实现论文_第4页
DES加密算法实现论文_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

PAGE第一章前言 21.1概述 21.1.1信息安全的重要性 21.1.2分组加密算法的知识 21.1.3DES加密算法简介 31.1.4本论文工作的意义 31.2本论文的主要工作 4第二章DES加密算法的描述 52.1DES算法的来历 52.2加密过程 52.3每个循环的详细过程 72.4密钥的产生 102.5DES的解密 10第三章DES算法软件实现的详细设计 113.1DES加密算法详细设计 113.2DES解密算法详细设计 153.3算法函数 16第四章测试 174.1测试平台和方法 174.2正确性测试 17第五章DES加密软件工具 195.1人机界面的功能介绍: 195.2状态—事件—响应流程图 205.3.人机界面的效果图 22第六章结束语 246.1体会与收获 246.2展望 24参考文献 25附录1算法原代码 26附录2人机界面程序代码 35致谢 48第一章前言1.1概述1.1.1信息安全的重要性随着计算机网络和Internet的发展,全球信息化己成为人类社会发展的大趋势。在今天的信息社会里,科学技术的研究和发展及商业等方面,无一不与信息息息相关,数据安全保密问题也日益突出,人们不能靠用降低信息共享度的简单方法来解决问题,唯一可行的方案是积极解决信息共享和网络安全的问题。由于计算机网络具有联结形式多样性、终端分布不均匀性和网络开放性等特征,致使网络容易受到黑客及恶意软件和其他不轨的攻击,Internet的安全问题已经成为了信息发展的一块绊脚石。本课题研究的是DES加密算法,本算法是经历20多年的考验,抗住了多年的密码分析的经典算法。随着信息技术的发展和越来越广泛的应用,整个社会的运转越来越密切地依赖于信息技术,依赖于各种基础信息系统的正常运转,依赖于储存在信息系统中各种重要信息的正确维护和正常使用。信息安全问题,可以说是关系到国家社会的稳定安全、企业的兴衰存亡,公众的生活幸福,这个问题将显得越来越重要。在我国,近年来信息安全问题也日益突出,信息安全和网络安全问题也成为社会性问题,不仅政府部门、金融部门重视,而且企业事业单位和个人都日益重视这一重要问题。所以,网上信息的安全和保密是信息时代的迫切需要。如何保护信息的安全使之不被窃取及不至于被篡改或破坏,己成为当今被普遍关注的重大问题;如何充分利用现有的技术手段来保护已有信息的安全是一个有广泛应用前景的课题。1.1.2分组加密算法的知识分组加密算法属于对称加密算法。对称算法又可以叫做传统密码算法,就是加密密钥能够从解密密钥中推算出来,反过来也成立。在大多数对称算法中,加/解密密钥是相同的。这些算法也叫做秘密密钥算法或者单密钥算法,它要求发送者和接收者在安全通信之前,商定一个共享的密钥。对称算法的安全性依赖于密钥,泄露密钥就意味着任何人都能够对消息进行加/解密。只要通信需要保密,密钥就必须保密。对称算法的加密和解密表示为,见图1.1.图1.1对称加密算法Fig1.1Symmetryencryptionalgorithm对称算法可以分为两类,包括分组加密算法和序列加密算法。本论文讨论的DES算法就是一种分组加密算法。分组加密算法是对明文的一组位(bit)进行运算,这些位组称为分组。现代计算机密码算法的典型分组长度为64位或者128位。分组长度的选择需要大到足以防止分析破译,但又要小到足以方便使用。虽然现在有很多人都在研究着大密钥加密算法,但是经过20多年考验,抗住了多年的密码分析的经典算法DES加密算法还是具有很高的研究价值的。1.1.3DES加密算法简介数据加密标准(DataEncryptionStand,DES)DES也被称为DEA(数据加密算法)。是IBM公司在70年代为硬件应用而设计的,其前身为Lucifer。美国政府于1976年开始采用DES,经过20多年的时间DES仍然使用广泛。对与DES加密算法来说,DES使用56位密钥对64位的数据进行加密,并对64位数据块进行16轮编码。与每轮编码时,一个48位的“每轮”密钥值由56位的完整密钥得出来。如Mode为加密,则用Key

去把数据Data进行加密,

生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。对信息进行加密的目地就是保证信息在大多数的情况下能够进行安全的传输和保存。本课题在使用大量运算的多轮迭代计算的复杂条件下,研究如何提高算法效率是本课题的创新点。1.1.4本论文工作的意义在众多加密算法中每种算法都有自己的优缺点,相比较而言,对称密钥算法(如DES)速度要比RSA快的多。如果想在网络上实现非常高的传输速率,就必须选择对称密钥算法进行加密。RSA还有另外一个问题就是密钥长度很长,这使它在许多网络上传播也带来了复杂性。另外RSA在软件的实现时间上也远远不及DES。并且DES经历里20多年的考验,抗住了多年的密码分析,所以在一切都讲究速率的今天,DES在国内外还是有应用价值的。由前面的介绍可知,DES算法是一个比较优秀的加密算法。本论文的工作就是用软件实现DES算法。我们的工作一方面可以为生产和生活实践提供一种高强度的加密工具,用来保护合法重要信息的安全性;另一方面我们的工作也为加密算法的研制与开发提供一个实现范例,给出一个算法实现的性能基准。1.2本论文的主要工作本论文的主要工作包括(一)对算法描述进行充分理解,精确理解算法的各个步骤。(二)完成DES算法软件实现的详细设计(三)用C语言或者C++完成该算法模块的编程工作,同时尽量考虑程序的优化。(四)编制测试代码,在具体的平台上测试该实现的正确性,给出测试结果。(五)在算法模块文件的基础上,用VC++开发一个用于对磁盘文件进行加解密的实用工具程序。第二章DES加密算法的描述2.1DES算法的来历在20世纪60年代末IBM设计了一个由HorstFeistel领导的计算机密码编码学方面的研究项目,这个任务在1971年结束时研制出了一种称为LUCIFER[FEIS73]算法,这个算法卖给了伦敦的劳埃德保险公司,用于一个也是由IBM所研发的现金分配系统。1973年美国标准局NBS(NationalBureauofStandards)征求国家密码标准方案,IBM就提交了其Tuchman-Meyer项目的结果。这是当时提出的最好的方法。因而在1977年被选为数据加密标准。这就是著名的DES加密算法。以下关于DES加密算法原理,参见文献[1-6]2.2加密过程DES的总体方案如图2.1所示。与其他任何一种加密方案一样,加密函数有两个输入:待加密的明文和密钥。.在这里,明文的长度必须为64bit,而密钥的长度为56bit。64bit密文64bit密文K16K2K1初始置换逆初始置换32bit对换第16轮第2轮第1轮置换选择2置换选择2置换选择2循环左移循环左移循环左移置换选择164bit明文56bit密钥图2.1DES加密算法的一般描述Fig2.1TheDESencryptsthegeneraldescriptionofthecalculateway观察这张图的左边部分,可以看到明文的处理经过了三个阶段。首先,64bit的明文经过一个初始置换IP[表2.1(a)]后,比特重排产生了经过置换的输入。.接下来的一个阶段是由对同一个函数进行16次循环组成的,这个函数本身既包含有置换又包含有替代函数。最后一个循环(第16个)的输出由64bit组成,它是输入明文和密钥的函数,这个输出的左边和右边两个部分经过交换后就得到预输出。最后,预输出通过一个逆初始置换(IP-1)[表2.1(b)]就生成了64bit的密文,这个置换是初始置换的逆置换。除了出始和最终置换以外,DES具有严格的Feidtel密码结构。图二的右半部分给出了56bit密钥的使用方式.密钥首先通过一个置换函数,接着对于16个循环的每一个,都通过一个循环左移操作和一个置换操作的组合产生出一个子密钥Ki。对每一个循环来说,置换函数是相同的,但由于密钥比特的重复移位,产生的子密钥并不相同。表2.1DES的置换表Table2.1DESdisplacement(a)初始置换(IP)(b)逆初始置换(IP-1)5850423426181026052443628201246254463830221466456484032241685749413325179159514335271911361534537292113563554739312315740848165624643239747155523633138646145422623037545135321612936444125220603835343115119592734242105018582633141949175725(c)扩展置换(E)3248121620242812345678910111213141516171819202122232425262728293031325913172125291(d)置换函数(P)16720212912281711523265183110282414322739191330622114252.3每个循环的详细过程图2.2给出了一循环的内部结构。在这里仍然先把注意力集中到图形的左半部分。每个64bit的中间结果的左右两个部分被当成两个独立的32bit数值处理,分别标记为L(左)和R(右)。与任何古典的Feistel密码中一样,每一个循环的总的处理过程都可以总结为下列公式:L[i]=R[i-1]R[i]=L[i-1]⊕F(R[i-1],K[i])在这个循环中使用的密钥Ki的长度是48bit。输入的R的长度是32bit。这个输入的R先被扩展到48bit,扩展操作由表2.1(c)定义,它由包括一个置换和一个包含重复使用R中16个比特的扩展操作组成。所得到的48bit再和Ki进行异或。这样得到的48bit结果再经过一个置换函数S产生32bit的输出,最后按照表2.1(d)进行置换。WilliamStallings对此进行过详细的研究[4]。323248324848扩展\置换(E表)32比特置换(P)L[i+1]R[i+1]D[i+1]C[i+1]28比特28比特32比特L[i]R[i]D[i]C[i]XOR替代\选择(S盒)XOR左移左移置换\压缩(置换选择2)K[i]图2.2DES算法的一个循环[4]Fig2.2AS盒子在函数中的作用是替代由一组8个S盒子完成,其中每一个都接受6个比特作为输入并产生4个比特作为输出。这些变换是由表2.2定义的,这个表的使用方法如下:盒子Si的输入的第一和最后一个比特构成一个2位二进制数,用来选择由Si表中的四行所定义的四种替代的一种,中间的4个比特则选出一列.被上述行和列所选择的单元的十进制数码转换为一个4bit的二进制表示就产生了输出。表2.2DES的S盒子的定义Table2.2ThedefinitionoftheDESSboxS11441312151183106125907015741421311061211953841148136211151297310501512824917511314100613S21518146113497213120510313471528141201106911501471110413158126932151381013154211671205149S31009146315511312711428137093461028514121115113649815301112125101471101306987415143115212S47131430691012851112415138115615034721211014910690121171315131452843150610113894511127214S52124171011685315130149141121247131501510398642111101378159125630141181271142163150910453S61211015926801334147511101542712956113140113891415528123704101131164321295151011141760813S74112141508133129751061130117491101435122158614111312371410156805926111381410795015142312S813284615111109314501271151381037412561101492711419121420610131535821147410813151290356112.4密钥的产生回到图2.1和图2.2,在图中可以看到做为算法输入的56bit密钥首先经过一个置换,这个置换由一个叫作置换选择1的表[表2.3(a)]确定,得到的56bit密钥被当成两个28bit的量C0和D0。在每一个循环中,Ci-1和Di-1分经过一个由表[2.3(c)]确定的1bit和2bit的循环左移,这些经过移位的值在作为下一个循环的输入。它们同时作为置换选择2的[表2.3(b)]的输入,产生48bit输出则作为函数f(Ri-1,K)的输入。表2.3用于DES密钥调度计算的表Table2.3TheDESKDCattemperaccount(a)置换选择1(PC-1)57494133251791585042342618102595143352719113605244366355473931231576254463830221466153455729211352820124(b)置换选择2(PC-2)141711241532815621102319124268167220132415231374755304051453348444939563453464250362932(c)左移调度循环序号12345678910111213141516转动比特数11222222122222212.5DES的解密DES解密是以密文作为算法的输入,但是以相反的次序使用子密钥Ki。这也就是说在第一轮用K16,在第二轮用K15,如此等等,直到在最后一轮使用K1。第三章DES算法软件实现的详细设计3.1DES加密算法详细设计算法1DES_ENC(X64)ExterualIP,inIP,EXT,POS,SBOX1,……SBOX8globalK48[1-16]State64IP(x64)Fori1to16Do{令state64=SL32||SR32temp48EXT(SL32)temp48temp48+K48[i]令temp48=t6[1]||t6[2]||t6[3]||t6[4]||t6[5]||t6[6]||t6[7]||t6[8]t4[1]SBOX[1](t6[1])t4[2]SBOX[2](t6[2])t4[3]SBOX[3](t6[3])t4[4]SBOX[4](t6[4])t4[5]SBOX[5](t6[5])t4[6]SBOX[6](t6[6])t4[7]SBOX[7](t6[7])t4[8]SBOX[8](t6[8])temp32=t4[1]||t4[2]||t4[3]||t4[4]||t4[5]||t4[6]||t4[7]||t4[8]temp32POS(temp32)SR32temp32⊕SL32SL32SR32}令State64=SL32||SL32State64SR32||SL32State64invIP(State64)ReturnState64算法2初始置换(IP)IP(X64)ConstArray[1-64],{58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7}令X64=x1[1]||x1[2]||……||x1[64]Y64=y1[1]||y1[2]||……||y1[64]Fori1to64do{y1[i]=x1[ConstArrayi]}returny64算法3逆初始置换(IP-1)invIP(m64)ConstArray[1-64],{40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,38,35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25}令X64=m1[1]||m1[2]||……||m1[64]Y64=n1[1]||n1[2]||……||n1[64]Forg1to64do{y1[i]=x1[ConstArrayi]}returny64算法4扩展置换(E)EXT(x32)ConstArray[1-48],{32,1,2,3,4,5,4,5,6,7,8,9,8,9,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,1}令X32=x1[1]||x1[2]||……||x1[32]Y64=y1[1]||y1[2]||……||y1[48]Forj1to48do{y1[i]=x1[ConstArrayi]}returny48算法5置换函数(P)POS(m32)ConstArray[1-32],{16,7,20,2,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25}令m32=m1[1]||m1[2]||……||m1[32]Y64=n1[1]||n1[2]||……||n1[32]Fori1to32do{y1[i]=x1[ConstArrayi]}returnn32算法6关于S盒算法S盒1SBOX1(m6)ConstArray[0-3],[0-15]{14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13}令m6=m1[1]||m1[2]||……||m1[6]N4ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]*4+m1[4]*2+m1[5]]Returnn4S盒2SBOX2(m6)ConstArray[0-3],[0-15]{15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9}令m6=m1[1]||m1[2]||……||m1[6]N4ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]*4+m1[4]*2+m1[5]]Returnn4S盒3SBOX3(m6)ConstArray[0-3],[0-15]{10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12}令m6=m1[1]||m1[2]||……||m1[6]N4ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]*4+m1[4]*2+m1[5]]Returnn4S盒4SBOX4(m6)ConstArray[0-3],[0-15]{7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,}令m6=m1[1]||m1[2]||……||m1[6]N4ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]*4+m1[4]*2+m1[5]]ReturnN4S盒5SBOX5(m6)ConstArray[0-3],[0-15]{2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,11,8,12,7,1,14,2,16,3,15,0,9,10,4,5,3}令m6=m1[1]||m1[2]||……||m1[6]N4ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]*4+m1[4]*2+m1[5]]ReturnN4S盒6SBOX6(m6)ConstArray[0-3],[0-15]{12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,}令m6=m1[1]||m1[2]||……||m1[6]N4ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]*4+m1[4]*2+m1[5]]ReturnN4S盒7SBOX7(m6)ConstArray[0-3],[0-15]{4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,}令m6=m1[1]||m1[2]||……||m1[6]N4ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]*4+m1[4]*2+m1[5]]ReturnN4S盒8SBOX8(m6)ConstArray[0-3],[0-15]{13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,2,1,14,7,4,10,8,13,,15,12,9,0,3,5,6,11,}令m6=m1[1]||m1[2]||……||m1[6]N4ConstArray[m1[1]*2+m1[6],m1[2]*8+m1[3]*4+m1[4]*2+m1[5]]Returnn43.2DES解密算法详细设计算法1DES_DEC(X64)ExterualIP,inIP,EXT,POS,SBOX1,……SBOX8globalK48[1-16]State64IP(x64)Fori16to1STEP-1Do{令state64=SL32||SR32temp48EXT(SL32)temp48temp48+K48[i]令temp48=t6[1]||t6[2]||t6[3]||t6[4]||t6[5]||t6[6]||t6[7]||t6[8]t4[1]SBOX[1](t6[1])t4[2]SBOX[2](t6[2])t4[3]SBOX[3](t6[3])t4[4]SBOX[4](t6[4])t4[5]SBOX[5](t6[5])t4[6]SBOX[6](t6[6])t4[7]SBOX[7](t6[7])t4[8]SBOX[8](t6[8])temp32=t4[1]||t4[2]||t4[3]||t4[4]||t4[5]||t4[6]||t4[7]||t4[8]temp32POS(temp32)SR32temp32⊕SL32SL32SR32}令State64=SL32||SL32State64SR32||SL32State64invIP(State64)ReturnState643.3算法函数voidencfile(LPCTSTRIn,LPCTSTROut);加密文件voiddecfile(LPCTSTRIn,LPCTSTROut);解密文件voidsetkey(constunsignedchar*);设置密钥voidenctransform(constunsignedchar*,unsignedchar*);分组加密voiddectransform(constunsignedchar*,unsignedchar*);分组解密以上是TJUT_DES.H文件中定义的函数,该文件参见附录1第四章测试4.1测试平台和方法我们采用的测试平台为:CPU是奔腾2.2G,内存为512M的IBMR40笔记本电脑,操作系统为WINDOWSXP。4.2正确性测试测试方法为:本课题的正确性测试采用磁盘文件的DES加密实用工具1.0版,在加密测试时先输入明文在输入密钥后加密。当进行解密测试时与之相反。DES算法测试用数据如下:密钥

名文

密文000000000000000000000000000000008CA64DE9C1B123A7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7359B2163E4EDC5830000000000000001000000000000001958E6E627A05557B11111111111111111111111111111111F40379AB9E0EC5330123456789ABCDEF111111111111111117668DFC7292532D11111111111111110123456789ABCDEF8A5AE1F81AB8F2DD000000000000000000000000000000008CA64DE9C1B123A7FEDCBA98765432100123456789ABCDEFED39D950FA74BCC47CA110454A1A6E5701A1D6D039776742690F5B0D9A0131D9619DC1376E5CD54CA83DEF57DA7A389D10354BD27107A1133E4A0B26860248D43806F67172868EBB51CAB4599A3849674C2602319E51454B582DDF440A7178876E01F19B2A04B915BA43FEB5B642FD443059577FA2AF37FB421F8C0113B970FD34F2CE059B5E0851CF143A86A560F0170F175468FB5E60756D8E0774761D20CD3DA020021DC0943297FAD38E373FE762514B829BF486AEA676B2CB7DB2B7A07A7137045DA2A163BDD119049372802DFD64A815CAF1A04689104C2FD3B2F26955F6835AF609A5C513C37D06BB516CB7546164D5E404F2752320A2AEEAE3FF4AB771F08260D1AC2465E6B056E18759F5CCAEF1BF03E5DFA575A584023641ABA6176004BD6EF0917606288BF0DB6D70DEE56025816164629B007480D39006EE762F2A49793EBC79B3258F437540C8698F4FB05E1515AB73A7072D43A0770752922F22E49BAB7CA1AC49E95D6D4CA229BF02FE55778117F12A5A6B612CC26CCE018310DC409B26D61D9D5C5018F728C21C587F1C13924FEF305532286D6F295A01010101010101010123456789ABCDEF617B3A0CE8F071001F1F1F1FE0FEE0FEF1FEF1FE0123456789ABCDEFEDBFD1C66C0000000000000000FFFFFFFFFFFFFFFF355550B2150E2451第五章DES加密软件工具5.1人机界面的功能介绍:本人机界面是为DES算法设计的能对磁盘文件、文字串、16进制数进行加密或解密。当对这三种其中任何一种进行加密或解密时其他两种的输入行将变灰,即不能对其他两种形式的数据进行同时加密。加密方面,无论是对磁盘文件、文字串、16进制数其中的那一种执行操作,在密钥的输入方面的控制是相同的,就是需要进行两种判断:第一是输入的米钥长度是否符合要求,第二是两次输入的密钥长度是否相同。如果有一项不符的话,将弹出对话框提示重新设置。当密钥符合要求后将根据控制变量来判断加密的种类。如果是对磁盘文件进行加密,加密后的密文将以.enc结尾。如果是对文字串和16进制数进行加密的话直接会显示出加密后的密文。解密方面唯一与加密不同点就是对磁盘文件解密后的明文将以.dec结尾。此人机界面还加有关于本软件的版本介绍。5.2状态—事件—响应流程图开始开始等待输入状态1调出主窗口见图5.3.1磁盘文件radiobutton十六进制radiobutton文字串radiobutton12a=1“打开文件”button可用“输入文件名”editbox可用“输入文字串”editbox不可用“输入十六进制串”editbox不可用“加密”button可用“解密”button可用“输入密钥”editbox可用“确认密钥”editbox可用a=2“打开文件”button不可用“输入文件名”editbox不可用“输入文字串”editbox可用“输入十六进制串”editbox不可用“加密”button可用“解密”button可用“输入密钥”editbox可用“确认密钥”editbox可用a=3“打开文件”button不可用“输入文件名”editbox不可用“输入文字串”editbox不可用“输入十六进制串”editbox可用“加密”button可用“解密”button可用“输入密钥”editbox可用“确认密钥”editbox可用等待输入状态1等待输入状态1等待输入状态1(a)图5.1状态—事件—响应流程图Fig5.1predicament-affair-respondflowchart返回状态1Y返回状态1YYNNY加密button解密button密钥长度合理两次输入密钥长度相同提示“密钥长度不对!请重新设置”返回状态1提示“密钥设置不一至!请重新设置返回状态1a=1a=3a=2打开文件取处文件名用加密算法在显示的文件名后家.nec后缀读取输入的文字串用加密算法显示加密结果读取输入的十六进制数用加密算法显示加密结果YNYYNNNY密钥长度合理两次输入密钥长度相同提示“密钥长度不对!请重新设置”返回状态1提示“密钥设置不一至!请重新设置返回状态1a=1a=3a=2读取输入的十六进制数用加密算法显示解密结果NYYYN打开文件取处文件名用解密算法在显示的文件名后家.dec后缀读取输入的文字串用解密算法显示加密结果1返回状态1返回状态1返回状态1返回状态1返回状态1(b)图5.1状态—事件—响应流程图Fig5.1predicament-affair-respondflowchart打开文件打开文件button关于选中“退出”等待输入状态2用户选中文件按下打开按钮返回响应文件名等待输入状态1弹出显示文件版本信息对话框见图5.3.3等待状态2结束2调出标准的文件打开窗口见图5.3.2(c)图5.1状态—事件—响应流程图Fig5.1predicament-affair-respondflowchart5.3.人机界面的效果图图5.2人机界面的效果图1Fig5.2Theresultdiagramoftheman-machineinterface1图5.3人机界面的效果图2Fig5.3Theresultdiagramoftheman-machineinterface2图5.4人机界面的效果图3Fig5.4Theresultdiagramoftheman-machineinterface3第六章结束语6.1体会与收获此次毕业设计,历经了5个多月的时间,从一开始的无从下手,到整个程序的完成,无不渗透着老师的细心指导,和我们不懈的努力。在开发过程中遇到了许多技术和逻辑上的问题,技术问题通过学习软件使用以及实例的参考都是可以的攻克的,逻辑问题可以说是经验的积累,遇到的多了,自然就迎刃而解了,但这是建立在不断的磨练与探索上的。4月中旬,该系统就已经基本完成,稍后又作了些许的改动。现如今,这个系统已经完成,完全符合当时的预想,在我看来,也是比较完善的一个系统。1、这次锻炼了自己的实践动手能力,现在的设计与以后的设计是一样的,都需要实践和探索创新的能力。所以这是一个积极探索,大胆创新的机会。2、通过这次学习,对C++有了很好的了解,也知道了它的功能和强大的生命力。通过此次设计,明白了掌握一门知识就是一种财富,能够多学习一门语言对自己的发展是很重要的。更要学习、发展,提高自己的自学能力,在学校里先不断的充实自己,为今后参与开发稍大规模实际软件项目和探索未知领域而做准备。6.2展望由于是第一次接触关于对称加密算法,对DES加密算法的学习也只是个初步的过程,本课题开发的人机界面只能完整的完成对于文件、字符串和16进制串的加解密。对DES算法的其他更深奥的知识了解的还是远远不够的,我会在今后的日子里不断的学习,去改进和完善本课题内容,使之更加的全面。参考文献[1]胡建伟等.网络安全与保密(第一版).西安:电子科技大学出版社,200334-43[2]冯登国.计算机通信网络安全.北京:清华大学出版社,200145-47[3]卢开澄.计算机密码学.北京:清华大学出版社,200045-49[4]WilliamStallings.扬明,胥光辉,齐望东等译.密码编码学与网络安全原理与实践(第二版).北京:电子工业出版社,200138-73[5]DavidSalomon.蔡建,梁志敏译.数据保密与安全.北京:清华大学出版社,2005[6]BruceSchneier.吴世忠,祝世雄,张文正等译.应用密码学.北京:机械工业出版社,2001147-153附录1算法原代码//TJUT_DES.H//头文件#ifndef__TJUT_DES_H__#define__TJUT_DES_H__#include<string>#include<fstream>usingnamespacestd;classDES{public: //DES(); ~DES(){} voidencfile(LPCTSTRIn,LPCTSTROut); voiddecfile(LPCTSTRIn,LPCTSTROut); voidsetkey(constunsignedchar*); voidenctransform(constunsignedchar*,unsignedchar*); voiddectransform(constunsignedchar*,unsignedchar*);private: enum{BLOCKSIZE=8}; enum{DATA_LEN=384,BUFF_LEN=1024}; /* unsignedcharenckey[16][48]; unsignedchardeckey[16][48]; */ boolenckey[16][48]; booldeckey[16][48]; //initialpermutationIP conststaticunsignedcharIP_Table[64]; //finalpermutationIP^-1 conststaticunsignedcharIPR_Table[64]; //expansionoperationmatrix conststaticunsignedcharE_Table[48]; //32-bitpermutationfunctionPusedontheoutputoftheS-boxes conststaticunsignedcharP_Table[32]; //permutedchoicetable(key) conststaticunsignedcharPC1_Table[56]; //permutedchoicekey(table) conststaticunsignedcharPC2_Table[48]; //numberleftrotationsofpc1 conststaticunsignedcharLOOP_Table[16]; //TheS-boxes conststaticunsignedcharS_Box[8][4][16]; voidDES::F_func(boolIn[32],constboolKi[48]); voidDES::S_func(boolOut[32],constboolIn[48]); voidDES::Transform(bool*Out,bool*In,constunsignedchar*Table,intlen); voidDES::Xor(bool*InA,constbool*InB,intlen); voidDES::RotateL(bool*In,intlen,intloop); voidDES::ByteToBit(bool*Out,constunsignedchar*In,intbits); voidDES::BitToByte(unsignedchar*Out,constbool*In,intbits); charTmp[256];};#endif//__TJUT_DES_H__//TJUT_DES_TOOLDlg.cpp:implementationfile//TJUT_DES.CPP//DES算法代码#include"stdafx.h"#include"TJUT_DES.H"#include<stdio.h>#include<assert.h>#include<stdlib.h>#include<string>#include<cassert>#include<exception>#include<strstream>usingnamespacestd;//initialpermutationIPconstunsignedcharDES::IP_Table[64]={ 58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4, 62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8, 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7};//finalpermutationIP^-1constunsignedcharDES::IPR_Table[64]={ 40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31, 38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,60,28,35,3,43,11,51,19,59,27, 34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25};//expansionoperationmatrixconstunsignedcharDES::E_Table[48]={ 32,1,2,3,4,5,4,5,6,7,8,9, 8,9,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,1};//32-bitpermutationfunctionPusedontheoutputoftheS-boxesconstunsignedcharDES::P_Table[32]={ 16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10, 2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25};//permutedchoicetable(key)constunsignedcharDES::PC1_Table[56]={ 57,49,41,33,25,17,9,1,58,50,42,34,26,18, 10,2,59,51,43,35,27,19,11,3,60,52,44,36, 63,55,47,39,31,23,15,7,62,54,46,38,30,22, 14,6,61,53,45,37,29,21,13,5,28,20,12,4};//permutedchoicekey(table)constunsignedcharDES::PC2_Table[48]={ 14,17,11,24,1,5,3,28,15,6,21,10, 23,19,12,4,26,8,16,7,27,20,13,2, 41,52,31,37,47,55,30,40,51,45,33,48, 44,49,39,56,34,53,46,42,50,36,29,32};//numberleftrotationsofpc1constunsignedcharDES::LOOP_Table[16]={ 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};//The(in)famousS-boxesconstunsignedcharDES::S_Box[8][4][16]={ //S1 14, 4, 13, 1,2,15,11,8,3,10,6,12,5,9,0,7, 0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8, 4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13, //S215,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10, 3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5, 0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9, //S310,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8, 13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1, 13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12, //S47,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15, 13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9, 10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14, //S52,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9, 14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6, 4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3, //S612,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11, 10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8, 9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13, //S74,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1, 13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6, 1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12, //S813,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11};voidDES::setkey(unsignedcharconst*userkey/*用户输入的64位密钥首地址*/){staticboolK[64],*KL=&K[0],*KR=&K[28];ByteToBit(K,userkey,64);Transform(K,K,PC1_Table,56);for(inti=0;i<16;++i) {RotateL(KL,28,LOOP_Table[i]);RotateL(KR,28,LOOP_Table[i]);Transform(enckey[i],K,PC2_Table,48); //dec[i]=? }}voidDES::enctransform(constunsignedchar*In/*待解密的64位数据首地址*/,unsignedchar*Out){ boolM[64],tmp[32],*Li=&M[0],*Ri=&M[32];ByteToBit(M,In,64);Transform(M,M,IP_Table,64);for(inti=0;i<15;i++){ memcpy(tmp,Ri,32); F_func(Ri,enckey[i]); Xor(Ri,Li,32); memcpy(Li,tmp,32); } memcpy(tmp,Ri,32); F_func(Ri,enckey[15]); Xor(Li,Ri,32); memcpy(Ri,tmp,32);Transform(M,M,IPR_Table,64);BitToByte(Out,M,64);}voidDES::dectransform(constunsignedchar*In/*待加密的64位数据首地址*/,unsignedchar*Out){ boolM[64],tmp[32],*Li=&M[0],*Ri=&M[32];ByteToBit(M,In,64);Transform(M,M,IP_Table,64);for(inti=15;i>0;i--){ memcpy(tmp,Ri,32); F_func(Ri,enckey[i]); Xor(Ri,Li,32); memcpy(Li,tmp,32); } memcpy(tmp,Ri,32); F_func(Ri,enckey[0]); Xor(Li,Ri,32); memcpy(Ri,tmp,32);Transform(M,M,IPR_Table,64);BitToByte(Out,M,64);}voidDES::encfile(LPCTSTRIn,LPCTSTROut){ intt=strlen("Thisfileisaencryptedfile."); CFile*in; CFile*out; in=newCFile; out=newCFile; if(!in->Open(In,CFile::shareDenyNone|CFile::modeRead)) { ostrstreamostr; ostr<<"AESERROR:CannotopeninputFile!"<<ends; stringostrMsg=ostr.str(); ostr.freeze(false); throwruntime_error(ostrMsg); } if(!out->Open(Out,CFile::shareDenyNone|CFile::modeCreate|CFile::modeWrite)) { ostrstreamostr; ostr<<"AESERROR:CannotopenoutputFile!"<<ends; stringostrMsg=ostr.str(); ostr.freeze(false); throwruntime_error(ostrMsg); } inttotaltime=in->GetLength()/8; intlastlength=in->GetLength()%8; charpt[8],ct[8]; char*ppt=pt,*cct=ct; inti; for(i=0;i<totaltime;i++) { in->Read(pt,8); enctransform(reinterpret_cast<unsignedchar*>(ppt),reinterpret_cast<unsignedchar*>(cct)); out->Write(ct,8); } if(lastlength) { in->Read(pt,lastlength); memset(pt+lastlength,0,8-lastlength); enctransform(reinterpret_cast<unsigned

温馨提示

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

评论

0/150

提交评论