密码学课程设计报告_第1页
密码学课程设计报告_第2页
密码学课程设计报告_第3页
密码学课程设计报告_第4页
密码学课程设计报告_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上 成绩: 2016-2017学年第1学期密码学原理课程设计题目:基于三重DES的文件加密解密系统设计与实现 学院名称: 班级学号: 学生姓名: 教师姓名: 2016年 12 月 一、设计要求学生在进行课程设计时应该满足以下具体要求:Ø 要求在设计的过程中,建立清晰的模块;Ø 设计良好的交互界面,如要求用户输入密钥、明文字符串、得到相应的解密字符串等;Ø 高级要求:加密、解密中文、用到的数据如明文、密文全部采用文件形式存储。(可选)二、开发环境与工具开发环境:Windows平台开发工具:Visual Studio 2013三、设计原理(算法

2、工作原理)l DES全称为Data Encryption Standard,即数据加密标准,是一种使用的块算法。l DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。l DES设计中使用了分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。扩散的作用就

3、是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。l DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位(实际用到了56位,第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)。 DES算法流程 l 其算法主要分为两步:1)初始置换其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位依此类推,最后一位是原来的第7位

4、。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3D64,则经过初始置换后的结果为:L0=D58D50D8;R0=D57D49D7。其置换规则见下表: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,2)逆置换经过16次迭代运

5、算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。此算法是体系中的代表,在计算机网络系统中广泛使用。Ø 3DES(即Triple DES)是DES向AES过渡的,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。Ø 该方法使用两个密钥,执行三次DES算法,加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。3DES加密过程为:C=Ek3(Dk2(Ek1(P) 3DES解密过程为:P=Dk1(EK2(Dk

6、3(C)Ø 采用两个密钥进行三重加密的好处有:两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为 168bit的三个密钥,会产生不必要的开销。加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样有效的实现了与现 有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一 样,有助于逐渐推广三重DES。三重DES具有足够的安全性,目前还没有关于攻破3DES的报道。四、系统功能描述与软件模块划分/十进制-十六进制对照表const static char Hex_Table = 0, 1, 2, 3, 4, 5, 6, 7, 8

7、, 9,'A', 'B', 'C', 'D', 'E', 'F'/十六进制-二进制对照表const static char Bit_Table164 = 0, 0, 0, 0 , 0, 0, 0, 1 , 0, 0, 1, 0 , 0, 0, 1, 1 , 0, 1, 0, 0 , 0, 1, 0, 1 , 0, 1, 1, 0 , 0, 1, 1, 1 , 1, 0, 0, 0 , 1, 0, 0, 1 , 1, 0, 1, 0 , 1, 0, 1, 1 , 1, 1, 0, 0 , 1, 1,

8、0, 1 , 1, 1, 1, 0 , 1, 1, 1, 1 ;/置换选择I表const static char KeyRar_Table = 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;/置换选择II表const static

9、 char Rar_Table = 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;/初始置换IP表const static char IP_Table = 58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 20, 12, 4,62, 54, 4

10、6, 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;/扩展函数E表const static char Exp_Table = 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

11、, 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_Table = 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;/逆初始置换P_1表const static char P_1_Table = 40, 8, 48, 16, 56, 24, 64, 32,39, 7,

12、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;/S盒const static char S_Box864 = /* S1 */ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,0, 1

13、5, 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, 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

14、, 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 ,

15、/* S4 */ 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 ,/* S5 */ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,14, 11, 2, 12, 4

16、, 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 */ 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

17、, 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, 3, 12 ,/* S8 */ 13,

18、 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 ;#include"table.h"char CipherText200;char K56; /置换选择I后的密钥比特流char Round_Key1648; /

19、轮密钥,最后一位为结束符char Li32, Ri32; /明文比特流左32位和右32位char E49; /选择运算E后比特流char S32; /保存经过S盒后的输出/字符串转换比特流函数/Input保存用户输入的字符数组,Bit保存用户输入的比特流void CharToBit(char* Input, char* Bit)int length = 0, j = 0, k = 0;char Hex30; /保存十六进制for (int i = 0; Inputi != '0' i+)int temp = (int)Inputi;if (temp / 16)int temp1

20、 = (int)Hex_Tabletemp / 16;Hexj+ = temp1 + 48;if (temp % 16 < 10)temp1 = (int)Hex_Tabletemp % 16;Hexj+ = temp1 + 48;elseHexj+ = Hex_Tabletemp % 16;elseHexj+ = (char)48;if (temp % 16 < 10)int temp1 = (int)Hex_Tabletemp % 16;Hexj+ = temp1 + 48;elseHexj+ = Hex_Tabletemp % 16;for (int i = 0; i <

21、; j; i+)if (Hexi >= '0'&&Hexi <= '9')for (int m = 0; m < 4; m+)Bitk+ = (int)Bit_TableHexi - 48m + 48;else if (Hexi >= 'A'&&Hexi <= 'F')for (int m = 0; m < 4; m+)Bitk+ = (int)Bit_TableHexi - 65 + 10m + 48;Bitk = '0'/置换选择I函数void

22、 Replace_I(char* K, char* Key) /K为置换选择I后的密钥比特流,Key为初始密钥比特流for (int i = 0; i < 56; i+)Ki = KeyKeyRar_Tablei - 1;/轮密钥生成函数void Round_Key_Func(char* Key) /Key为初始密钥比特流int Left_Move; /左移位数int m;char temp;Replace_I(K, Key); /置换选择Ifor (int i = 0; i<16; i+) /16轮密钥产生if (i = 0 | i = 1 | i = 8 | i = 15)Le

23、ft_Move = 1;elseLeft_Move = 2;for (int k = 0; k<Left_Move; k+) /分左右两块循环左移temp = K0;for (m = 0; m < 27; m+)Km = Km + 1;K27 = temp;temp = K28;for (m = 28; m < 55; m+)Km = Km + 1;K55 = temp;for (int j = 0; j < 48; j+) /压缩置换并储存Round_Keyij = KRar_Tablej - 1;/初始置换IP函数void Replace_IP(char* Mess

24、age, char* Li, char* Ri)int p = 0, q = 0;for (int i = 0; i<64; i+)if (i < 32)Lip+ = MessageIP_Tablei - 1;elseRiq+ = MessageIP_Tablei - 1;/扩展函数Evoid Extend_Func(char* E, char* Ri)for (int i = 0; i < 48; i+)Ei = RiExp_Tablei - 1;/异或运算void Xor(char* a, char* b, int length)for (int i = 0; i <

25、; length; i+)int temp1 = ai - 48;int temp2 = bi - 48;ai = char(temp1temp2 + 48);/置换运算P函数void Replace_P(char* Ri, char* S)for (int i = 0; i<32; i+)Rii = SP_Tablei - 1;/逆初始置换IP_1函数void Replace_IP_1(char* CipherText, char* Li, char* Ri)char temp64;for (int i = 0; i < 64; i+)if (i < 32)tempi =

26、Rii;else if (i < 64)tempi = Lii - 32;for (int i = 0; i < 64; i+)CipherTexti = tempP_1_Tablei - 1;五、设计核心代码#include<iostream>#include"Function.h"using namespace std;/DES加解密函数void DES(char* Key,char* Message,int Mode) /Mode:0为加密,1为解密int row, column; Round_Key_Func(Key);char M565;

27、/将明文比特流分为64位一组char temp65;int m = 0; /明文比特流分组数int length = 0; /比特流长度int k = 0, flag = 0; for (int i = 0; Messagei != '0' i+)length+;/明文比特流以64为一组分组for (; m < 5; m+)for (int j = 0; j < 64; j+)if (k<length)Mmj = Messagek+;elseflag = 1;Mmj = '0'Mm64 = '0'if (flag)break;i

28、f (Mode = 0)if (length = 128)for (int n = 0; n < m; n+)Replace_IP(Mn, Li, Ri);for (int round = 0; round < 16; round+)char Ri_Copy33; /保存明文比特流右半部份for (int i = 0; i<32; i+)Ri_Copyi = Rii;Extend_Func(E, Ri);char temp48;for (int i = 0; i < 48; i+)tempi = Round_Keyroundi;Xor(E, temp, 48);for

29、(int i = 0; i<8; i+) /S盒置换row = (Ei * 6 - 48) * 2 + (Ei * 6 + 5 - 48);column = (Ei * 6 + 1 - 48) * 8 + (Ei * 6 + 2 - 48) * 4 + (Ei * 6 + 3 - 48) * 2 + (Ei * 6 + 4 - 48);Si * 4 + 3 = char(S_Boxirow * 16 + column % 2 + 48);Si * 4 + 2 = char(S_Boxirow * 16 + column / 2) % 2 + 48);Si * 4 + 1 = char(S

30、_Boxirow * 16 + column / 4) % 2 + 48);Si * 4 = char(S_Boxirow * 16 + column / 8) % 2 + 48);Replace_P(Ri, S);Xor(Ri, Li, 32);for (int i = 0; i<32; i+)/交换左右明文Lii = Ri_Copyi;Replace_IP_1(temp, Li, Ri);for (int q = 0; q < 64; q+)CipherTextn * 64 + q = tempq;elsefor (int n = 0; n < m + 1; n+)Rep

31、lace_IP(Mn, Li, Ri);for (int round = 0; round < 16; round+)char Ri_Copy33; /保存明文比特流右半部份for (int i = 0; i<32; i+)Ri_Copyi = Rii;Extend_Func(E, Ri);char temp48;for (int i = 0; i < 48; i+)tempi = Round_Keyroundi;Xor(E, temp, 48);for (int i = 0; i<8; i+) /S盒置换row = (Ei * 6 - 48) * 2 + (Ei *

32、6 + 5 - 48);column = (Ei * 6 + 1 - 48) * 8 + (Ei * 6 + 2 - 48) * 4 + (Ei * 6 + 3 - 48) * 2 + (Ei * 6 + 4 - 48);Si * 4 + 3 = char(S_Boxirow * 16 + column % 2 + 48);Si * 4 + 2 = char(S_Boxirow * 16 + column / 2) % 2 + 48);Si * 4 + 1 = char(S_Boxirow * 16 + column / 4) % 2 + 48);Si * 4 = char(S_Boxirow

33、 * 16 + column / 8) % 2 + 48);Replace_P(Ri, S);Xor(Ri, Li, 32);for (int i = 0; i<32; i+)/交换左右明文Lii = Ri_Copyi;Replace_IP_1(temp, Li, Ri);for (int q = 0; q < 64; q+)CipherTextn * 64 + q = tempq;elsefor (int n = 0; n < m; n+)Replace_IP(Mn, Li, Ri);for (int round = 15; round >= 0; round-)ch

34、ar Ri_Copy33; /保存明文比特流右半部份for (int i = 0; i<32; i+)Ri_Copyi = Rii;Extend_Func(E, Ri);char temp48;for (int i = 0; i < 48; i+)tempi = Round_Keyroundi;Xor(E, temp, 48);for (int i = 0; i<8; i+) /S盒置换row = (Ei * 6 - 48) * 2 + (Ei * 6 + 5 - 48);column = (Ei * 6 + 1 - 48) * 8 + (Ei * 6 + 2 - 48) *

35、 4 + (Ei * 6 + 3 - 48) * 2 + (Ei * 6 + 4 - 48);Si * 4 + 3 = char(S_Boxirow * 16 + column % 2 + 48);Si * 4 + 2 = char(S_Boxirow * 16 + column / 2) % 2 + 48);Si * 4 + 1 = char(S_Boxirow * 16 + column / 4) % 2 + 48);Si * 4 = char(S_Boxirow * 16 + column / 8) % 2 + 48);Replace_P(Ri, S);Xor(Ri, Li, 32);f

36、or (int i = 0; i<32; i+)/交换左右明文Lii = Ri_Copyi;Replace_IP_1(temp, Li, Ri);for (int q = 0; q < 64; q+)CipherTextn * 64 + q = tempq;/DES检测函数void DES_Test()char Key0100; /第一组密钥比特流char Message200; /明文信息比特流char Message_Input30;char Key0_Input20;cout << "请输入明文信息(英文字符及数字组合):"cin >&g

37、t; Message_Input;CharToBit(Message_Input, Message);cout << "请输入第一组密钥(英文字符及数字组合,不少于7个字符):"cin >> Key0_Input;CharToBit(Key0_Input, Key0);DES(Key0, Message, 0); /用于检测DES加解密算法的正确性cout << CipherText;cout << endl;DES(Key0, CipherText, 1);cout << CipherText <<

38、endl;/3DES加密解密函数void Triple_DES(char* Key0,char* Key1,char* Key2,char*Message,int Mode) /Mode:0为加密,1为解密if (Mode = 0)DES(Key0, Message, 0);DES(Key1, CipherText, 1);DES(Key2, CipherText, 0);elseDES(Key2, CipherText, 1);DES(Key1, CipherText, 0);DES(Key0, CipherText, 1);/加密前的准备工作void Triple_DES_Prepare(

39、)char Key0100; /第一组密钥比特流char Key1100; /第二组密钥比特流char Key2100; /第三组密钥比特流char Message200; /明文信息比特流char Message_Input30;char Key0_Input20;char Key1_Input20;char Key2_Input20;cout << "请输入明文信息(英文字符及数字组合):"cin >> Message_Input;CharToBit(Message_Input, Message);cout << "请输入第一组密钥(英文字符及数字组合,不少于7个字符):"cin >> Key0_Input;CharToBit(Key0_Input, Key0);cout << "请输入第二组密钥(英文字符及数字组

温馨提示

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

评论

0/150

提交评论