实验四

Java试验四

北京电子科技学院(BESTI)

实  验  报  告

 课程: Java        班级:1352          姓名:黄伟业         学号:20135215

 成绩:               指导教师:娄嘉鹏    实验日期:2015.6.11

实验密级:         预习程度:             实验时间:15:30~18:00

仪器组次:15         必修/选修:选修       实验序号:(四)

实验名称:Java面向对象程序设计

实验目的:

1.掌握Java网络编程的方法;

2.掌握Java安全编程的方法;

3. 能综合使用各种技术; 

实验内容一:

1.运行教材上TCP代码,结对进行,一人服务器,一人客户端。

2.利用加解密代码包,编译运行代码,客户端加密,服务器解密。

3.客户端加密明文后将密文通过TCP发送。

4.加密使用DES,DES加密密钥key发送至服务器,使用服务器的公钥加密,公钥算法使用RSA,检验发送信息的完整性使用MD5。

结对网络编程

服务器:

客户端:

实验代码:

服务器:

import java.net.*; import java.io.*; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; import java.security.spec.*; import javax.crypto.interfaces.*; import java.security.interfaces.*; import java.math.*; public class ComputeTCPClient { public static void main(String srgs[]) throws Exception{ try { KeyGenerator kg=KeyGenerator.getInstance("DESede"); kg.init(168);  SecretKey k=kg.generateKey( ); byte[] ptext2=k.getEncoded(); //String kstr=parseByte2HexStr(kb);
//创建连接特定服务器的指定端口的Socket对象 Socket socket = new Socket("10.1.0.243", 4410); //获得从服务器端来的网络输入流 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //获得从客户端向服务器端输出数据的网络输出流 PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); //创建键盘输入流,以便客户端从键盘上输入信息 BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
FileInputStream f3=new FileInputStream("Skey_RSA_pub.dat"); ObjectInputStream b2=new ObjectInputStream(f3); RSAPublicKey pbk=(RSAPublicKey)b2.readObject( ); BigInteger e=pbk.getPublicExponent(); BigInteger n=pbk.getModulus(); //System.out.println("e= "+e); //System.out.println("n= "+n); //byte ptext2[]=kstr.getBytes("UTF8"); BigInteger m=new BigInteger(ptext2); BigInteger c=m.modPow(e,n); //System.out.println("c= "+c); String cs=c.toString( ); out.println(cs); //通过网络传送到服务器
System.out.print("请输入待发送的数据:");  String s=stdin.readLine(); //从键盘读入待发送的数据 Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext[]=s.getBytes("UTF8"); byte ctext[]=cp.doFinal(ptext); String str=parseByte2HexStr(ctext); out.println(str); //通过网络传送到服务器
String x=s; MessageDigest m2=MessageDigest.getInstance("MD5"); m2.update(x.getBytes( )); byte a[ ]=m2.digest( ); String result=""; for (int i=0; i<a.length; i++){ result+=Integer.toHexString((0x000000ff & a[i]) |  0xffffff00).substring(6); } System.out.println(result); out.println(result);
/*s=result; FileInputStream f3=new FileInputStream("Skey_RSA_pub.dat"); ObjectInputStream b2=new ObjectInputStream(f3); RSAPublicKey pbk=(RSAPublicKey)b2.readObject( ); BigInteger e=pbk.getPublicExponent(); BigInteger n=pbk.getModulus(); //System.out.println("e= "+e); //System.out.println("n= "+n); byte ptext2[]=s.getBytes("UTF8"); BigInteger m=new BigInteger(ptext2); BigInteger c=m.modPow(e,n); //System.out.println("c= "+c); String cs=c.toString( ); out.println(cs); //通过网络传送到服务器*/
str=in.readLine();//从网络输入流读取结果 System.out.println( "从服务器接收到的结果为:"+str); //输出服务器返回的结果 } catch (Exception e) { System.out.println(e); } finally{ //stdin.close(); //in.close(); //out.close(); //socket.close(); }
} public static String parseByte2HexStr(byte buf[]) {  StringBuffer sb = new StringBuffer();  for (int i = 0; i < buf.length; i++) {  String hex = Integer.toHexString(buf[i] & 0xFF);  if (hex.length() == 1) {  hex = '0' + hex;  }  sb.append(hex.toUpperCase());  }  return sb.toString();  }  public static byte[] parseHexStr2Byte(String hexStr) {  if (hexStr.length() < 1)  return null;  byte[] result = new byte[hexStr.length()/2];  for (int i = 0;i< hexStr.length()/2; i++) {  int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);  int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);  result[i] = (byte) (high * 16 + low);  }  return result;  }  }

客户端:

import java.net.*; import java.io.*; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; import java.security.spec.*; import javax.crypto.interfaces.*; import java.security.interfaces.*; import java.math.*; public class ComputeTCPClient { public static void main(String srgs[]) throws Exception{ try { KeyGenerator kg=KeyGenerator.getInstance("DESede"); kg.init(168);  SecretKey k=kg.generateKey( ); byte[] ptext2=k.getEncoded(); //String kstr=parseByte2HexStr(kb);
//创建连接特定服务器的指定端口的Socket对象 Socket socket = new Socket("10.1.0.243", 4410); //获得从服务器端来的网络输入流 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); //获得从客户端向服务器端输出数据的网络输出流 PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); //创建键盘输入流,以便客户端从键盘上输入信息 BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
FileInputStream f3=new FileInputStream("Skey_RSA_pub.dat"); ObjectInputStream b2=new ObjectInputStream(f3); RSAPublicKey pbk=(RSAPublicKey)b2.readObject( ); BigInteger e=pbk.getPublicExponent(); BigInteger n=pbk.getModulus(); //System.out.println("e= "+e); //System.out.println("n= "+n); //byte ptext2[]=kstr.getBytes("UTF8"); BigInteger m=new BigInteger(ptext2); BigInteger c=m.modPow(e,n); //System.out.println("c= "+c); String cs=c.toString( ); out.println(cs); //通过网络传送到服务器
System.out.print("请输入待发送的数据:");  String s=stdin.readLine(); //从键盘读入待发送的数据 Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext[]=s.getBytes("UTF8"); byte ctext[]=cp.doFinal(ptext); String str=parseByte2HexStr(ctext); out.println(str); //通过网络传送到服务器
String x=s; MessageDigest m2=MessageDigest.getInstance("MD5"); m2.update(x.getBytes( )); byte a[ ]=m2.digest( ); String result=""; for (int i=0; i<a.length; i++){ result+=Integer.toHexString((0x000000ff & a[i]) |  0xffffff00).substring(6); } System.out.println(result); out.println(result);
/*s=result; FileInputStream f3=new FileInputStream("Skey_RSA_pub.dat"); ObjectInputStream b2=new ObjectInputStream(f3); RSAPublicKey pbk=(RSAPublicKey)b2.readObject( ); BigInteger e=pbk.getPublicExponent(); BigInteger n=pbk.getModulus(); //System.out.println("e= "+e); //System.out.println("n= "+n); byte ptext2[]=s.getBytes("UTF8"); BigInteger m=new BigInteger(ptext2); BigInteger c=m.modPow(e,n); //System.out.println("c= "+c); String cs=c.toString( ); out.println(cs); //通过网络传送到服务器*/
str=in.readLine();//从网络输入流读取结果 System.out.println( "从服务器接收到的结果为:"+str); //输出服务器返回的结果 } catch (Exception e) { System.out.println(e); } finally{ //stdin.close(); //in.close(); //out.close(); //socket.close(); }
} public static String parseByte2HexStr(byte buf[]) {  StringBuffer sb = new StringBuffer();  for (int i = 0; i < buf.length; i++) {  String hex = Integer.toHexString(buf[i] & 0xFF);  if (hex.length() == 1) {  hex = '0' + hex;  }  sb.append(hex.toUpperCase());  }  return sb.toString();  }  public static byte[] parseHexStr2Byte(String hexStr) {  if (hexStr.length() < 1)  return null;  byte[] result = new byte[hexStr.length()/2];  for (int i = 0;i< hexStr.length()/2; i++) {  int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);  int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);  result[i] = (byte) (high * 16 + low);  }  return result;  }  }

统计的PSP(Personal Software Process)时间:

步骤

耗时(min

百分比

需求分析

30

12.5%

设计

70

29.2%

代码实现

70

29.2%

测试

40

16.7%

分析总结

30

12.5%

实验中遇到的问题:

对本次试验还是不太会,通过大量请教同学,和自己查找网上总有所获吧。在客户端和服务器设置时需要端口一致。

 

小组成员:

吕松鸿:http://www.cnblogs.com/lv-20135229/p/4553600.html

朱国庆:http://www.cnblogs.com/20135237zero/

 

posted @ 2015-06-11 23:18  爱吃鸡翅膀  阅读(173)  评论(0编辑  收藏  举报