您好,欢迎访问三七文档
密码学应用与实践实验报告专业:信息安全学号:090420115姓名:张洋哈尔滨工业大学(威海)实验1:实现DES密码体制姓名张洋院系计算机科学与技术学院学号090420115任课教师刘扬指导教师刘杨实验地点宋健北楼402实验时间2011-10-2418: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)AB(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套加密密钥:key[0]、key[1],key[2],……,key[14],key[15]。2)数据的加密操作·取得数据把明文数据分成64位的数据块,不够64位的数据块以适当的方式补足。·初始换位·数据扩展第一次迭代以1.2.2步中生成的newData作为输入数据,第i(i1)次迭代以第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.程序设计模块设计如下(头文件):#definePLAIN_FILE_OPEN_ERROR-1#defineKEY_FILE_OPEN_ERROR-2#defineCIPHER_FILE_OPEN_ERROR-3typedefcharElemType;classCDES_zhy{public:intByteToBit(ElemTypech,ElemTypebit[8]);intBitToByte(ElemTypebit[8],ElemType*ch);intChar8ToBit64(ElemTypech[8],ElemTypebit[64]);intBit64ToChar8(ElemTypebit[64],ElemTypech[8]);intDES_MakeSubKeys(ElemTypekey[64],ElemTypesubKeys[16][48]);intDES_PC1_Transform(ElemTypekey[64],ElemTypetempbts[56]);intDES_PC2_Transform(ElemTypekey[56],ElemTypetempbts[48]);intDES_ROL(ElemTypedata[56],inttime);intDES_IP_Transform(ElemTypedata[64]);intDES_IP_1_Transform(ElemTypedata[64]);intDES_E_Transform(ElemTypedata[48]);intDES_P_Transform(ElemTypedata[32]);intDES_SBOX(ElemTypedata[48]);intDES_XOR(ElemTypeR[48],ElemTypeL[48],intcount);intDES_Swap(ElemTypeleft[32],ElemTyperight[32]);intDES_EncryptBlock(ElemTypeplainBlock[8],ElemTypesubKeys[16][48],ElemTypecipherBlock[8]);intDES_DecryptBlock(ElemTypecipherBlock[8],ElemTypesubKeys[16][48],ElemTypeplainBlock[8]);intDES_Encrypt(char*plainFile,char*keyStr,char*cipherFile);intDES_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密码体制姓名张洋院系计算机科学与技术学院学号090420115任课教师刘扬指导教师刘杨实验地点宋健北楼402实验时间2011-10-2418:40实验课表现出勤、表现得分实验报告得分实验总分一、实验目的1.编写程序构造一RSA密钥;2.编写程序实现快速指数算法;3.编写程序生成大素数;4.实现RSA密码体制。二、实验内容1.详细设计1)加密解密·密钥的产生找出两个相异的大素数P和Q,令N=P×Q,M=(P-1)(Q-1)。找出与M互素的大数E,用欧氏算法计算出大数D,使D×E≡1MODM。丢弃P和Q,公开E,D和N。E和N即加密密钥,D和N即解密密钥。·加密的步骤计算N的有效位数tn(以字节数计),将最高位的零忽略掉,令tn1=tn-1比如N=0x012A05,其有效位数tn=5,tn1=4。将明文数据A分割成tn1位(以字节数计)的块,每块看成一个大数,块数记为bn。从而,保证了每块都小于N。对A的每一块Ai进行Bi=Ai^EMODN运算。Bi就是密文数据的一块,将所有密文块合并起来,就得到了密文数据B。·解密的步骤同加密的第一步。将密文数据B分割成tn位(以字节数计)的块,每块看成一个大数,块数记为bn。对B的每一块Bi进行Ci=Bi^DMODN运算。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,比如p=0x5A,则n=7。选择一个小于p的随机数a。令z=1,i=n。x=z,z=d×dMODN。如果z=1并且x1并且xp-1,那么测试通不过,p不是素数。如果p-1的第i位为1,令z=z×aMODp,i=i-1。如果i=0,则转到第三步。如果z1,则同不过检测,p不是素数,否则通过检测,p可能为素数。这个测试算法速度快,但是有很小的概率会出错。如果用5次该算法进行检测,p是素数的概率可达到99.9%(1-(0.25)^5)。这里给出的该算法的过程可能和有些资料上不太一样,本人从经验上觉得这里给出的更可靠些。2.程序设计RSA算法的实现(头文件):classCRSA_zhy{public:CRSA_zhy();~CRSA_zhy();BOOLProduceSS(int*p,int*q);intSelKey(intj);BOOLisPrime(intx);intgcd(intf1,intf2);voidProduceKey(intx1,intx2);intsum();voidEncrypt();voidDecrypt();intp,q;//选取的两个素数intn,e,y,d;//n=p*q;y为n的欧拉数值;d是e在y下的乘法逆元inta[160000];//存储e的所有值intc;intfun;intcount;char*asd;char*b;//存储明文char*z;};三、实验结果1.主界面(RSA加解密向导)。2.产生素数输入素数P和Q,点击下一步。选择一个数。3.生成密钥,点击生成密钥。4.加密明文
本文标题:密码学1实验报告
链接地址:https://www.777doc.com/doc-7269578 .html