实习4基于Diffle-Human的密钥交换.docx
实习四 基于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指定的参数DHParameterSpec DHP=new DHParameterSpec(skip1024Modulus,skip1024Base); (2)skip1024Modulus指定模,skip1024Base指定基数。模和基数取值在Internet协议简单密钥管理标准中已经指定,在安装JSDK后,计算机的C盘中存在C:jsdk-1_4_0-docdocsguidesecurityjceJCERefGuide.html文件,其中包含密钥长度为1024的DH密钥中的模和基数的定义,可以直接复制下来,在JCERefGuide.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 参数DHParameterSpec DHP=new DHParameterSpec(skip1024Modulus,skip1024Base);分析:和RSA算法类似,DH算法涉及到一些指数和取模运算,DH参数指定A、B双方在创建DH密钥时所公用的基数和模(2) 创建密钥对生成器KeyPairGenerator kpg= KeyPairGenerator.getInstance("DH");分析:密钥对生成器即KeyPairGenerator类型的对象,通过其中预定义的一个静态方法getInstance()获取KeyPairGenerator类型的对象。getInstance()方法的参数指定为“DH”。(3) 初始化密钥生成器kpg.initialize(DHP);分析:初始化时使用的参数即第1步中生成的参数。(4) 生成密钥对,获取公钥和私钥KeyPair kp=kpg.genKeyPair();PublicKey pbk=kp.getPublic( );PrivateKey prk=kp.getPrivate( );分析:使用KeyPairGenerator类的genKeyPair()方法生成密钥对,进而使用密钥对的 getPublic( )和 getPrivate( )获取公钥和私钥。 Java 中 KeyAgreement 类实现了密钥协定,它使用 init( )方法传入自己的私钥,使用 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 ObjectInputStream(f2);PrivateKey prk=(PrivateKey)b2.readObject( );分析:从文件中获取密钥。只是分为公钥和私钥两个文件,通过命令行参数传入公钥和私钥文件名,第一个命令行参数为对方的公钥文件名,第二个命令行参数为自己的私钥文件名。(2) 创建密钥协定对象KeyAgreement ka=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双方得到的该数组的内容完全相同,用它创建密钥也各方完全相同。如可使用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.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, (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; /The SKIP 1024 bit modulusprivate static final BigInteger skip1024Modulus = new BigInteger(1, skip1024ModulusBytes);/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 = KeyPairGenerator.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 FileOutputStream("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 /* * 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 ObjectInputStream(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;i<sb.length;i+) System.out.print(sbi+","); /创建秘钥 SecretKeySpec k=new SecretKeySpec(sb,"DESede");catch(Exception e)六、 实习总结基于Diffle-Human的密钥交换是建立在DH公钥和私钥基础上的密钥分配算法,这次实习的内容和上次的基本接近,但是,我还是花了好久的时间搞清楚老师给的实验指导里函数的含义,明白密钥交换原理,总之,这次实习收获不小,我会再接再厉的。