计算机密码学实验报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

院系:计算机科学学院专业:网络工程产业班年级:2013课程名称:信息安全学号:201321093022姓名:刘浏指导教师:孟博2016年6月6日年级2013级班号产业班学号201321093022专业网络工程姓名刘浏实验名称Enigma密码算法实验类型设计型综合型创新型实验目的或要求通过使用Enigma密码模拟器,加深对古典密码体制的了解,为深入学习现代密码学奠定基础。实验原理(算法流程)(1)消息的发送着利用Enigma模拟器进行下列操作:明文:INFORMATIONSECURITY模拟器参数设置:UKW:BWalzen:IIIVRingstellung:F-06V-22N-14Stecker:BGCDERFVHNIUJKLMOPTY生成:在转子的起始位置:XWB,生成INFORMATIONSECURITY的密文;同时给出模拟器在此结果时的屏幕截图。写不完时,可另加附页。)然后把转子的起始位置设为ABC,求出XWB的密文;同时给出模拟器在此结果时的屏幕截图。最后把模拟器参数设置,转子的起始位置ABC,XWB的密文,INFORMATIONSECURITY的密文发送给接收者。发送内容:PPXCTIZJOCYNEEEADHHAVE(2)接收者收到信息后:对XWB的密文,INFORMATIONSECURITY的密文进行解密,给出明文,并且分别给出相应的屏幕截图。明文为:INFORMATIONSECURITY组内分工(可选)实验结果分析及心得体会在这次实验过程中,我们需要选定好实验所需的Ringstellung,再按照要求设置好Stecker,虽然都是对软件的一个操作,但这些条件都影响着后面消息的加密方式和产生结果,所以它们都是实验成功的必要条件。通过这次实验,我了解了Enigma密码的历史和加深对古典密码体制的了解,为深入学习现代密码学奠定基础。同时理解了Enigma密码的原理,在此基础上掌握Enigma密码模拟器的使用方法。已可以使用Enigma密码模拟器进行加密和解密。成绩评定教师签名:年月日备注:源代码附后,源代码要求有注释说明年级2013级班号产业班学号201321093022专业网络工程姓名刘浏实验名称基于RSA的数字签名实现实验类型设计型综合型创新型实验目的或要求掌握RSA算法的基本原理,通过用RSA算法对实际数据进行加密和解密来深刻了解RSA的运行原理。对数字签名有所了解,理解和掌握SHA–512算法,以及如何利用RSA和SHA–512算法来实现数字签名。实验原理(算法流程)1、RSA算法的基本原理:独立地选取两个大素数𝑝≈𝑞(保密)。计算𝑛=𝑝𝑞(公开),其中∅n为欧拉函数值∅𝑛=𝑝−1𝑞−1(保密)。随机选取一整数e,满足1≤𝑒≤∅𝑛,𝑔𝑐𝑑𝑒,∅𝑛=1,e是公开的密钥即公钥。用Euclid算法计算d,𝑑=𝑒−1mod∅𝑛,d是保密的密钥即私钥。加密变换:对明文𝑚∈𝑍𝑛,密文为𝑐=𝐸𝑘𝑚=𝑚𝑒mod𝑛。解密变换:对密文𝑐∈𝑍𝑛,明文为𝑚=𝐷𝑘𝑐=𝑐𝑑mod𝑛。其中,加密变换、解密变换两步也可以改为用d加密,e解密,就变成签名和验证过程。2、SHA-512算法过程:对于SHA-512,在完成填充等预处理后,每个消息分组依次执行以下计算:步骤1:准备处理字Wt步骤2:用每一轮的杂凑值中间结果初始化8个工作变量:A、B、C、D、E、F、G和H。初始值定义由H0~H7给出。步骤3:对于(写不完时,可另加附页。)各部分的设计实现1)密钥产生的实现在密钥的产生部分中起决定性作用的是素数的选择,对随机数作素性检测,若通过则为素数;否则增加一个步长后再做素性检测,直到找出素数。素性检测采用Fermat测试。这个算法的理论依据是费尔马小定理:如果m是一个素数,且a不是m的倍数,那么根据费尔马小定理有:am-1=1(modm)。实际应用时:am-1=1(modm)am=a(modm)a=am(modm),因此对于整数m,只需计算am(modm),再将结果与a比较,如果两者相同,则m为素数。选取a=2,则a一定不会是任何素数的倍数。根据所选的素数的不同产生不同的密钥。密钥的理论产生模块流程图2)产生消息摘要的设计实现计算消息摘要的理论实现流程图初始化MD5所需的常量计算所需的追加长度对原始信息进行补位将输入分成512位的块循环处理块产生任意素数p和q计算n=p*q计算ou_la=(p-1)(q-1)选择e作为公钥计算d作为私钥得到消息摘要在以上流程图中其中循环处理块是最重要的一步,也是MD5的核心算法,在这一步中包括了:(1)把四个连接变量复制到了四个变量a,b,c,d中,使a=A,b=B,c=C,d=D;其中a,b,c,d组合成128位的寄存器,且在实际算法运算中保存中间结果和最终结果;(2)将当前的512位块分解为16个子块,每个子块为32位;(3)要循环四轮,每一轮处理一个块中的16个子块,四轮的第一步进行不同的处理,其他的相同:每一轮有16个输入子块M[0],M[1],…………..M[15],或表示为M[i],其中i为0-15;t是常量数组,包含64个元素,每个元素为32位,数组t表示为t[1],t[2],………t[64],或t[k],k为1-64;3)数字签名的设计实现数字签名的理论实现流程图如图所示,数字签名,就是通过在数据单元上附加数据,或对数据单元进行加密变换,从而使接收者可以确认数据来源和完整性。数字签名是防止他人对传输的文件进行破坏,以及确定发信人的身份的手段。数字签名中的加密算法就是应用的RSA加密原理,而它的验证算法则是应用的RSA解密原理。RSA的加密、解密过程都为求一个整数的整数次幂,再取模。如果按其含义直接计算,则中间结果非常大,有可能超出计算机所允许的整数取值范围。为了减小中间结果和提高加、解密运算中指数运算的有效性,本设计采用了快速指数算法。它的运算过程为(假如要算a^mmodn):1)将m表示为二进制的形式;2)初始化c=0,d=1,c在这里表示指数的部分结果,它的终值即为指数m,d是中间结果,它的终值即为所求结果;3)从二进制数的最高位到最低位开始对每一位都用公式1进行运算,得到的d为该步的结果,公式1:c=2*c;d=fmod(d*d,n);4)若二进制数是1,则在上面的运算后继续以下运算:c=c+1;d=fmod(d*a,n);得到的结果d才为该步的最终结果。开始得到数字签名得到消息摘要MD用私钥d加密MD结束4)验证数字签名的设计与实现验证数字签名流程验证数字签名的正确与成功性,主要是比较得到的两次消息摘要是否一样,如果验证方用签名方的公钥解密得到消息摘要(即是本设计中得到的解密信息)和他自己计算得到的消息摘要(在本系统中为第一次计算得到的消息摘要)是一样的,则证明签名是正确的,没有被篡改或是冒充,验证签名的原理则是根据RSA的解密算法,具体的理论流程图如图所示:(在本设计中签名和验证签名都在同一界面实现,不进行文件的双方传输)验证数字签名的过程时应用的解密算法是RSA的解密原理,而RSA的解密过程也应用了求一个整数的整数次幂,再取模的运算。在此也采用了快速指数算法,具体的算法过程同RSA的加密过程中应用的快速指数算法是一样的。RSA算法及数字签名认证整体代码实现:packagecom.rsa;importjava.security.KeyFactory;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.PrivateKey;importjava.security.PublicKey;importjava.security.Signature;importjava.security.interfaces.RSAPrivateKey;importjava.security.interfaces.RSAPublicKey;importjava.security.spec.PKCS8EncodedKeySpec;importjava.security.spec.X509EncodedKeySpec;得到数字签名用公钥e解密数字签名得到消息摘要(解密信息)开始结束importjava.util.HashMap;importjava.util.Map;importorg.apache.commons.codec.binary.Hex;publicclassRSAsign{publicstaticfinalStringKEY_ALGORITHM=RSA;//密钥算法privatestaticfinalStringPUBLIC_KEY=PublicKey;//公钥privatestaticfinalStringPRIVATE_KEY=PrivateKey;//私钥publicstaticfinalStringSIGNATURE_ALGORITHM=SHA512withRSA;//签名算法/******************主函数******************/publicstaticvoidmain(String[]args)throwsException{Stringsource=Information-201321093022-liuliu;System.out.println(待签名信息:+source);//==================生成密钥对==================MapString,Objectkeys=RSAsign.generateKey();RSAPublicKeyPUBkey=(RSAPublicKey)keys.get(RSAsign.PUBLIC_KEY);System.out.println(公钥:+PUBkey);RSAPrivateKeyPRIkey=(RSAPrivateKey)keys.get(RSAsign.PRIVATE_KEY);System.out.println(私钥:+PRIkey);//==================私钥签名==================byte[]SIGN=RSAsign.sign(PRIkey.getEncoded(),source.getBytes());System.out.println(私钥签名结果:+Hex.encodeHexString(SIGN));//==================公钥验证签名==================booleanresult=RSAsign.verify(PUBkey.getEncoded(),source.getBytes(),SIGN);System.out.println(公钥验证签名结果:+result);}/******************生成密钥对******************/publicstaticMapString,ObjectgenerateKey()throwsException{//实例化密钥对生成器KeyPairGeneratorkeyPairGen=KeyPairGenerator.getInstance(KEY_ALGORITHM);//密钥对长度初始化keyPairGen.initialize(1024);//实例化密钥对KeyPairkeyPair=keyPairGen.generateKeyPair();//生成公钥RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();//生成私钥RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();//实例化Map对象,存储公钥和私钥MapString,Objectmiyao=newHashMapString,Obje

1 / 22
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功