实习4基于DiffleHuman的密钥交换Word文件下载.docx
- 文档编号:16556663
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:9
- 大小:141.82KB
实习4基于DiffleHuman的密钥交换Word文件下载.docx
《实习4基于DiffleHuman的密钥交换Word文件下载.docx》由会员分享,可在线阅读,更多相关《实习4基于DiffleHuman的密钥交换Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。
\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("
密钥协定对象即KeyAgreement类型的对象,和KeyPairGenerator类类似,
KeyAgreement类是一个工厂类,通过其中预定义的一个静态方法getInstance()获
取KeyAgreement类型的对象。
(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-HellmanmodulusvaluesusedbySKIP
privatestaticfinalbyteskip1024ModulusBytes[]={
(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
};
//TheSKIP1024bitmodulus
privatestaticfinalBigIntegerskip1024Modulus=newBigInteger(1,skip1024ModulusBytes);
//thebaseusedwiththeskip1024bitmodulus
privatestaticfinalBigIntegerskip1024Base=BigInteger.valueOf
(2);
publicstaticvoidmain(Stringagrs[])throwsException
{
//DH创建密钥对时所用到的基数和模
DHParameterSpecDHP=newDHParameterSpec(skip1024Modulus,skip1024Base);
KeyPairGeneratorkpg=KeyPairGenerator.getInstance("
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);
}
}
publicclassKeyAgree{
publicstaticvoidmain(Stringagrs[])
try{
//读取DH私钥和对方公钥
FileInputStreamf1=newFileInputStream("
ObjectInputStreamb1=newObjectInputStream(f1);
PublicKeypbk=(PublicKey)b1.readObject();
FileInputStreamf2=newFileInputStream("
keyA2.dat"
ObjectInputStreamb2=newObjectInputStream(f2);
PrivateKeyprk=(PrivateKey)b2.readObject();
//创建秘钥协定对象
KeyAgreementka=KeyAgreement.getInstance("
//用自己的私钥初始化密钥协定对象
ka.init(prk);
/*执行密钥协定对象
*
**/
ka.doPhase(pbk,true);
//生成共享信息
byte[]sb=ka.generateSecret();
for(inti=0;
i<
sb.length;
i++){
System.out.print(sb[i]+"
"
//创建秘钥
SecretKeySpeck=newSecretKeySpec(sb,"
}catch(Exceptione){
}
六、实习总结
基于Diffle-Human的密钥交换是建立在DH公钥和私钥基础上的密钥分配算法,这次实习的内容和上次的基本接近,但是,我还是花了好久的时间搞清楚老师给的实验指导里函数的含义,明白密钥交换原理,总之,这次实习收获不小,我会再接再厉的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实习 基于 DiffleHuman 密钥 交换