实习4基于Diffle-Human的密钥交换.docx

上传人:飞****2 文档编号:66772973 上传时间:2022-12-21 格式:DOCX 页数:10 大小:148.66KB
返回 下载 相关 举报
实习4基于Diffle-Human的密钥交换.docx_第1页
第1页 / 共10页
实习4基于Diffle-Human的密钥交换.docx_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《实习4基于Diffle-Human的密钥交换.docx》由会员分享,可在线阅读,更多相关《实习4基于Diffle-Human的密钥交换.docx(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、实习四 基于Diffle-Human的密钥交换一、 实习目的1 理解密钥管理相关内容,熟悉Diffle-Human的密钥交换协议;2 在java平台上实现基于Diffle-Human的密钥交换。二、 实习要求1 实习前预习第7章的内容;2 熟悉java中java.security.*中相关的类。三、 实习内容1问题描述Diffle-Human算法是建立在DH公钥和私钥基础上的秘钥分配算法,如A需要和B共享密钥时,A和B各自生成DH的公钥和私钥,公钥对外公布而私钥各自秘密保存。2基本要求在java平台上实现基于Diffle-Human的密钥交换。3实现提示(1)利用公钥密码中的KeyGenera

2、tor类创建公钥密钥对,其参数指定为”DH”。另外在初始化时需要为DH指定的参数DHParameterSpec DHP=new DHParameterSpec(skip1024Modulus,skip1024Base); (2)skip1024Modulus指定模,skip1024Base指定基数。模和基数取值在Internet协议简单密钥管理标准中已经指定,在安装JSDK后,计算机的C盘中存在C:jsdk-1_4_0-docdocsguidesecurityjceJCERefGuide.html文件,其中包含密钥长度为1024的DH密钥中的模和基数的定义,可以直接复制下来,在JCERefGu

3、ide.html中查找1024 bit Diffle-Hellman modulus注释语句,将其下的skip1024ModulusBytes数组及BigInteger类型的skip1024Modulus和skip1024Base复制下来即可。(3)建立两个目录A和B,模拟需要秘密通信的A、B双方,DH算法需要A和B各自生成DH公钥和私钥。(4)java中KeyAgreement类实现了密钥协定,它使得init()方法传入自己的私钥,使用doPhase()方法传入对方的公钥,进而可以使用generateSecret()方法生成共享的信息。四、 实习过程编程思路(1) 生成 DH 参数DHPar

4、ameterSpec DHP=new DHParameterSpec(skip1024Modulus,skip1024Base);分析:和RSA算法类似,DH算法涉及到一些指数和取模运算,DH参数指定A、B双方在创建DH密钥时所公用的基数和模(2) 创建密钥对生成器KeyPairGenerator kpg= KeyPairGenerator.getInstance(DH);分析:密钥对生成器即KeyPairGenerator类型的对象,通过其中预定义的一个静态方法getInstance()获取KeyPairGenerator类型的对象。getInstance()方法的参数指定为“DH”。(3)

5、 初始化密钥生成器kpg.initialize(DHP);分析:初始化时使用的参数即第1步中生成的参数。(4) 生成密钥对,获取公钥和私钥KeyPair kp=kpg.genKeyPair();PublicKey pbk=kp.getPublic( );PrivateKey prk=kp.getPrivate( );分析:使用KeyPairGenerator类的genKeyPair()方法生成密钥对,进而使用密钥对的 getPublic( )和 getPrivate( )获取公钥和私钥。 Java 中 KeyAgreement 类实现了密钥协定,它使用 init( )方法传入自己的私钥,使用

6、doPhase( )方法传入对方的公钥,进而可以使用 generateSecret( )方法生成共享的信息具体步骤如下:(1) 读取自己的 DH 私钥和对方的 DH 公钥FileInputStream f1=new FileInputStream(args0);ObjectInputStream b1=new ObjectInputStream(f1);PublicKey pbk=(PublicKey)b1.readObject( );FileInputStream f2=new FileInputStream(args1);ObjectInputStream b2=new ObjectInp

7、utStream(f2);PrivateKey prk=(PrivateKey)b2.readObject( );分析:从文件中获取密钥。只是分为公钥和私钥两个文件,通过命令行参数传入公钥和私钥文件名,第一个命令行参数为对方的公钥文件名,第二个命令行参数为自己的私钥文件名。(2) 创建密钥协定对象KeyAgreement ka=KeyAgreement.getInstance(DH);分析:密钥协定对象即KeyAgreement类型的对象,和KeyPairGenerator类类似,KeyAgreement类是一个工厂类,通过其中预定义的一个静态方法getInstance()获取KeyAgree

8、ment类型的对象。getInstance()方法的参数指定为“DH”。(3) 初始化密钥协定对象ka.init(prk);分析:执行密钥协定对象的init()方法,传入第1步获得的自己的私钥,它在第1步中通过第2个命令行参数提供。(4) 执行密钥协定ka.doPhase(pbk,true);分析:执行密钥协定对象的doPhase()方法,其第一个参数中传入对方的公钥。(5) 生成共享信息byte sb=ka.generateSecret();分析:执行密钥协定对象的 generateSecret( )方法,返回字节类型的数组。A、B双方得到的该数组的内容完全相同,用它创建密钥也各方完全相同。

9、如可使用SecretKeySpec k=new SecretKeySpec(sb,DESede);创建密钥。流程图步骤1建立两个目录 A 和 B,模拟需要秘密通信的 A、B 双方,由于 DH 算法需要 A 和B 各自生成 DH 公钥和私钥,因此在这两个目录下都拷贝编译后文件 Key_DH。2这样,A、B 双方共享信息五、 实习代码package dh.a;import java.io.*;import java.math.*;import java.security.*;import java.security.spec.*;import javax.crypto.*;import javax

10、.crypto.spec.*;import javax.crypto.interfaces.*;public class Key_DH /* * param args */The 1024 bit Diffie-Hellman modulus values used by SKIPprivate static final byte skip1024ModulusBytes= (byte)0xF4, (byte)0x88, (byte)0xFD, (byte)0x58, (byte)0x4E, (byte)0x49, (byte)0xDB, (byte)0xCD,(byte)0x20, (byt

11、e)0xB4, (byte)0x9D, (byte)0xE4,(byte)0x91, (byte)0x07, (byte)0x36, (byte)0x6B,(byte)0x33, (byte)0x6C, (byte)0x38, (byte)0x0D,(byte)0x45, (byte)0x1D, (byte)0x0F, (byte)0x7C,(byte)0x88, (byte)0xB3, (byte)0x1C, (byte)0x7C,(byte)0x5B, (byte)0x2D, (byte)0x8E, (byte)0xF6,(byte)0xF3, (byte)0xC9, (byte)0x23

12、, (byte)0xC0,(byte)0x43, (byte)0xF0, (byte)0xA5, (byte)0x5B,(byte)0x18, (byte)0x8D, (byte)0x8E, (byte)0xBB, (byte)0x55, (byte)0x8C, (byte)0xB8, (byte)0x5D,(byte)0x38, (byte)0xD3, (byte)0x34, (byte)0xFD,(byte)0x7C, (byte)0x17, (byte)0x57, (byte)0x43,(byte)0xA3, (byte)0x1D, (byte)0x18, (byte)0x6C,(byt

13、e)0xDE, (byte)0x33, (byte)0x21, (byte)0x2C,(byte)0xB5, (byte)0x2A, (byte)0xFF, (byte)0x3C,(byte)0xE1, (byte)0xB1, (byte)0x29, (byte)0x40,(byte)0x18, (byte)0x11, (byte)0x8D, (byte)0x7C,(byte)0x84, (byte)0xA7, (byte)0x0A, (byte)0x72,(byte)0xD6, (byte)0x86, (byte)0xC4, (byte)0x03,(byte)0x19, (byte)0xC8

14、, (byte)0x07, (byte)0x29,(byte)0x7A, (byte)0xCA, (byte)0x95, (byte)0x0C,(byte)0xD9, (byte)0x96, (byte)0x9F, (byte)0xAB,(byte)0xD0, (byte)0x0A, (byte)0x50, (byte)0x9B,(byte)0x02, (byte)0x46, (byte)0xD3, (byte)0x08,(byte)0x3D, (byte)0x66, (byte)0xA4, (byte)0x5D,(byte)0x41, (byte)0x9F, (byte)0x9C, (byt

15、e)0x7C,(byte)0xBD, (byte)0x89, (byte)0x4B, (byte)0x22,(byte)0x19, (byte)0x26, (byte)0xBA, (byte)0xAB,(byte)0xA2, (byte)0x5E, (byte)0xC3, (byte)0x55,(byte)0xE9, (byte)0x2F, (byte)0x78, (byte)0xC7; /The SKIP 1024 bit modulusprivate static final BigInteger skip1024Modulus = new BigInteger(1, skip1024Mo

16、dulusBytes);/the base used with the skip 1024 bit modulusprivate static final BigInteger skip1024Base = BigInteger.valueOf(2);public static void main(String agrs )throws Exception/ DH 创建密钥对时所用到的基数和模DHParameterSpec DHP = new DHParameterSpec(skip1024Modulus, skip1024Base);KeyPairGenerator kpg = KeyPai

17、rGenerator.getInstance(DH);kpg.initialize(DHP);KeyPair kp = kpg.genKeyPair();PublicKey pbk = kp.getPublic();PrivateKey prk = kp.getPrivate();FileOutputStream f1 = new FileOutputStream(keyB1.dat);ObjectOutputStream b1 = new ObjectOutputStream(f1);b1.writeObject(pbk);FileOutputStream f2 = new FileOutp

18、utStream(keyB2.dat);ObjectOutputStream b2 = new ObjectOutputStream(f2);b2.writeObject(prk);package dh.a;import java.io.*;import java.math.*;import java.security.*;import java.security.spec.*;import javax.crypto.*;import javax.crypto.spec.*;import javax.crypto.interfaces.*;public class KeyAgree /* *

19、param args */public static void main(String agrs )try/读取DH私钥和对方公钥FileInputStream f1 = new FileInputStream(keyB1.dat);ObjectInputStream b1 = new ObjectInputStream(f1);PublicKey pbk=(PublicKey)b1.readObject();FileInputStream f2 = new FileInputStream(keyA2.dat);ObjectInputStream b2 = new ObjectInputStr

20、eam(f2);PrivateKey prk=(PrivateKey)b2.readObject();/创建秘钥协定对象KeyAgreement ka = KeyAgreement.getInstance(DH);/用自己的私钥初始化密钥协定对象ka.init(prk);/*执行密钥协定对象 * * */ka.doPhase(pbk, true);/生成共享信息 byte sb=ka.generateSecret(); for(int i=0;isb.length;i+) System.out.print(sbi+,); /创建秘钥 SecretKeySpec k=new SecretKeySpec(sb,DESede);catch(Exception e)六、 实习总结基于Diffle-Human的密钥交换是建立在DH公钥和私钥基础上的密钥分配算法,这次实习的内容和上次的基本接近,但是,我还是花了好久的时间搞清楚老师给的实验指导里函数的含义,明白密钥交换原理,总之,这次实习收获不小,我会再接再厉的。

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

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

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

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