收藏 分销(赏)

密码学课程设计报告-基于三重DES的文件加密解密系统设计与实现.docx

上传人:胜**** 文档编号:2882217 上传时间:2024-06-08 格式:DOCX 页数:18 大小:84.49KB
下载 相关 举报
密码学课程设计报告-基于三重DES的文件加密解密系统设计与实现.docx_第1页
第1页 / 共18页
密码学课程设计报告-基于三重DES的文件加密解密系统设计与实现.docx_第2页
第2页 / 共18页
密码学课程设计报告-基于三重DES的文件加密解密系统设计与实现.docx_第3页
第3页 / 共18页
密码学课程设计报告-基于三重DES的文件加密解密系统设计与实现.docx_第4页
第4页 / 共18页
密码学课程设计报告-基于三重DES的文件加密解密系统设计与实现.docx_第5页
第5页 / 共18页
点击查看更多>>
资源描述

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

2、andard,即数据加密标准,是一种使用密钥加密的块算法。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位。L0、R0则是换位输出后的两部分,L0是输出的左32

4、位,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次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆

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

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

7、nst 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, 0, 1 , 1, 1, 1, 0 , 1, 1, 1, 1 ;/置换选择I表const static char KeyRar_Table = 57, 49, 41, 33, 25, 17

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

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

10、, 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, 20, 21,20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1;/置换运算P表const stat

11、ic 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, 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、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, 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, 1

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

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

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

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

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

18、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 ;#includetable.hchar CipherText200;char K56; /置换选择I后的密钥比特流char Round_Key1648; /轮密钥,最后一位为结束符char Li32, Ri32; /明文比特流左32位和右32位char E49; /选择运算E后比特流char S32; /保存经过S盒后的输出/字符串转换比特流函数/Input保存用户

19、输入的字符数组,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 = (int)Hex_Tabletemp / 16;Hexj+ = temp1 + 48;if (temp % 16 10)temp1 = (int)Hex_Tabletemp % 16;Hexj+ = temp1 + 48;e

20、lseHexj+ = 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 = 0&Hexi = 9)for (int m = 0; m = A&Hexi = F)for (int m = 0; m 4; m+)Bitk+ = (int)Bit_TableHexi - 65 + 10m + 48;Bitk = 0;/置换选择I函数

21、void 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; i16; i+) /16轮密钥产生if (i = 0 | i = 1 | i = 8 | i = 15)Left_Mo

22、ve = 1;elseLeft_Move = 2;for (int k = 0; kLeft_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* Message, char* Li, char* Ri)

23、int p = 0, q = 0;for (int i = 0; i64; 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 length; i+)int temp1 = ai - 48;int temp2

24、= bi - 48;ai = char(temp1temp2 + 48);/置换运算P函数void Replace_P(char* Ri, char* S)for (int i = 0; i32; 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 = Rii;else if (i 64)tempi = Lii - 32;for (int i = 0; i 64;

25、i+)CipherTexti = tempP_1_Tablei - 1;五、设计核心代码#include#includeFunction.husing namespace std;/DES加解密函数void DES(char* Key,char* Message,int Mode) /Mode:0为加密,1为解密int row, column; Round_Key_Func(Key);char M565; /将明文比特流分为64位一组char temp65;int m = 0; /明文比特流分组数int length = 0; /比特流长度int k = 0, flag = 0; for (i

26、nt i = 0; Messagei != 0; i+)length+;/明文比特流以64为一组分组for (; m 5; m+)for (int j = 0; j 64; j+)if (klength)Mmj = Messagek+;elseflag = 1;Mmj = 0;Mm64 = 0;if (flag)break;if (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; /保存明文比特

27、流右半部份for (int i = 0; i32; 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; i8; 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 *

28、 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);for (int i = 0; i32; i+)/交换左右明文Lii

29、= 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+)Replace_IP(Mn, Li, Ri);for (int round = 0; round 16; round+)char Ri_Copy33; /保存明文比特流右半部份for (int i = 0; i32; i+)Ri_Copyi = Rii;Extend_Func(E, Ri);char temp48;for (int i = 0; i

30、48; i+)tempi = Round_Keyroundi;Xor(E, temp, 48);for (int i = 0; i8; 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

31、* 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);for (int i = 0; i32; i+)/交换左右明文Lii = Ri_Copyi;Replace_IP_1(temp, Li, Ri);for (int q = 0; q 64; q+)CipherTextn * 64 + q = tempq;e

32、lsefor (int n = 0; n = 0; round-)char Ri_Copy33; /保存明文比特流右半部份for (int i = 0; i32; 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; i8; i+) /S盒置换row = (Ei * 6 - 48) * 2 + (Ei * 6 + 5 - 48);column = (Ei * 6 + 1 - 48) * 8

33、 + (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 * 16 + column / 8) % 2 + 48);Replace_P(Ri

34、, S);Xor(Ri, Li, 32);for (int i = 0; i32; 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 Message_Input;CharToBit(Message_Input

35、, Message);cout Key0_Input;CharToBit(Key0_Input, Key0);DES(Key0, Message, 0); /用于检测DES加解密算法的正确性cout CipherText;cout endl;DES(Key0, CipherText, 1);cout CipherText 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()char Key0100; /第一组密钥比特流char Key1100; /第二组密钥比特流char Key2100; /第三组密钥比特流char Message200; /明文信息比特流char Message_Input30;char Ke

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服