《网络与信息安全课程设计报告加密软件设计.doc》由会员分享,可在线阅读,更多相关《网络与信息安全课程设计报告加密软件设计.doc(21页珍藏版)》请在三一办公上搜索。
1、网络与信息安全课程设计报告 班级: 学号:姓名:题目:加密软件设计评阅:成绩:目录摘要21 数据加密概述及DES算法由来31.1 数据加密概述31.2 DES算法由来32 DES算法原理及算法实现42.1 DES算法原理42.2 DES算法详述62.3利用C语言实现DES算法93 DES的应用误区及加密软件的实现193.1 DES的应用误区193.2 加密软件的实现19参考资料:20摘要密码学是网络安全的基础,在安全领域密码学是最主要的分支之一,众多的网络安全技术都是基于密码学的。数据加密是所有数据安全技术的核心,其在网络上的作用是防止重要的或私有化信息在网络上截获或篡改。目前,数据加密技术已
2、经被普遍应用于计算机网络信息的安全管理中。本次课程设计即使要完成一项加密软件的设计,利用DES算法,通过编写源代码,调试和运行序完成加密解密的实现,最后实现加密软件界面。本人利用C语言编写程序,主要完成的任务是搜集加密技术的相关资料,程序的编写调试,以及最后的软件实现。 关键字:数据加密,DES算法,程序设计,网络安全1 数据加密概述及DES算法由来1.1 数据加密概述 在互联网上进行文件、电子商务往来等信息传输时存在许多不安全因素,尤其是一些机密文件在网络传输时,信息安全显得尤其重要。不安全性是互联网的存在基础TCP/IP协议所固有的,因此解决这一问题的方案就是加密,加密后的数据被别人获取后
3、,在解密之前是不可读的。 加密的目的是防止机密信息泄露,同时还可以用于验证信息源的真实性,验证所接受到的数据的完整性。通常将加密前的原始数据或消息称为明文,经过加密得到的代码称为密文。数据加密的逆过程称为数据解密,即将密文转化为明文的过程。只有利用相应的密钥对密文进行解密,才能够显示明文的内容,通过这样的途径能够保护数据不被非授权的访问者非法窃取。加密技术通常分为两大类:常规密钥密码体制和公开密钥密码体制。所谓常规密钥密码体制,是指加密密钥与解密密钥相同的密码体制。这种加密系统又称为对称密钥系统。美国政府采用的DES加密标准就是一种典型的对称式加密算法。公开密钥密码体制使用不同的加密密钥和解密
4、密钥,采用非对称的加密算法,RSA算法就是其中使用最广泛的算法之一。1.2 DES算法由来美国国家标准局1973年开始研究除国防部门外的其他部门的计算机系统的数据加密标准,于1973年5月15日和1974年8月27日先后两次向公众征求加密算法的公告。加密算法要达到的目的(通常称为DES密码算法要求)主要为以下四点:(1) 提供高质量的数据保护,防止数据未经授权的泄漏和未被察觉的修改;(2) 具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握;(3) DES密码体制的安全性应该不依赖于算法的保密,其安全性仅以加密密钥的保密为基础;(4) 实现经济,运行有效,并且适用于多
5、种不同的应用。1977年1月,美国政府正式许可以IBM公司设计的方案作为非机密数据的数据加密标准(Data Encryption Standard,DES)。DES算法已经应用于许多需要安全加密的场合,UNIX的密码保护算法就是以DES算法为基础的。2 DES算法原理及算法实现2.1 DES算法原理DES是一个分组加密算法(如图2-1)。 明文按64位进行分组,密匙长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。图2-1 对称密码体制分组密码加
6、密示意图DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。简单地说,算法只不过是加密的两个
7、基本技术混乱和扩散的组合。DES基本组建分组是这些技术的一个组合(先替代后置换)。它基于密钥作用于明文,这就是众所周知的轮。DES有16轮,这意味着在明文分组上16次实施相同的组合技术,如图2-2所示。在图2-2中,DES对64bit的明文分组进行操作。通过一个初始置换,将明文分为左半部分和右半部分,各为32bit长。然后进行16轮完全相同的迭代,在迭代过程中数据与密钥结合。经过16轮后,左、右部分合在一起经过一个逆置换,该算法就完成了。DES加密算法特点:分组比较短、密钥太短、密码生命周期短、运算速度较慢。图2-2 DES算法示意图2.2 DES算法详述 DES算法把64位的明文输入块变为6
8、4位的密文输出块,它所使用的密钥也是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位,.,依此类推,最后一位是原来的
9、第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0 是右32位,例:设置换前的输入值为D1D2D3.D64,则经过初始置换后的结果为:L0=D550.D8;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
10、,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,2
11、4,14,32,27, 3, 9,19,13,30, 6,22,11, 4,25,在f(Ri,Ki)算法描述图中,S1,S2.S8为选择函数,其功能是把6bit数据变为4bit数据。下面给出选择函数Si(i=1,2.8)的功能表:选择函数SiS1: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,S2:15,1,8,14,6,11,3,4,9,
12、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,S3: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,S4:7,13,14,3,0
13、,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,S5: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,13,6,15,0,9,10,4,5,3,S6:1
14、2,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,S7: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
15、,3,12,S8: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,在此以S1为例说明其功能,我们可以看到:在S1中,共有4行数据,命名为0,1、2、3行;每行有16列,命名为0、1、2、3,.,14、15列。现设输入为: DD1D2D3D4D5D6令:列D2D3D4D5行D1D6然后在S1表中查得对应的数,以4位二进制表示,此即为选择函数S1
16、的输出。下面给出子密钥Ki(48bit)的生成算法从子密钥Ki的生成算法描述图中我们可以看到:初始Key值为64位,但DES算法规定,其中第8、16、.64位是奇偶校验位,不参与DES运算。故Key 实际可用位数便只有56位。即:经过缩小选择换位表1的变换后,Key 的位数由64 位变成了56位,此56位分为C0、D0两部分,各28位,然后分别进行第1次循环左移,得到C1、D1,将C1(28位)、D1(28位)合併得到56位,再经过缩小选择换位2,从而便得到了密钥K0(48位)。依此类推,便可得到K1、K2、.、K15,不过需要注意的是,16次循环左移对应的左移位数要依据下述规则进行:循环左移
17、位数1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1以上介绍了DES算法的加密过程。DES算法的解密过程是一样的,区别仅仅在于第一次迭代时用子密钥K15,第二次K14、.,最后一次用K0,算法本身并没有任何变化。2.3利用C语言实现DES算法 /* Provided by wangjunchuan, Northeastern University */#include #include #include / 初始置换表const static char IP_Table64 = 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28,
18、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;/ 逆初始置换表const static char IPR_Table64 = 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,38, 6
19、, 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;/ 扩展置换表static const char Extension_Table48 = 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 1
20、6, 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;/ P盒置换表const static char P_Table32 = 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;/ 密钥置换表 const static char PCK_Table56 = 57, 49,
21、 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;/ 压缩置换表 const static char PCC_Table48 = 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,23, 19, 12,
22、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;/ 每轮移动的位数 const static char LOOP_Table16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;/ S盒设计const static char S_Box8416 = / S盒1 14, 4, 13,1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15
23、, 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,/ S盒2 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,
24、 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,/ S盒3 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,/ S盒
25、4 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,/ S盒5 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,14, 11, 2, 12, 4, 7, 13, 1
26、, 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,/ S盒6 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
27、, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,/ S盒7 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,/ S盒8 13, 2, 8, 4, 6, 15,
28、 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;typedef bool (*PSubKey)1648;enum ENCRYPT,DECRYPT;static bool SubKey21648;/ 16圈子密钥static bool Is3DES;/ 3次
29、DES标志static char Tmp256, deskey16;/*static void DES(char Out8, char In8, const PSubKey pSubKey, bool Type);/标准DES加/解密static void SetKey(const char* Key, int len);/ 设置密钥static void SetSubKey(PSubKey pSubKey, const char Key8);/ 设置子密钥static void F_func(bool In32, const bool Ki48);/ f 函数static void S_fu
30、nc(bool Out32, const bool In48);/ S 盒代替static void Transform(bool *Out, bool *In, const char *Table, int len);/ 变换static void Xor(bool *InA, const bool *InB, int len);/ 异或static void RotateL(bool *In, int len, int loop);/ 循环左移static void ByteToBit(bool *Out, const char *In, int bits);/ 字节组转换成位组stati
31、c void BitToByte(char *Out, const bool *In, int bits);/ 位组转换成字节组/ TypeENCRYPT:加密,DECRYPT:解密/ 输出缓冲区(Out)的长度 = (datalen+7)/8)*8,即比datalen大的且是8的倍数的最小正整数/ In 可以= Out,此时加/解密后将覆盖输入缓冲区(In)的内容/ 当keylen8时系统自动使用3次DES加/解密,否则使用标准DES加/解密.超过16字节后只取前16字节bool DES_Act(char *Out,char *In,long datalen,const char *Key,
32、int keylen,bool Type = ENCRYPT);*/ 字节转换函数void ByteToBit(bool *Out, const char *In, int bits) for(int i=0; i3(i&7) & 1;/ 比特转换函数void BitToByte(char *Out, const bool *In, int bits) memset(Out, 0, bits3); for(int i=0; i3 |= Ini(i&7);/ 变换函数void Transform(bool *Out, bool *In, const char *Table, int len) f
33、or(int i=0; ilen; +i) Tmpi = In Tablei-1 ; memcpy(Out, Tmp, len);/ 异或函数的实现void Xor(bool *InA, const bool *InB, int len) for(int i=0; ilen; +i) InAi = InBi;/ 轮转函数void RotateL(bool *In, int len, int loop) memcpy(Tmp, In, loop); memcpy(In, In+loop, len-loop); memcpy(In+len-loop, Tmp, loop);/ S函数的实现void
34、 S_func(bool Out32, const bool In48) for(char i=0,j,k; i8; +i,In+=6,Out+=4) j = (In01) + In5; k = (In13) + (In22) + (In31) + In4;ByteToBit(Out, &S_Boxijk, 4); / F函数的实现void F_func(bool In32, const bool Ki48) static bool MR48; Transform(MR, In, Extension_Table, 48); Xor(MR, Ki, 48); S_func(In, MR); Tr
35、ansform(In, In, P_Table, 32);/ 设置子密钥void SetSubKey(PSubKey pSubKey, const char Key8) static bool K64, *KL=&K0, *KR=&K28; ByteToBit(K, Key, 64); /转换格式 Transform(K, K, PCK_Table, 56); / 由56位密钥产生48位子密钥 for(int i=0; i16?16:len);SetSubKey(&SubKey0, &deskey0);Is3DES = len8 ? (SetSubKey(&SubKey1, &deskey8)
36、, true) : false;/ DES加解密函数void DES(char Out8, char In8, const PSubKey pSubKey, bool Type) static bool M64, tmp32, *Li=&M0, *Ri=&M32; ByteToBit(M, In, 64); Transform(M, M, IP_Table, 64); if( Type = ENCRYPT ) for(int i=0; i=0; -i) memcpy(tmp, Li, 32); F_func(Li, (*pSubKey)i); Xor(Li, Ri, 32); memcpy(R
37、i, tmp, 32); Transform(M, M, IPR_Table, 64); BitToByte(Out, M, 64);/ DES加解密函数(可以对长明文分段加密)bool DES_Act(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type) if( !( Out & In & Key & (datalen=(datalen+7)&0xfffffff8) ) ) return false;SetKey(Key, keylen);if( !Is3DES ) / 1次DESfor(long
38、 i=0,j=datalen3; i3; ij; +i,Out+=8,In+=8) DES(Out, In, &SubKey0, Type);DES(Out, Out, &SubKey1, !Type);DES(Out, Out, &SubKey0, Type);return true;void main()/ 密钥设置char key=0,2,1,0,9,4,5,1,7,8,5,0,7,2,8; / 设置明文char plain_text= Welcome to DES world! It is wonderful! ;char encrypt_text255; / 密文char decrypt_text255; / 解密文memset(encrypt_text,0,sizeof(encrypt_text);memset(decrypt_text,0,sizeof(decrypt_text);printf