实习四基于DiffleHuman的密钥交换软件123邵帅013403.docx
- 文档编号:7330530
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:22
- 大小:164.34KB
实习四基于DiffleHuman的密钥交换软件123邵帅013403.docx
《实习四基于DiffleHuman的密钥交换软件123邵帅013403.docx》由会员分享,可在线阅读,更多相关《实习四基于DiffleHuman的密钥交换软件123邵帅013403.docx(22页珍藏版)》请在冰豆网上搜索。
实习四基于DiffleHuman的密钥交换软件123邵帅013403
实习四基于Diffle-Human的密钥交换
软件123邵帅2012013403
一、实习目的
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()方法生成共享的信息。
四、过程截图
(一)启动服务器端,连接服务器端
(二)互相发送公开密钥,接收对方的公开密钥
(3)两端产生私密密钥用来解密
五、算法和流程图
算法分析:
Diffie-Hellman密钥交换算法的有效性依赖于计算离散对数的难度。
简言之,可以如下定义离散对数:
首先定义一个素数p的原根,为其各次幂产生从1到p-1的所有整数根,也就是说,如果a是素数p的一个原根,那么数值
amodp,a2modp,...,ap-1modp
是各不相同的整数,并且以某种排列方式组成了从1到p-1的所有整数。
对于一个整数b和素数p的一个原根a,可以找到惟一的指数i,使得
b=aimodp其中0≤i≤(p-1)
指数i称为b的以a为基数的模p的离散对数或者指数。
该值被记为inda,p(b)。
基于此背景知识,可以定义Diffie-Hellman密钥交换算法。
该算法描述如下:
1、有两个全局公开的参数,一个素数q和一个整数a,a是q的一个原根。
2、假设用户A和B希望交换一个密钥,用户A选择一个作为私有密钥的随机数XA A对XA的值保密存放而使YA能被B公开获得。 类似地,用户B选择一个私有的随机数XB B对XB的值保密存放而使YB能被A公开获得。 3、用户A产生共享秘密密钥的计算方式是K=(YB)XAmodq。 同样,用户B产生共享秘密密钥的计算是K=(YA)XBmodq。 这两个计算产生相同的结果: K=(YB)XAmodq =(aXBmodq)XAmodq =(aXB)XAmodq(根据取模运算规则得到) =aXBXAmodq =(aXA)XBmodq =(aXAmodq)XBmodq =(YA)XBmodq 因此相当于双方已经交换了一个相同的秘密密钥。 4、因为XA和XB是保密的,一个敌对方可以利用的参数只有q、a、YA和YB。 因而敌对方被迫取离散对数来确定密钥。 例如,要获取用户B的秘密密钥,敌对方必须先计算 XB=inda,q(YB) 然后再使用用户B采用的同样方法计算其秘密密钥K。 Diffie-Hellman密钥交换算法的安全性依赖于这样一个事实: 虽然计算以一个素数为模的指数相对容易,但计算离散对数却很困难。 对于大的素数,计算出离散对数几乎是不可能的。 流程图: 五、实验总结 这次实习的内容是基于Diffle-Human的密钥交换,在老师所给的代码的基础上,我完成了实习所实现的内容,重点在于理解Diffle-Human的密钥交换思想。 Diffle-Human密钥交换算法使得两个用户能够安全的交换密钥,得到一个共享的会话密钥,但算法分身不能用于加解密,DH算法的安全性是建立在求离散对数的困难性的基础上的。 通过查阅实验指导书和网上的相关资料,我了解到Diffle-Human算法大致描述描述为: (1)有两个全局公开的参数,一个素数q和一个整数a,a是q的一个原根. (2)假设用户A和B希望交换一个密钥,用户A选择一个作为私有密钥的随机数XA(XA A对XA的值保密存放而使YA能被B公开获得。 (3)用户A产生共享秘密密钥的计算方式是K=(YB)^XAmodq.同样,用户B产生共享秘密密钥的计算是K=(YA)^XBmodq.这两个计算产生相同的结果 (4)因为XA和XB是保密的,一个敌对方可以利用的参数只有q,a,YA和YB.因而敌对方被迫取离散对数来确定密钥. 首先考虑这种密钥交换方法的保密性: 由于道了XA,XB是随机生成的,及时破解者知Y,YAB,a,p也不易求出XA,XB,如果要求出,及要求离散对数。 因此,共享密钥是安全的。 采用DH方法,根据通信双方格子的秘密信息计算出公开信息后,把各自的公开信息传送给对方,再计算共享密钥,但是一定要保密。 用随机数生成器生成会话密钥,然后用共享密钥对会话密钥进行加密,给通信方,让其可以解密后知道会话密钥,这时用会话密钥对数据加密,传送密文,接收方受到密文用会话密钥解密成明文即可。 整体流程大概为用户A,B共用公共参数原根a和模q,然后A,B分别随机选取私钥,计算出两端用于交换的公钥,双方互换公钥后,通过对方的公钥计算出公共的私钥。 通过这次实习,我更加深入理解了Diffle-Human密钥交换的过程,以及说它密钥安全的算法和优点,收获很多,以后要继续努力。 七、代码清单 主程序: -----产生私钥和公钥 importjava.io.ObjectOutputStream; importjava.math.BigInteger; importjava.security.*; importjava.security.KeyPairGenerator; importjava.security.spec.*; importjavax.crypto.*; importjavax.crypto.spec.*; importjavax.crypto.interfaces.*; importjava.io.*; 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); publicstaticvoidproduceKey(Stringpath1,Stringpath2) { try{//DH创建密钥对时所用到的基数和模 DHParameterSpecDHP=newDHParameterSpec(skip1024Modulus,skip1024Base); KeyPairGeneratorkpg=KeyPairGenerator.getInstance("DH"); kpg.initialize(DHP); KeyPairkp=kpg.genKeyPair(); PublicKeypbk=kp.getPublic(); PrivateKeyprk=kp.getPrivate(); FileOutputStreamf1=newFileOutputStream(path1); ObjectOutputStreamb1=newObjectOutputStream(f1); b1.writeObject(pbk); FileOutputStreamf2=newFileOutputStream(path2); ObjectOutputStreamb2=newObjectOutputStream(f2); b2.writeObject(prk); }catch(Exceptione) { e.printStackTrace(); } } } ------通过对方的公钥产生公共私钥 importjava.io.FileInputStream; importjava.io.ObjectInputStream; importjava.security.*; importjavax.crypto.KeyAgreement; importjavax.crypto.spec.SecretKeySpec; publicclassKeyAgree{ /** *@paramargs */ publicstaticbyte[]producePrk(PublicKeypbk,PrivateKeyprk) { SecretKeySpeck=null; byte[]key=null; try { KeyAgreementka=KeyAgreement.getInstance("DH"); //用自己的私钥初始化密钥协定对象 ka.init(prk); /*执行密钥协定对象 * **/ ka.doPhase(pbk,true); //生成共享信息 key=ka.generateSecret(); for(inti=0;i { System.out.println(key[i]+","); } k=newSecretKeySpec(key,"SDSede"); }catch(Exceptione) { e.printStackTrace(); } returnkey; } } 辅助代码: -------client端 importjava.awt.EventQueue; importjavax.crypto.spec.SecretKeySpec; importjavax.swing.JFrame; importjavax.swing.JPanel; importjavax.swing.border.EmptyBorder; importjavax.swing.JLabel; importjava.awt.Font; importjava.awt.Color; importjavax.swing.*; importjava.awt.event.ActionListener; importjava.awt.event.ActionEvent; importjava.io.*; import.*; importjava.security.PrivateKey; importjava.security.PublicKey; publicclassClientextendsJFrame{ privateJPanelcontentPane; privateSocketsocketk=null; privateObjectOutputStreamoutprk; privateObjectInputStreaminputprk; privatePublicKeypbk=null; privatePrivateKeyprk=null; /** *Launchtheapplication. */ publicstaticvoidmain(String[]args){ EventQueue.invokeLater(newRunnable(){ publicvoidrun(){ try{ Clientframe=newClient(); frame.setVisible(true); }catch(Exceptione){ e.printStackTrace(); } } }); } /** *Createtheframe. */ publicClient(){ setFont(newFont("Dialog",Font.PLAIN,18)); setTitle("Diffle-HumanA\u7AEF"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100,100,474,447); contentPane=newJPanel(); contentPane.setBorder(newEmptyBorder(5,5,5,5)); setContentPane(contentPane); contentPane.setLayout(null); finalJTextAreatextArea=newJTextArea(); textArea.setWrapStyleWord(true); textArea.setLineWrap(true); textArea.setBounds(10,38,244,138); contentPane.add(textArea); JLabellabel=newJLabel("\u5BF9\u65B9\u516C\u5F00\u516C\u94A5"); label.setFont(newFont("宋体",Font.PLAIN,18)); label.setForeground(Color.MAGENTA); label.setBounds(10,10,108,15); contentPane.add(label); JLabellabel_1=newJLabel("\u79D8\u5BC6\u5BC6\u94A5"); label_1.setForeground(Color.MAGENTA); label_1.setFont(newFont("宋体",Font.PLAIN,18)); label_1.setBounds(10,225,82,15); contentPane.add(label_1); finalJTextAreatextArea_1=newJTextArea(); textArea_1.setEditable(false); textArea_1.setLineWrap(true); textArea_1.setBounds(10,252,244,138); contentPane.add(textArea_1); JButtonbutton_1=newJButton("\u8FDE\u63A5\u670D\u52A1\u5668"); button_1.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ try{ socketk=newSocket("127.0.0.1",4332); outprk=newObjectOutputStream(socketk.getOutputStream()); inputprk=newObjectInputStream(socketk.getInputStream()); }catch(UnknownHostExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); }catch(IOExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }); button_1.setBounds(319,55,118,41); contentPane.add(button_1); JButtonbutton=newJButton("\u4EA7\u751F\u79D8\u5BC6\u5BC6\u94A5"); button.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEventarg0){ if(pbk==null) { textArea.setText("pleasewaitingBsendhispublickey"); return; } else { byte[]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实习 基于 DiffleHuman 密钥 交换 软件 123 邵帅 013403