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

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

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

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

资源描述

实习四基于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)利用公钥密码中的KeyGenerator类创建公钥密钥对,其参数指定为”DH”。另外在初始化时需要为DH指定的参数DHParameterSpecDHP=newDHParameterSpec(skip1024Modulus,skip1024Base);(2)skip1024Modulus指定模,skip1024Base指定基数。模和基数取值在Internet协议简单密钥管理标准中已经指定,在安装JSDK后,计算机的C盘中存在C:\jsdk-1_4_0-doc\docs\guide\security\jce\JCERefGuide.html文件,其中包含密钥长度为1024的DH密钥中的模和基数的定义,可以直接复制下来,在JCERefGuide.html中查找1024bitDiffle-Hellmanmodulus注释语句,将其下的skip1024ModulusBytes[]数组及BigInteger类型的skip1024Modulus和skip1024Base复制下来即可。(3)建立两个目录A和B,模拟需要秘密通信的A、B双方,DH算法需要A和B各自生成DH公钥和私钥。(4)java中KeyAgreement类实现了密钥协定,它使得init()方法传入自己的私钥,使用doPhase()方法传入对方的公钥,进而可以使用generateSecret()方法生成共享的信息。四、实习过程编程思路(1)生成DH参数DHParameterSpecDHP=newDHParameterSpec(skip1024Modulus,skip1024Base);分析:和RSA算法类似,DH算法涉及到一些指数和取模运算,DH参数指定A、B双方在创建DH密钥时所公用的基数和模(2)创建密钥对生成器KeyPairGeneratorkpg=KeyPairGenerator.getInstance(DH);分析:密钥对生成器即KeyPairGenerator类型的对象,通过其中预定义的一个静态方法getInstance()获取KeyPairGenerator类型的对象。getInstance()方法的参数指定为“DH”。(3)初始化密钥生成器kpg.initialize(DHP);分析:初始化时使用的参数即第1步中生成的参数。(4)生成密钥对,获取公钥和私钥KeyPairkp=kpg.genKeyPair();PublicKeypbk=kp.getPublic();PrivateKeyprk=kp.getPrivate();分析:使用KeyPairGenerator类的genKeyPair()方法生成密钥对,进而使用密钥对的getPublic()和getPrivate()获取公钥和私钥。Java中KeyAgreement类实现了密钥协定,它使用init()方法传入自己的私钥,使用doPhase()方法传入对方的公钥,进而可以使用generateSecret()方法生成共享的信息具体步骤如下:(1)读取自己的DH私钥和对方的DH公钥FileInputStreamf1=newFileInputStream(args[0]);ObjectInputStreamb1=newObjectInputStream(f1);PublicKeypbk=(PublicKey)b1.readObject();FileInputStreamf2=newFileInputStream(args[1]);ObjectInputStreamb2=newObjectInputStream(f2);PrivateKeyprk=(PrivateKey)b2.readObject();分析:从文件中获取密钥。只是分为公钥和私钥两个文件,通过命令行参数传入公钥和私钥文件名,第一个命令行参数为对方的公钥文件名,第二个命令行参数为自己的私钥文件名。(2)创建密钥协定对象KeyAgreementka=KeyAgreement.getInstance(DH);分析:密钥协定对象即KeyAgreement类型的对象,和KeyPairGenerator类类似,KeyAgreement类是一个工厂类,通过其中预定义的一个静态方法getInstance()获取KeyAgreement类型的对象。getInstance()方法的参数指定为“DH”。(3)初始化密钥协定对象ka.init(prk);分析:执行密钥协定对象的init()方法,传入第1步获得的自己的私钥,它在第1步中通过第2个命令行参数提供。(4)执行密钥协定ka.doPhase(pbk,true);分析:执行密钥协定对象的doPhase()方法,其第一个参数中传入对方的公钥。(5)生成共享信息byte[]sb=ka.generateSecret();分析:执行密钥协定对象的generateSecret()方法,返回字节类型的数组。A、B双方得到的该数组的内容完全相同,用它创建密钥也各方完全相同。如可使用SecretKeySpeck=newSecretKeySpec(sb,DESede);创建密钥。流程图步骤1建立两个目录A和B,模拟需要秘密通信的A、B双方,由于DH算法需要A和B各自生成DH公钥和私钥,因此在这两个目录下都拷贝编译后文件Key_DH。2这样,A、B双方共享信息五、实习代码packagedh.a;importjava.io.*;importjava.math.*;importjava.security.*;importjava.security.spec.*;importjavax.crypto.*;importjavax.crypto.spec.*;importjavax.crypto.interfaces.*;publicclassKey_DH{/***@paramargs*///The1024bitDiffie-HellmanmodulusvaluesusedbySKIPprivatestaticfinalbyteskip1024ModulusBytes[]={(byte)0xF4,(byte)0x88,(byte)0xFD,(byte)0x58,(byte)0x4E,(byte)0x49,(byte)0xDB,(byte)0xCD,(byte)0x20,(byte)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,(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,(byte)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,(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,(byte)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};//TheSKIP1024bitmodulusprivatestaticfinalBigIntegerskip1024Modulus=newBigInteger(1,skip1024ModulusBytes);//thebaseusedwiththeskip1024bitmodulusprivatestaticfinalBigIntegerskip1024Base=BigInteger.valueOf(2);publicstaticvoidmain(Stringagrs[])throwsException{//DH创建密钥对时所用到的基数和模DHParameterSpecDHP=newDHParameterSpec(skip1024Modulus,skip1024Base);KeyPairGeneratorkpg=KeyPairGenerator.getInstance(DH);kpg.initialize(DHP);KeyPairkp=kpg.genKeyPair();PublicKeypbk=kp.getPublic();PrivateKeyprk=kp.getPrivate();FileOutputStreamf1=newFileOutputStream(keyB1.dat);ObjectOutputStreamb1=newObjectOutputStream(f1);b1.writeObject(pbk);FileOutputStreamf2=newFileOutputStream(keyB2.dat);ObjectOutputStreamb2=newObjectOutputStream(f2);b2.writeObject(prk);}}packagedh.a;importjava.io.*;importjava.math.*

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

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

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

×
保存成功