ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:195.74KB ,
资源ID:11526540      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-11526540.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(一 密钥分配.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

一 密钥分配.docx

1、一 密钥分配实习一 密钥分配一、实习目的1理解密钥管理的重要性;2掌握对称密码和公钥密码密钥管理的不同特性;3掌握密钥分发基本方法,能设计密钥分发方案二、实习要求1实习前认真预习第2章的有关内容;2复习对称密码和公钥密码相关内容;3熟悉Java平台的JCE包有关类。三、 实习内容假定两个用户A、B,用户A、B的通讯密钥为K,他们的公私钥对分别是KPUa、KPRa和KPUb、KPRb,他们要进行安全通讯,密钥分发与通信过程如1所示。(1)根据图1所示,实现利用公钥密码算法分发对称密钥的过程。实现的阶梯任务如下:以本地两个目录模拟两个用户,采用变量方式直接实现密钥的分发;实现算法的图形化方式,用户

2、可以选择算法、参数、工作模式等;以文件方式管理密钥及明文、密文;采用Socket,建立安全通信过程;将方案移植到某个web应用中。 (2)按照(1)的阶梯任务,实现基于DH密钥协定的密钥分发。 四、实验过程1.知识回顾DES 是数据加密标准(Data Encryption Standard)的简称,出自 IBM 的研究工作,并在 1977 年被美国政府正式采纳。它是使用较为广泛的密钥系统,最初开发 DES 是嵌入硬件中DES 特别是在保护金融数据的安全,如自动取款机中,使用较多。在 DES 中,使用了一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。加密过程中,将

3、加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半。循环往复。DES 使用 16 个循环,但最后一个循环不交换。攻击 DES,一般只能使用穷举的密钥搜索,即重复尝试各种密钥直到有一个符合为止。如果 DES使用 56 位的密钥,则可能的密钥数量是 2 56 个,穷举难度较大。IBM曾对DES拥有几年的专利权,但在 1983 年到期。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。正是基

4、于这种理论,1978年出现了著名的RSA算法,它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。2.问题分析(1)对称密钥密码体系对称密钥密码体系也叫密钥密码体系,它是指消息发送方和消息接收方必须使用相同的密钥,该密钥必须

5、保密。发送方用该密钥对待发消息进行加密,然后将消息传输至接收方,接收方再用相同的密钥对收到的消息进行解密。这一过程可用数学形式来表示。消息发送方使用的加密函数encrypt有两个参数:密钥K和待加密消息M,加密后的消息为E,E可以表示为E=encrypt(K,M)消息接收方使用的解密函数decrypt把这一过程逆过来,就产生了原来的消息M=decrypt(K,E)=decrypt(K,encrypt(K,M)(2)非对称密钥密码体系 非对称密钥密码体系又叫公钥密码体系,它使用两个密钥:一个公共密钥PK和一个私有密钥SK。这两个密钥在数学上是相关的,并且不能由公钥计算出对应的私钥,同样也不能由私

6、钥计算出对应的公钥。这种用两把密钥加密和解密的方法表示成如下数学形式。假设M表示一条消息,puba表示用户a的公共密钥,prva表示用户a的私有密钥,那么: M=decrypt(puba,encrypt(prva,M)3.算法分析及流程图4实验原理(1) 利用java中的KeypairGenerator类创建公钥密钥对,工厂类KeypairGenerator的静态方法getInstance()可以获得KeypairGenerator类型对象。(2) 方法getInstance()的参数为字符串类型,指定加密算法为RSA。 (3) RSA算法是使用整数进行加密运算的,RSA的公钥中包含两个信息:

7、公钥对应的整数e和用于取模的整数n。对于明文m计算密文的公式是me mod n。java中的BigInteger类中定义的modPow()方法可以计算me mod n。(4) RSA的私钥中包含两个信息:私钥对应的整数d和用于取模的整数n。计算明文的公式是:Ce mod n。5.类图四数据测试及结果1、利用DES算法生成对称密钥Key,运行程序后生成Key.dat文件2、利用RSA算法生成公钥密钥对,将公钥存入A文件夹下,将私钥存入B文件夹下,运行程序后在A文件夹下生成Skey_RSA_pub.dat文件,在B文件夹下生成Skey_RSA_priv.dat文件:3.利用RSA加密算法对对称密钥

8、加密,将加密后文件保存为Enc_RSA.dat文件,运行程序后:4、 利用RSA解密算法对密文进行解密,将解密后的文件Key.dat写入B文件夹下,运行程序后B文件夹下生成Key.dat文件: 五总结通过本次实习,复习了DES和RSA的相关知识,通过使用DES算法和RSA算法实现密钥分发与通信过程,对密钥的分配过程有了一定的了解。让我更加认识到了加密算法的复杂,也更加巩固了我们的java知识,理解了公钥密码算法,掌握了RSA密码算法加解密过程的实现,学习了java.security.*和java.crypto.* 中相关类。对于KeypairGenerator,KeyPair,PublicKe

9、y,PrivateKey等类有了进一步的了解,RSA算法是使用整数进行加密运算的,RSA的公钥中包含两个信息公钥对应的整数e和用于取模的整数n。由于时间精力有限,本次实验还存在很多问题,在控制台进行明文的加密解密正常,图形界面的加密也正常,解密时调用Skey_RSA的解密方法时未能完成解密工作。加密方法的参数密钥由KeypairGenerator的静态方法getInstance()可以获得KeypairGenerator类型对象,所以在界面使用文本框获得key值会造成初始化方法init()的publickey参数错误,于是设置成密钥由系统生成。Cipher cipher = Cipher.ge

10、tInstance(RSA); / Cipher负责完成加密或解密工作,基于RSAcipher.init(Cipher.ENCRYPT_MODE, publicKey); / 根据公钥,对Cipher对象进行初始化对称密码一般要求: 1、加密解密用相同的密钥 2、收发双方必须共享密钥 安全性要求: 1、密钥必须保密 2、没有密钥,解密不可行 3、知道算法和若干密文不足以确定密钥公钥密码一般要求:1、加密解密算法相同,但使用不同的密钥 2、发送方拥有加密或解密密钥,而接收方拥有另一个密钥 安全性要求: 1、两个密钥之一必须保密 2、无解密密钥,解密不可行 3、知道算法和其中一个密钥以及若干密文不

11、能确定另一个密钥源程序/生成对称密钥package Skey;import java.io.FileOutputStream;import java.io.ObjectOutputStream;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;public class Skey_DES /* * param args */ / TODO Auto-generated method stub /对称密钥的生成,并通过对象序列化方式保存在文件中 public static void main(String args) th

12、rows Exception KeyGenerator kg=KeyGenerator.getInstance(DESede);/创建密钥生成器 kg.init(168);/初始化密钥生成器 SecretKey k=kg.generateKey( );/生成密钥 /通过对象序列化方式将密钥保存在文件中 FileOutputStream f1=new FileOutputStream(A/Key.dat); ObjectOutputStream b1=new ObjectOutputStream(f1); b1.writeObject(k); /生成对称密钥对package RSA;import

13、 java.io.*;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import javax.crypto.Cipher;public class Skey_RSA / KeyGenerator提供对称密钥生成器的功能,支持各种算法 public KeyPairGenerator keyPairGen; / SecretKey负责保存对称密钥 KeyPair keyPair; RSAPrivateKey priva

14、teKey; RSAPublicKey publicKey; / Cipher负责完成加密或解密工作 private Cipher c; / 该字节数组负责保存加密的结果 private byte cipherByte; / KeyPairGenerator 类用于生成公钥和私钥对,基于RSA算法生成对象 /* * param args */ Skey_RSA() / KeyPairGenerator 类用于生成公钥和私钥对,基于RSA算法生成对象 KeyPairGenerator keyPairGen = null; try keyPairGen = KeyPairGenerator.get

15、Instance(RSA); catch (NoSuchAlgorithmException e) / TODO 自动生成的 catch 块 e.printStackTrace(); / 初始化密钥对生成器,密钥大小为1024位 keyPairGen.initialize(1024); / 生成一个密钥对,保存在keyPair中 KeyPair keyPair = keyPairGen.generateKeyPair(); / 得到私钥 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); / 得到公钥 RSAPubl

16、icKey publicKey = (RSAPublicKey) keyPair.getPublic(); public RSAPrivateKey getPrivateKey() return privateKey; public void setPrivateKey(RSAPrivateKey privateKey) this.privateKey = privateKey; public RSAPublicKey getPublicKey() return publicKey; public void setPublicKey(RSAPublicKey publicKey) this.p

17、ublicKey = publicKey; public byte encrypt(RSAPublicKey publicKey, byte srcBytes) if (publicKey != null) try / Cipher负责完成加密或解密工作,基于RSA Cipher cipher = Cipher.getInstance(RSA); / 根据公钥,对Cipher对象进行初始化 cipher.init(Cipher.ENCRYPT_MODE, publicKey); / 加密,结果保存进resultBytes byte resultBytes = cipher.doFinal(sr

18、cBytes); return resultBytes; catch (Exception e) e.printStackTrace(); return null; public byte decrypt(RSAPrivateKey privateKey, byte encBytes) if (privateKey != null) try Cipher cipher = Cipher.getInstance(RSA); / 根据私钥,对Cipher对象进行初始化 cipher.init(Cipher.DECRYPT_MODE, privateKey); / 解密,结果保存进resultByt

19、es byte decBytes = cipher.doFinal(encBytes); return decBytes; catch (Exception e) e.printStackTrace(); return null; public static void main(String args) throws Exception / 密钥对生成器KeyPairGenerator工厂,非对称加密算法:RSA,DSA KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA); / 制定密钥长度 kpg.initialize(1024)

20、; / 生成密钥对 KeyPair kp = kpg.genKeyPair(); PublicKey pbkey = kp.getPublic(); PrivateKey prkey = kp.getPrivate(); FileOutputStream f1 = new FileOutputStream(A/Skey_RSA_pub.dat); ObjectOutputStream b1 = new ObjectOutputStream(f1); b1.writeObject(pbkey); FileOutputStream f2 = new FileOutputStream(B/Skey_

21、RSA_priv.dat); ObjectOutputStream b2 = new ObjectOutputStream(f2); b2.writeObject(prkey); Skey_RSA rsa = new Skey_RSA(); String msg = rsa_安全编程技术; System.out.println(明文是: + msg); / KeyPairGenerator 类用于生成公钥和私钥对,基于RSA算法生成对象 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(RSA); / 初始化密钥对生成器,密钥

22、大小为1024位 keyPairGen.initialize(1024); / 生成一个密钥对,保存在keyPair中 KeyPair keyPair = keyPairGen.generateKeyPair(); / 得到私钥 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); / 得到公钥 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); / 用公钥加密 byte srcBytes = msg.getBytes(); byte resultB

23、ytes = rsa.encrypt(publicKey, srcBytes); String result = new String(resultBytes); System.out.println(用公钥加密后密文是: + result); / 用私钥解密 byte decBytes = rsa.decrypt(privateKey, resultBytes); String dec = new String(decBytes); System.out.println(用私钥解密后结果是: + dec); /公钥加密package RSA;import java.security.inte

24、rfaces.RSAPublicKey;import java.math.*;import java.io.*;public class Enc_RSA public static void main(String args) throws Exception BufferedReader in=new BufferedReader(new InputStreamReader(new FileInputStream(A/Key.dat); String s=in.readLine(); FileInputStream f=new FileInputStream(A/Skey_RSA_pub.d

25、at); ObjectInputStream b=new ObjectInputStream(f); /公钥转换为RSA公钥 RSAPublicKey pbk=(RSAPublicKey)b.readObject(); /获取公钥参数:公钥对应的整数e,用于取模的整数n BigInteger e=pbk.getPublicExponent(); BigInteger n=pbk.getModulus(); System.out.println(e=+e); System.out.println(n=+n); byte ptext=s.getBytes(UTF8); BigInteger m=n

26、ew BigInteger(ptext); BigInteger c=m.modPow(e,n); System.out.println(c=+c); String cs=c.toString(); BufferedWriter out= new BufferedWriter(new OutputStreamWriter( new FileOutputStream(Enc_RSA.dat); out.write(cs,0,cs.length(); out.close(); /私钥解密package RSA;import java.security.interfaces.*;import jav

27、a.math.*;import java.io.*;public class Dec_RSA public static void main(String args) throws Exception BufferedReader in=new BufferedReader ( new InputStreamReader( new FileInputStream(Enc_RSA.dat); String ctext=in.readLine(); BigInteger c=new BigInteger(ctext); FileInputStream f=new FileInputStream(B

28、/Skey_RSA_priv.dat); ObjectInputStream b=new ObjectInputStream(f); RSAPrivateKey prk=(RSAPrivateKey)b.readObject(); BigInteger d=prk.getPrivateExponent(); BigInteger n=prk.getModulus(); System.out.println(d=+d); System.out.println(n=+n); BigInteger m=c.modPow(d, n); System.out.println(m=+m); bytemt=

29、m.toByteArray(); System.out.println(Plain Text is); for(int i=0;imt.length;i+) System.out.print(char)mti); FileOutputStream f1=new FileOutputStream(B/Key.dat); ObjectOutputStream b1=new ObjectOutputStream(f1); b1.writeObject(m); /图形界面package Dec;/* * Window.java * * Created on _DATE_, _TIME_ */import java.io.IOException;import java.security.interfaces.RSAPublicKey;import java.util.Scanner;/* * * author _USER_ */public class Window extends javax.swing.JFrame /* Creates new form Window */ pu

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2