资源描述
基于DES算法的数据加密解密的软件实现摘要随着信息社会的到来,人们在享受信息资源所带来的巨大的利益的同时,也面临着信息安全的严峻考验。信息安全已经成为世界性的现实问题,信息安全问题已威胁到国家的政治、经济、军事、文化、意识形态等领域,同时,信息安全问题也是人们能否护自己的个人隐私的关键。信息安全是社会稳定安全的必要前提条件。本文是一篇讨论关于常用文件加密解密算法的技术调研论文,它详细的讲述了文件加密解密算法实现的过程中所用到的方法、技术。对公钥密码体制和私钥密码体制进行了分析和研究,并对公钥密码体制和私钥密码体制的代表DES算法进行了研究。关键字:文件解密,文件加密,密码体制,DES。第一章 DES算法的技术背景介绍1.1 背景与意义DES是由美国IBM公司于20世纪70年代中期的密码算法发展而来的,在1977年1月15日,美国国家标准局正式公布实施,并得到了ISO的认可。在过去近20年的时间里,DES被广泛应用于美国联邦和各种商业信息的安全保密工作中,经受信了各种密码分析和攻击,体现出了令人满意的字全性。但随着密码分析技术和计算能力的提高,1994年,美国决定不再使用DES算法,目前DES算法已被更为安全的加解密算法取代。虽然这样,但是目前还无法将DES加密算法彻底破解掉,而且DES算法的加解密算法非常快,仍是目前使用最为普遍的对称密码算法。在国内,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡、加汕站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡人的PIN码加密伟输,IC卡与POS机之间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。1.2 系统设计1.2.1 系统主要目标基本要求部分:1能够对一个明文分组进行加密,加密后能够正确解密。2程序运行时可以输出任一组密钥。因为实现了对任意长度明加密,所以没输出每一轮加密后的结果。因为当明文长度过长时,每一轮加密结果会很多。3程序有良好的人机交互操作。较高要求部分:1如果明文不止一个分组,程序能完成分组,然后加密;最后一个分组长度不足时要求完成填充。2密钥采用ASCII码,明文输入信息可以是文字(可以是汉字或英文,要求不止一个加密分组长度),任意字符。进行加密后,能够进行正确的解密。3. 程序代码有比较好的结构,模块划分合理,用类进行封装,通过调用类的成员函数实现加密解密功能。1.2.2 运行环境本软件用C#语言编写,编写时所用的工具主要是Visual Studio。编辑成功后的.EXE文件可以在装有windows系统的任何计算机上使用。测试平台:Windows XP Professional使用软件:Microsoft Visual Studio 2005。1.2.3 功能模块密钥模块、加密模块、解密模块。第二章 相关技术的介绍和发展2.1 DES算法介绍DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。其密钥长度为56位,明文按64位进行分组,将分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。DES加密算法特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。DES工作的基本原理是,其入口参数有三个:key、data、mode。 key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。虽然56位密钥的DES算法已经风光不在,而且常有用Des加密的明文被破译的报道,但是了解一下昔日美国的标准加密算法总是有益的,而且目前DES算法得到了广泛的应用,在某些场合,仍然发挥着余热。2.2 问题解决思路基本要求部分能够对一个明文分组进行加密,加密后能够正确解密。程序运行时可以输出任一组密钥。因为实现了对任意长度明加密,所以没输出每一轮加密后的结果。因为当明文长度过长时,每一轮加密结果会很多。程序有良好的人机交互操作。较高要求部分如果明文不止一个分组,程序能完成分组,然后加密;最后一个分组长度不足时要求完成填充。密钥采用ASCII码,明文输入信息可以是文字(可以是汉字或英文,要求不止一个加密分组长度),任意字符。进行加密后,能够进行正确的解密。程序代码有比较好的结构,模块划分合理,用类进行封装,通过调用类的成员函数实现加密解密功能。2.3 DES算法的发展历程本世纪五十年代以来,密码学研究领域出现了最具代表性的两大成就。其中之一就是1971年美国学者塔奇曼(Tuchman)和麦耶(Meyer)根据信息论创始人香农(Shannon)提出的“多重加密有效性理论”创立的,后于1977年由美国国家标准局颁布的数据加密标准。 DES密码实际上是Lucifer密码的进一步发展。它是一种采用传统加密方法的区组密码。它的算法是对称的,既可用于加密又可用于解密。 美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众发出了征求加密算法的公告。加密算法要达到的目的通常称为DES密码算法要求主要为以下四点: 提供高质量的数据保护,防止数据未经授权的泄露和未被察觉的修改;具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础实现经济,运行有效,并且适用于多种完全不同的应用。 1977年1月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES枣Data Encryption Standard)。 目前在这里,随着三金工程尤其是金卡工程的启动,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。 DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。第三章 DES算法的应用3.1 DES算法详述DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其功能是把输入的64位数据块按位重新组合,并把输出分为L0 、R0两部分,每部分各长32位,其置换规则见下表: 58,50,12,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,即将输入的第58位换到第一位,第50位换到第2位,依此类推,最后一位是原来的第7位。 L0、R0则是换位输出后的两部分,L0是输出的左32位,R0 是右32位,例:设置换前的输入值为D1D2D3D64,则经过初始置换后的结果为:L0=D550D8;R0=D57D49.D7。经过26次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置的逆运算,例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换规则如下表所示: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, 放大换位表 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, 单纯换位表 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, 3.2 功能模块的应用3.2.1密钥模块private void Key(string str)/此函数用来获取密钥的数组str是密钥字符串,最后得到钥密二进制数组.用一个类成员数组key来存放。private void KeyBuild()/此函数用来构造16轮子密钥private void Keycreate(int midkey2,int movebit, int n)/此函数用来实现循环左移,同时进行PC2置换上面二个函数用来产生16轮密钥,最后存放在类成员二维数组keyArray中。private void ShowKey()/此函数用来显示密钥3.2.2加密模块private void button2_Click(object sender, EventArgs e) /加密事件加密事件包含了ArrayDes()函数;private void ArrayDes()/此函数用来对明文分组加密ArrayDes()包含PlainArray()、Key()、KeyBuild()、Keycreate()、ShowKey()和Des()函数,private void PlainArray(string str) /此函数用来获取明文字符串的二进制数组。private void Des(int, plain, int key, int n) /DES加密函数3.2.3解密模块private void button4_Click(object sender, EventArgs e) /解密事件private void Exchange()/此函数用来交换16轮密钥,把第一轮作最后一轮private void ArrayDecode()/此函数用来分组解密private void EncodeArray(string st) /此函数用来对16进制的密文转成二进制private void Decode(ref int, plain,int key,int n) /解密函数第四章 DES周边技术发展4.1 基本要求部分4.1.1 初始置换IP将IP盒分为左32位和右32位,将明文左32位和右32位分别进行IP置换,最后既实现了IP置换,同时还将明文分成了左32位和右32位,为下一步做好了准备。for (i = 0; i 32; i+) lDatai = EncodeIP1i - 1; rDatai = EncodeIP1i+32 - 1;循环变量i用来找到IP盒中下标为i的数,IPi取出该数,由于计算机中下标是从零开始计算的,而IPi表的是明文二进制中第几个数,所以应置换成明文二进制中第IPi-1那个数。4.1.2 E盒扩展private void EChange(ref int rData, ref int rDataP) for (int i = 0; i 48; i+) rDataPi = rDataEi - 1;rData表示要传入的右32位二进制明文,rDataP表示经过E盒变化后的要传回的48位。道理和IP置换差不多。也是找到E盒中相应的数,然后减1找到rData中相应的数,然后存到rDataP中。4.1.3 与密钥进行异或for (i = 0; i 48; i+) rDataPi = rDataPi keyArrayk, i; keyArray数组中存放的是16伦密钥,k表示第几伦,是从0开始计数的。rDataP是从E盒中出来的48位二进,变化完后,依然存在rDataP数组中.4.1.4 S盒变换for (i = 0; i 48; i += 6) n =i/6; linex = (rDataPi 1) + rDataPi + 5; liney = (rDataPi + 1 3) + (rDataPi + 2 2) + (rDataPi + 3 1) + rDataPi + 4; FillBin(ref rData, n, Sn, linex, liney); Linex变量指S盒的第几行,liney变量指S盒的第几列.“rDataPi1”表示左移一位。先将rDataPi这个数转成二进制,再左移一位,并在最后加零。相当于乘以2。后面是同样的道理。n=i/6;表示第几个S盒。实例把101101代入:linex=(rDataP0=1)1)+(rDataP0+5=1)=”10”+”1”=2+1=3;同理可以算出liney=6;FillBin()参数rData用来输出S盒变换后的32二进制,n第几个S盒,Sn,linex,liney对应S盒中的相应数.下面是FillBin的具体代码:private void FillBin(ref int rData, int n, int s) int temp = new int4; int i; for (i = 0; i 4; i+) /将S盒中的数转成四位二制数 tempi = s % 2; s = s / 2; for (i = 0; i 4; i+) /将每次的四位二进制数存32位rData数组中 rDatan * 4 + i = temp3 - i; 4.1.5 P置换运算for (i = 0; i 32; i+) tempi = rDatai; 先将经过S盒代替的32位存入temp数组中,主要原因是这里输入的32位和输出的32位都是存在rData数组中,如果用不同的数组来存放可以不用进行这一步。 for (i = 0; i 32; i+) rDatai = tempPi - 1; 4.1.6 与左32位进行异或for (i = 0; i 32; i+) rDatai = lDatairDatai;左322位与右32位异或后依然存放在rData数组中,作为下一轮的右32位输入.4.1.7 逆IP置换private void IP2Change(ref int lData,ref int rData,ref int Encode) int temp = new int64; int i; for (i=0; i 32; i+) tempi = rDatai; tempi + 32 = lDatai; for (i = 0; i 64; i+) Encode i = tempIP2i - 1; 本来最后一轮不应该交换左32位与右32位,但之前我们同样将它们交换了,然后在IP逆置换中将它们再交换回来。这里的temp数组就是用实现它们的交换。然后再进行IP逆置换。4.1.8 DES加密函数private void Des(int, plain, int key, int n) int lData = new int32, rData = new int32, temp = new int32, rDataP = new int48; int Encode = new int64; int i; BuildEncode(ref lData, ref rData, ref Encode, n); PlainData(ref lData, ref rData, ref Encode); for (int k = 0; k 16; k+) for (i = 0; i 32; i+) tempi = rDatai; EChange(ref rData, ref rDataP); for (i = 0; i 48; i+) rDataPi = rDataPi keyArrayk, i; SChange(ref rDataP, ref rData); PChange(ref rData); for (i = 0; i 32; i+) rDatai = lDatairDatai; for (i = 0; i 32; i+) lDatai = tempi; IP2Change(ref lData, ref rData, ref Encode); for (i= 0; i 64; i+) strkeyi = Encodei; BuildEncode(ref lData, ref rData, ref Encode, n)函数所有明文二进制数组中选出64位,并将它们分成左32位和右32位,rData存放右32位,lData存放左32位,Encode存放64位.n表示对文明进行分组加密中的第几组.PlainData(ref lData, ref rData, ref Encode)进行IP置换for (i = 0; i 32; i+) tempi = rDatai;每一轮进行变化之前先将右32位存入temp数组中,作为下一轮的左32位输入。这个循环与下面一起实现该功能for (i = 0; i 32; i+) lDatai = tempi;4.1.9 密钥交换private void Exchange() int, key1 = new int16,48; int i, j; for (i = 0; i 16; i+) for (j=0;j48;j+) key1i,j=keyArray i,j; for (i = 0; i 16; i+) for (j = 0; j 48; j+) keyArray 15-i,j = key1i,j; 解密时先要将16轮密钥进行交换。4.1.10 Decode()解密函数private void Decode(ref int, plain,int key,int n) int lData = new int32, rData = new int32, temp = new int32, rDataP = new int48; int Encode = new int64; int i; BuildEncode(ref lData, ref rData, ref Encode, n); PlainData(ref lData, ref rData, ref Encode); for (int k = 0; k 16; k+) for (i = 0; i 32; i+) tempi = rDatai; EChange(ref rData, ref rDataP); for (i = 0; i 48; i+) rDataPi = rDataPi keyArrayk, i; SChange(ref rDataP, ref rData); PChange(ref rData); for (i = 0; i 32; i+) rDatai = lDatai rDatai; for (i = 0; i 32; i+) lDatai = tempi; IP2Change(ref lData, ref rData, ref Encode); for (i = 0; i 64; i+) strkeyi = Encodei; 解密函数一开始也是进行IP置换,而不是进行IP逆置换,因为上一轮结束时的IP逆置换和解密开始的IP置换相乘够成单位矩阵。4.2 较高要求部分1实现了对任意长度的明文都能加密。最后一个明文长度不足时在后面添加二进制零,补足64明文二进制。密钥部分通过设定密钥输入框的属性来限定密钥长度最长为8个字符,当不足8个字符时,弹出友好的提示框,提醒用户输入8个字符。2密钥用ASCII码,即一个字符用8位二进制数表示。明文可以是任意字符(汉字和英文),明文一个字符用16位二进制数表示。3程序代码有比较好的结构,模块划分合理,所有功能都用类成员函数实现,整个软件用一个类实现。4界面友好,各种输入输出方便。4.2.1 分组加密实现对明文用电码本模式进行分组加密,每一个字符16位二进制,4个字符一个明文分组。相同的明文分组,将得到相同的十六进制字符。4.2.2 明文分组最后分组的填充在明文字符串转二进制时,就在一个大数组后面加零,最后计算加密轮数时分二种情况,一种情况是刚好最后一个分组明文就完了,另外一种情况是最后一个分组不足时,加密轮数为:明文字符串长度/4+1。实现代码如下:if (richTextBox1.TextLength % 4!= 0) for (int n = 0; n 4 * (richTextBox1.TextLength / 4 + 1); n = n + 4) Des(a, key, n); ShowCiphertext(); else for (int n = 0; n 2(i&4)&1;因为调研这个软件的时候看了很多别人的代码,所以学到了不少东西,我看到了有人将什么E盒变换、S盒变换、IP置换、P变换等用一个函数就实现了。再看我代码,我就感觉我的代码重用率很差。还有一些编程方面的习惯也不太好。通过此次调研我发现很多不足,以后还要去弥补这些不足。岁月如梭,匆匆而过,不知不觉已经走到了最后的路口。相对于4年前那些迷茫的眼神,现在的我有着更多的坚强与理智,而带给我这些巨大变化的正是我们辛勤耕耘的老师们。“云山苍苍,江水泱泱,先生之风,山高水长。”老师们无一不在用自己的臂膀托起我们明天的希望,他们毫不保留的奉献自己全部的知识与精力,对我们襟怀无私、谆谆教诲,倾心吐露,唯恐不尽。而同时,他们也用自己的行动和人格的力量,教会我们做人的道理,指引我们前进的方向。时间总是飞逝而过,现在的我们即将离开老师的庇护,带着老师对我们的殷切希望走向自己的工作岗位,去打拼属于自己的一片天空。但老师之风,定会永远作为我们行动的指南,陪伴激励我们向着更高、更快、更强的目标奋斗。再次向所有老师致敬。参考文献1 谭浩强C程序设计(第二版) 清华大学出版社19992杨 波 现代密码学清华大学出版社20033 郑 莉 C+语言程序设计(第三版) 20044 杨晓光 Visual C#.NET程序设计(修订本) 20065 石 磊 赵慧然 网络安全与管理 清华大学出版社 20096 朱彦军 DES算法及其在VC+6.0下的实现 航天工程研究所 2008附件: 软件截图如下
展开阅读全文