实验内容:
两人一组结对编程:html
实验内容:
结对编程:1人负责客户端,一人负责服务器java
上传测试结果截图和码云连接
在本次实验中我负责服务器,将从客户端传过来的后缀表达式进行计算而后传给客户端。
经过socketOnServer = serverForClient.accept()
接受客户端传过来的字符串数据,而后经过建立服务器的输入输出流,把输入输出流指向服务器out=new DataOutputStream(socketOnServer.getOutputStream());
,in=new DataInputStream(socketOnServer.getInputStream());
。in.readUTF()
来读取客户端传来的数据,out.writeUTF(m+"");
把数据写入客户端。git
代码连接算法
上传测试结果截图和码云连接编程
key1.dat
文件,并打印出文件的编码:import java.io.*; import java.security.*; public class Skey_kb{ public static void main(String args[]) throws Exception{ FileInputStream f=new FileInputStream("key1.dat"); ObjectInputStream b=new ObjectInputStream(f); Key k=(Key)b.readObject( ); byte[ ] kb=k.getEncoded( ); FileOutputStream f2=new FileOutputStream("keykb1.dat"); f2.write(kb); // 打印密钥编码中的内容 for(int i=0;i<kb.length;i++){ System.out.print(kb[i]+","); } } }
byte
写入byte
数组a中,并用数组a做为秘钥来进行加密代码连接数组
建立DH公钥和私钥:安全
key_DH
代码:public class Key_DH{ private 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 modulus private static final BigInteger skip1024Modulus = new BigInteger(1, skip1024ModulusBytes); // The base used with the SKIP 1024 bit modulus private static final BigInteger skip1024Base = BigInteger.valueOf(2); public static void main(String args[ ]) throws Exception{ 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(args[0]); ObjectOutputStream b1=new ObjectOutputStream(f1); b1.writeObject(pbk); // 保存私钥 FileOutputStream f2=new FileOutputStream(args[1]); ObjectOutputStream b2=new ObjectOutputStream(f2); b2.writeObject(prk); } }
KeyAgree
代码:import java.security.PublicKey; import java.security.PrivateKey; import java.io.*; import javax.crypto.KeyAgreement; import javax.crypto.spec.*; public class KeyAgree{ public static void main(String args[ ]) throws Exception{ // 读取对方的DH公钥 FileInputStream f1=new FileInputStream(args[0]); ObjectInputStream b1=new ObjectInputStream(f1); PublicKey pbk=(PublicKey)b1.readObject( ); //读取本身的DH私钥 FileInputStream f2=new FileInputStream(args[1]); 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.println(sb[i]+","); } SecretKeySpec k=new SecretKeySpec(sb,"AES"); } }
在Windows命令行中输入:java Key_DH Apub.dat Apri.dat
和 java Key_DH Bpub.dat Bpri.dat
,产生A的公钥Apub.dat
和私钥Apri.dat
,B的公钥Bpub.dat
和私钥Bpri.dat
,A,B各自存放对方私钥,经过信道传输各自公钥。服务器
A用Apub.dat
和Bpri.dat
产生共享密钥,B一样使用Bpub.dat
,Bpri.dat
生成共享密钥。加解密就用共享密钥。且二者生成的共享密钥是相同的,比对Ckey.dat
和Dkey.dat
打印的编码相同。网络
ckey.dat
写入字节数组中:Ckey.dat
进行解密,客户端用共享秘钥Dkey.dat
加密:代码连接socket
上传测试结果截图和码云连接
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。
在windo命令行中输入:java DigestCalc 20165235qy ying
来进行查看消息摘要。
import java.security.*; public class DigestPass{ static String md5(String str) throws Exception{ MessageDigest m=MessageDigest.getInstance("MD5"); m.update(str.getBytes("UTF8")); byte s[ ]=m.digest( ); String result=""; for (int i=0; i<s.length; i++){ result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6); } return result; } }
经过本次实验,对java密码学和java网络编程有了深度的学习。
步骤 | 耗时 | 百分比 |
---|---|---|
需求分析 | 20min | 8% |
设计 | 60min | 25% |
代码实现 | 120min | 50% |
测试 | 10min | 4% |
分析总结 | 30min | 13% |