密码学1实验报告(共19页).doc
精选优质文档-倾情为你奉上密码学应用与实践实 验 报 告专业:信息安全学号:姓名: 张洋哈尔滨工业大学(威海)实验1:实现DES密码体制姓名张洋院系计算机科学与技术学院学号任课教师刘扬指导教师刘杨实验地点宋健北楼402实验时间2011-10-24 18:40实验课表现出勤、表现得分实验报告得分实验总分操作结果得分一、实验目的1. 编写程序实现DES的加、解密1) 编程构造DES的密钥;2) 应用上述获得的密钥将文件或文件夹或图片进行加、解密。2. 用DES算法实现口令的安全二、 实验内容1. 概要设计1) 编写CDES_zhy类,实现DES算法加解密;2) 编写用户界面,实现可视化操作;3) 核心代码与界面连接;4) 测试程序;5) 调试程序;6) 得到Release版本。2. 详细设计1) 密钥生成· 取得密钥从用户处取得一个64位(本文如未特指,均指二进制位)长的密码key ,去除64位密码中作为奇偶校验位的第8、16、24、32、40、48、56、64位,剩下的56位作为有效输入密钥。· 等分密钥· 密钥移位DES算法的密钥是经过16次迭代得到一组密钥的,把前面生成的A、B视为迭代的起始密钥,比如在第1次迭代时密钥,循环左移1位,第3次迭代时密钥循环左移2位。第9次迭代时密钥循环左移1位,第14次迭代时密钥循环左移2位。第一次迭代:A(1) = (1) A B(1) = (1) B第i次迭代:A(i) = (i) A(i-1)B(i) = (i) B(i-1)· 密钥的选取前面第i次迭代生成的两个28位长的密钥为把合并。按照表4所示k的第一位为56位密钥的第14位,k的第2位为56位密钥的第17位,依此类推,k的最后一位最后一位是56位密钥的第32位。生成与进行第i次迭代加密的数据进行按位异或的48位使用密钥:· 迭代DES算法密钥生成需要进行16次迭代,最终形成16套加密密钥:key0、key1 , key2, key14 , key15。2) 数据的加密操作· 取得数据把明文数据分成64位的数据块,不够64位的数据块以适当的方式补足。· 初始换位· 数据扩展第一次迭代以1.2.2步中生成的newData作为输入数据,第i (i > 1)次迭代以第i-1次的64位输出数据为输入数据,把64位数据按位置等分成左右两部分:保持left不变,把扩展后的48位right与第i次迭代生成的48位加密密钥进行按位异或操作 形成一个新的48位的right。· 数据压缩形成的48位right值,需要把48位的right值转换成32位的right值。把right视为由8个6位二进制块组成,a,b,h都是6位,强制转换成10进制整数的值都不大于64。a,b,h转成10进制整数后,在对应的表中根据转换后整数值取得对应位置的替代值,每6位用一个4位替换这样就完成了从48位向32位数据的转换。有些资料中介绍6位转4位的实现方法与本文所采用的不同,但殊途同归,最终的结果是相同的。 · 数据换位形成的32位right,根据表8进行转换:数据的原第16位换到第一位,原第7位换到第二位,依此类推,最后得到新的32位数据。· 交换数据把right 和left按位异或后的值赋给right,然后将本轮输入的原始right值赋给left。· 迭代DES算法需要进行16次迭代,在完成16次迭代前,把第i-1次得到的的left和right的值作为第i次的输入数据,循环重复。· 数据整理为保证加密和解密的对称性,DES算法的前15次迭代每完成一次迭代都要交换left和right的值,第16次迭代不交换两者的数值. 到此把32位的left和right合并成64位的Data。数据的原第40位换到第一位,原第8位换到第二位,.,依此类推,最后的得到新的64位。Data即为密文。3) 数据的解密数据解密的算法与加密算法相同,区别在于1.2.3步中和数据进行按位异或的密钥的使用顺序不同,在加密中是按照第i次迭代就采用第i次迭代生成的密钥进行异或,而解密时第i次迭代就采用第17-i次迭代生成的密钥和数据进行异或。3. 程序设计模块设计如下(头文件):#define PLAIN_FILE_OPEN_ERROR -1#define KEY_FILE_OPEN_ERROR -2#define CIPHER_FILE_OPEN_ERROR -3typedef char ElemType;class CDES_zhy public:int ByteToBit(ElemType ch,ElemType bit8);int BitToByte(ElemType bit8,ElemType *ch);int Char8ToBit64(ElemType ch8,ElemType bit64);int Bit64ToChar8(ElemType bit64,ElemType ch8);int DES_MakeSubKeys(ElemType key64,ElemType subKeys1648);int DES_PC1_Transform(ElemType key64, ElemType tempbts56);int DES_PC2_Transform(ElemType key56, ElemType tempbts48);int DES_ROL(ElemType data56, int time);int DES_IP_Transform(ElemType data64);int DES_IP_1_Transform(ElemType data64);int DES_E_Transform(ElemType data48);int DES_P_Transform(ElemType data32);int DES_SBOX(ElemType data48);int DES_XOR(ElemType R48, ElemType L48,int count);int DES_Swap(ElemType left32,ElemType right32);int DES_EncryptBlock(ElemType plainBlock8, ElemType subKeys1648, ElemType cipherBlock8);int DES_DecryptBlock(ElemType cipherBlock8, ElemType subKeys1648, ElemType plainBlock8);int DES_Encrypt(char * plainFile, char * keyStr,char *cipherFile);int DES_Decrypt(char * cipherFile, char * keyStr,char *plainFile);三、实验结果1. 程序初始界面。2. 选择DES加解密选项卡。对图片加密。加密后的文件为。选择解密按钮,可得到原文件。3. 选择口令安全选项卡。初始密码为:zhangyang,密钥为zhangyang。若把密码改为abc,再次登录测试。则再次登录即可登录成功,原来的密码已经失效。四、实验中遇到的问题总结1. 编程实现了DES的加、解密1) 编程实现了构造DES的密钥;2) 编程实现了用上述获得的密钥将文件或文件夹或图片进行加、解密。2. 编程实现了用DES算法实现口令的安全3. 心得1) 通过上网查资料,又深入学习了DES的加密原理。S盒是IBM自己定义的。B1b2b3b4b5b6 用b1b6表示行,其他表示列,由此实现转换,E函数是对32位串的扩展,置换P是对密钥的置换。2) 测试发现DES,算法把64位密码中的第8位、第16位、第24位、第32位、第40位、第48位、第56位、第64位作为奇偶校验位,在计算密钥时要忽略这8位。如果输入的密码只是在这8位上有区别的话,那么操作后的结果将是一样的。3) DES算法中只用到64位密钥中的其中56位,而第8、16、24、.64位8个位并未参与DES运算,这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了8、16、24、.64位外的其余56位的组合变化256才得以保证的。因此,在实际应用中,我们应避开使用第8、16、24、64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。如果不了解这一点,把密钥Key的8、16、24、64位作为有效数据使用,将不能保证DES加密数据的安全性。实验2:实现RSA密码体制姓名张洋院系计算机科学与技术学院学号任课教师刘扬指导教师刘杨实验地点宋健北楼402实验时间2011-10-24 18:40实验课表现出勤、表现得分实验报告得分实验总分一、实验目的1. 编写程序构造一RSA密钥;2. 编写程序实现快速指数算法;3. 编写程序生成大素数;4. 实现RSA密码体制。二、实验内容1. 详细设计1) 加密解密· 密钥的产生找出两个相异的大素数P和Q,令NP×Q,M(P1)(Q1)。找出与M互素的大数E,用欧氏算法计算出大数D,使D×E1 MOD M。丢弃P和Q,公开E,D和N。E和N即加密密钥,D和N即解密密钥。· 加密的步骤计算N的有效位数tn(以字节数计),将最高位的零忽略掉,令tn1tn1比如N0x012A05,其有效位数tn5,tn14。将明文数据A分割成tn1位(以字节数计)的块,每块看成一个大数,块数记为bn。从而,保证了每块都小于N。对A的每一块Ai进行BiAiE MOD N运算。Bi就是密文数据的一块,将所有密文块合并起来,就得到了密文数据B。· 解密的步骤同加密的第一步。将密文数据B分割成tn位(以字节数计)的块,每块看成一个大数,块数记为bn。对B的每一块Bi进行CiBiD MOD N运算。Ci就是密文数据的一块,将所有密文块合并起来,就得到了密文数据C。2) 素数的产生· 实际考虑产生一个n位的随机大数p。设p的最高位和最低位都为1,以确保达到要求的长度,和确保该大数是奇数。检查以确保p不能被任何小素数整除,如3,5,7,11等等。有效的方法是测试小于2000的素数。使用字轮方法更快。对某随机数a运行Rabin-Miller检测,如果P通过,则另外产生一个随机数a,在测试。选取较小的a值,以保证速度。做5次Rabin-Miller测试,如果有一次失败,返回第一步,从新产生p,再测试。· 素数检测法对一个待测的随机大数p,计算p的有效位n,比如p0x5A,则n7。选择一个小于p的随机数a。令z1,in。xz,zd×d MOD N。如果z1并且x<>1并且x<>p1,那么测试通不过,p不是素数。如果p1的第i位为1,令zz×a MOD p,ii1。如果i>=0,则转到第三步。如果z<>1,则同不过检测,p不是素数,否则通过检测,p可能为素数。这个测试算法速度快,但是有很小的概率会出错。如果用5次该算法进行检测,p是素数的概率可达到99.9(1(0.25)5)。这里给出的该算法的过程可能和有些资料上不太一样,本人从经验上觉得这里给出的更可靠些。2. 程序设计RSA算法的实现(头文件):class CRSA_zhy public:CRSA_zhy();CRSA_zhy();BOOL ProduceSS(int* p, int*q);int SelKey(int j);BOOL isPrime(int x);int gcd(int f1,int f2);void ProduceKey(int x1,int x2);int sum();void Encrypt();void Decrypt();int p,q; /选取的两个素数int n,e,y,d; /n=p*q;y为n的欧拉数值;d是e在y下的乘法逆元int a; /存储e的所有值int c;int fun;int count;char *asd;char *b;/存储明文char *z;三、实验结果1. 主界面(RSA加解密向导)。2. 产生素数输入素数P和Q,点击下一步。选择一个数。 3. 生成密钥,点击生成密钥。4. 加密明文,点击加密明文。在弹出的对话框中输入数字并点确定。5. 解密明文,点击解密明文。四、实验中遇到的问题总结1. 编写程序构造了RSA密钥;2. 编写程序实现快速指数算法;3. 编写程序生成大素数;4. 实现RSA密码体制。5. 心得1) 注意事项· 随机选择足够大素数(目前应在512位以上);· 解密密钥d相对模数n来说不应过小; · 应该或者加密密钥大;或者被加密的信息m总是大而且m不能是一些已知值的乘积,后面一种情况可以在加密前对m填充随机值实现。· 应该使获得对任意值的原始签名不可能;· 被签名的消息应该与模数差不多大,而且不是一些已知值的乘积;· 使用平均解密时间和混乱(blinding)等方法使时间攻击中使用的统计手段失效;· 如果有条件,采用规模差别比较大的质因子p,q来提高系统的安全性;· 在使用RSA系统时,对于公开密钥N的选择非常重要。必须使得公开N后,任何人无法从N得到T。此外,对于公开密钥e与解密密钥d,亦需有所限制。否则在使用上可能会导致RSA系统被攻破,或应用在密码协议上不安全。2) “新知补遗”RSA系统安全性与系统的参数有很大关系,X.931标准对此提出以下几点:· 如果公钥e是奇数,e应与p-1,q-1互质;· 如果公钥e是偶数,e必须与(p-1)/2、(q-1)/2互质,且poq mod 8不成立;· 模数的长应该为1024+256x,x=0,1 ;· 质数p、q应通过质数检测,使出错的概率小 ;· p-1、q-1、p+1、q+1应有大质数因子;· gcd(p-1,q-1)应该小;· p/q不应靠近两个小整数比值,且|p-q|应有大质数因子。实验3:实现MD5算法姓名张洋院系计算机科学与技术学院学号任课教师刘杨指导教师刘杨实验地点宋健402实验时间实验课表现出勤、表现得分实验报告得分实验总分操作结果得分一、实验目的1. 掌握MD5算法的原理;2. 能够编写代码实现MD5算法二、实验内容1. 数据补位MD5算法是对输入的数据进行补位,使得如果数据位长度LEN对512求余的结果是448。即数据扩展至K*512+448位。即K*64+56个字节,K为整数。具体补位操作:补一个1,然后补0至满足上述要求 2. 补数据长度用一个64位的数字表示数据的原始长度B,把B用两个32位数表示。这时,数据就被填补成长度为512位的倍数。 3. 初始化MD5参数四个32位整数 (A,B,C,D) 用来计算信息摘要,初始化使用的是十六进制表示的数字 A=0XB=0X89abcdefC=0Xfedcba98D=0X 4. 处理位操作函数 X,Y,Z为32位整数。F(X,Y,Z) = X&Y|NOT(X)&ZG(X,Y,Z) = X&Z|Y¬(Z)H(X,Y,Z) = X xor Y xor ZI(X,Y,Z) = Y xor (X|not(Z) 5. 主要变换过程使用常数组T1 . 64, Ti为32位整数用16进制表示,数据用16个32位的整数数组M表示。 具体过程如下:/* 处理数据原文 */For i = 0 to N/16-1 do /*每一次,把数据原文存放在16个元素的数组X中. */For j = 0 to 15 doSet Xj to Mi*16+j.end /* 结束对J的循环*/ /* Save A as AA, B as BB, C as CC, and D as DD. */AA = ABB = BCC = CDD = D /* 第1轮*/* 以 abcd k s i表示如下操作a = b + (a + F(b,c,d) + Xk + Ti) <<< s). */ /* Do the following 16 operations. */ABCD 0 7 1 DABC 1 12 2 CDAB 2 17 3 BCDA 3 22 4ABCD 4 7 5 DABC 5 12 6 CDAB 6 17 7 BCDA 7 22 8ABCD 8 7 9 DABC 9 12 10 CDAB 10 17 11 BCDA 11 22 12ABCD 12 7 13 DABC 13 12 14 CDAB 14 17 15 BCDA 15 22 16 /* 第2轮* */* 以 abcd k s i表示如下操作a = b + (a + G(b,c,d) + Xk + Ti) <<< s). */* Do the following 16 operations. */ABCD 1 5 17 DABC 6 9 18 CDAB 11 14 19 BCDA 0 20 20ABCD 5 5 21 DABC 10 9 22 CDAB 15 14 23 BCDA 4 20 24ABCD 9 5 25 DABC 14 9 26 CDAB 3 14 27 BCDA 8 20 28ABCD 13 5 29 DABC 2 9 30 CDAB 7 14 31 BCDA 12 20 32 /* 第3轮*/* 以 abcd k s i表示如下操作a = b + (a + H(b,c,d) + Xk + Ti) <<< s). */* Do the following 16 operations. */ABCD 5 4 33 DABC 8 11 34 CDAB 11 16 35 BCDA 14 23 36ABCD 1 4 37 DABC 4 11 38 CDAB 7 16 39 BCDA 10 23 40ABCD 13 4 41 DABC 0 11 42 CDAB 3 16 43 BCDA 6 23 44ABCD 9 4 45 DABC 12 11 46 CDAB 15 16 47 BCDA 2 23 48 /* 第4轮*/* 以 abcd k s i表示如下操作a = b + (a + I(b,c,d) + Xk + Ti) <<< s). */* Do the following 16 operations. */ABCD 0 6 49 DABC 7 10 50 CDAB 14 15 51 BCDA 5 21 52ABCD 12 6 53 DABC 3 10 54 CDAB 10 15 55 BCDA 1 21 56ABCD 8 6 57 DABC 15 10 58 CDAB 6 15 59 BCDA 13 21 60ABCD 4 6 61 DABC 11 10 62 CDAB 2 15 63 BCDA 9 21 64 /* 然后进行如下操作 */A = A + AAB = B + BBC = C + CCD = D + DD end /* 结束对I的循环*/ 6. 打印结果。三、实验结果从输入区录入,单击计算MD5值即可。四、实验中遇到的问题总结1. 掌握了MD5算法的原理;2. 能够编写代码实现MD5算法。3. 心得实验过程中发现MD5算法具有以下特点:1) 无论被加密的信息串有多长,加密(摘要)后均为128bit。2) MD5算法能保证不同信息串加密(摘要)后产生的大整数不一样,即不会产生冲突。3) MD5为单向加密,即加密(摘要)后,不能由大整数经算法推导出原始信息串。4) 基于以上特点,MD5算法是安全的。专心-专注-专业