实习4基于DiffleHuman的密钥交换Word文件下载.docx

上传人:b****5 文档编号:16556663 上传时间:2022-11-24 格式:DOCX 页数:9 大小:141.82KB
下载 相关 举报
实习4基于DiffleHuman的密钥交换Word文件下载.docx_第1页
第1页 / 共9页
实习4基于DiffleHuman的密钥交换Word文件下载.docx_第2页
第2页 / 共9页
实习4基于DiffleHuman的密钥交换Word文件下载.docx_第3页
第3页 / 共9页
实习4基于DiffleHuman的密钥交换Word文件下载.docx_第4页
第4页 / 共9页
实习4基于DiffleHuman的密钥交换Word文件下载.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

实习4基于DiffleHuman的密钥交换Word文件下载.docx

《实习4基于DiffleHuman的密钥交换Word文件下载.docx》由会员分享,可在线阅读,更多相关《实习4基于DiffleHuman的密钥交换Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。

实习4基于DiffleHuman的密钥交换Word文件下载.docx

\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公钥和私钥基础上的密钥分配算法,这次实习的内容和上次的基本接近,但是,我还是花了好久的时间搞清楚老师给的实验指导里函数的含义,明白密钥交换原理,总之,这次实习收获不小,我会再接再厉的。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 笔试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1