密码学课程设计报告(共27页).docx

上传人:飞****2 文档编号:14421151 上传时间:2022-05-04 格式:DOCX 页数:27 大小:53.24KB
返回 下载 相关 举报
密码学课程设计报告(共27页).docx_第1页
第1页 / 共27页
密码学课程设计报告(共27页).docx_第2页
第2页 / 共27页
点击查看更多>>
资源描述

《密码学课程设计报告(共27页).docx》由会员分享,可在线阅读,更多相关《密码学课程设计报告(共27页).docx(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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

2、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位。L0、R0则是换位输出后的两部分,

4、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次迭代运算后,得到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;/十六进制-二进制对照表con

7、st 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 stati

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

12、2, 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, 10

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

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

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

18、4, 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;el

20、seHexj+ = 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函数v

21、oid 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_Mov

22、e = 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)i

23、nt 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; i

25、+)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 (in

26、t 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 4

30、8; 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;el

32、sefor (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;ch

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁