一、实验内容

1.掌握Socket程序的编写;

2.掌握密码技术的使用;

3.设计安全传输系统。

二、实验基础:

IP和端口:IP是用来标示计算机,而端口是用来标示某个计算机上面的特定应用。至于它们的详细介绍,可以查阅相关资料。总之,网络上通信和交互,就是指计算机上端口之间通信与交互。

客户端和服务端:客户端就是享用服务的计算机,而服务端就是提供服务的计算机。客户端和服务端,可以简称为C/S模型。另外,还有一类模型,即B/S模型,利用各种浏览器来享用服务的方式。

TCP和UDP:TCP,传输控制协议,是一种面向连接的可靠传输协议,UDP,用户数据包协议,是一种无连接的不可靠的传输协议。根据不同的应用场景和对于应用的具体要求,选择合适的通信协议。比方说,对于那种注重可靠性,应该选择TCP方式,而对于那种能够容纳一定程度的差错,同时注重传输速度,应该选择UDP方式。

三、实验步骤

1.我负责服务器,搭档负责客户端。搭档20135330张若嘉

2.创建服务器和客户程序,在运行客户程序的计算机上输入的内容,可以在服务器屏幕上看到。

服务器源程序:

3.选择对称算法进行数据加解密.

4. 选择非对称算法对对称加密密钥进行密钥分发.

5. 选择合适的Hash算法进行完整性验证.

6. 选择合适的算法对Hash值进行签名/验证.

四、实验结果

五、实验中遇到的问题

如何建立连接

IPv4地址为本机IP地址

六、统计时间

步骤

耗时(min)

百分比

需求分析

40

18.18%

设计

50

22.72%

代码实现

60

27.27%

测试

50

22.72%

分析总结

20

9.09%

七、实验总结

Java网络编程,又称为套接字编程。基于不同的协议,实现通信方式,实现了桌面应用程序的互联网化。将两个电脑相连传输数据,对代码进行组合,不熟悉的编程形式给自己带来了很大的进步。

八、实验代码

 

 import java.net.*;

 import java.io.*;

 import java.security.*;

 import java.security.spec.*;

 import javax.crypto.*;

 import javax.crypto.spec.*;

 import javax.crypto.interfaces.*;

 import java.security.interfaces.*;

 import java.math.*;

 public class ComputeTCPServer{

         public static void main(String srgs[]) throws Exception {

         ServerSocket sc = null;

         Socket socket=null;

             try {

                          sc= new ServerSocket(4420);//创建服务器套接字

             System.out.println("端口号:" + sc.getLocalPort());

             System.out.println("服务器已经启动...");

             socket = sc.accept();   //等待客户端连接

             System.out.println("已经建立连接");

                 //获得网络输入流对象的引用

             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                 ////获得网络输出流对象的引用

                          PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);

                          String aline2=in.readLine();

                          BigInteger c=new BigInteger(aline2);

                          FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");

                          ObjectInputStream b=new ObjectInputStream(f);

                          RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );

                          BigInteger d=prk.getPrivateExponent();

                          BigInteger n=prk.getModulus();

                          //System.out.println("d= "+d);

                          //System.out.println("n= "+n);

                          BigInteger m=c.modPow(d,n);

                          //System.out.println("m= "+m);

                          byte[] keykb=m.toByteArray();

                          //String aline3=new String(mt,"UTF8");

                          //String aline3=parseByte2HexStr(byte buf[]);

                          String aline=in.readLine();//读取客户端传送来的数据

                          //FileInputStream  f2=new FileInputStream("keykb1.dat");

                          //int num2=f2.available();

                          //byte[] keykb=new byte[num2];         

                          //f2.read(keykb);

                          byte[] ctext=parseHexStr2Byte(aline);

                          Key k=new  SecretKeySpec(keykb,"DESede");

                          Cipher cp=Cipher.getInstance("DESede");

                          cp.init(Cipher.DECRYPT_MODE, k);

                          byte []ptext=cp.doFinal(ctext);

                          String p=new String(ptext,"UTF8");

                          System.out.println("从客户端接收到信息为:"+p); //通过网络输出流返回结果给客户端

                          /*String aline2=in.readLine();

                          BigInteger c=new BigInteger(aline2);

                          FileInputStream f=new FileInputStream("Skey_RSA_priv.dat");

                          ObjectInputStream b=new ObjectInputStream(f);

                          RSAPrivateKey prk=(RSAPrivateKey)b.readObject( );

                          BigInteger d=prk.getPrivateExponent();

                          BigInteger n=prk.getModulus();

                          //System.out.println("d= "+d);

                          //System.out.println("n= "+n);

                          BigInteger m=c.modPow(d,n);

                          //System.out.println("m= "+m);

                          byte[] mt=m.toByteArray();

                          //String aline3=new String(mt,"UTF8");*/

                  String aline3=in.readLine();

                  String x=p;

                  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);

                  if(aline3.equals(result)){

                          System.out.println("匹配成功");

                  }

                          out.println("匹配成功");

                          out.close();

                          in.close();

                          sc.close();

             } catch (Exception e) {

             System.out.println(e);

         }

     }

         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; 

     } 

 }

java实验报告五的更多相关文章

  1. Java实验报告五:Java网络编程及安全

    Java实验报告五:Java网络编程及安全                                                                               ...

  2. 20145205 《Java程序设计》实验报告五:Java网络编程及安全

    20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...

  3. 20145221 《Java程序设计》实验报告五:网络编程及安全

    20145221 <Java程序设计>实验报告五:网络编程及安全 实验要求 掌握Socket程序的编写 运行TCP代码包,结对进行,一人服务器,一人客户端 掌握密码技术的使用 利用加解密代 ...

  4. 第五次java实验报告

    Java实验报告 班级 计科二班 学号 20188437 姓名 何磊 完成时间2019/10/10 评分等级 实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实 ...

  5. 20135231 JAVA实验报告三:敏捷开发与XP实践

    ---恢复内容开始--- JAVA实验报告三:敏捷开发与XP实践 20135231 何佳 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习 ...

  6. JAVA实验报告及第七周总结

    JAVA第六周作业 实验报告五 第一题 1.设计一个类层次,定义一个抽象类--形状,其中包括有求形状的面积的抽象方法. 继承该抽象类定义三角型.矩形.圆. 分别创建一个三角形.矩形.圆存对象,将各类图 ...

  7. 第七次java实验报告

    Java实验报告 班级 计科二班 学号20188437 姓名 何磊 完成时间 2019/10/25 评分等级 实验四 类的继承 实验内容 )总票数1000张:(2)10个窗口同时开始卖票:(3)卖票过 ...

  8. 第七周&实验报告五

    实验四 类的继承 •实验目的 •理解抽象类与接口的使用: •了解包的作用,掌握包的设计方法. •实验要求 •掌握使用抽象类的方法. •掌握使用系统接口的技术和创建自定义接口的方法. •了解 Java ...

  9. Java实验报告二:Java面向对象程序设计

    Java实验报告二:Java面向对象程序设计                                                                               ...

随机推荐

  1. JavaSript模块规范 - AMD规范与CMD规范介绍[转]

    原文地址:http://blog.chinaunix.net/uid-26672038-id-4112229.html JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什 ...

  2. import org.apache.http.xxxxxx 爆红,包不存在之解决办法

    问题如下:import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http ...

  3. JAVA 框架 springmvc controller的返回值

    一.返回值:ModleView对象. 使用modelAndView.setViewName设置返回的页面.使用modelAndView.addObject设置返回的数据. @RequestMappin ...

  4. JAVA框架Struts2 servlet API

    一:servlet API 1)完全解耦接口: 使用ActionContext类进行相关操作: package jd.com.actioncontex; import com.opensymphony ...

  5. Vue复选框的全选

    <!DOCTYPE html><html>    <head>        <meta charset="utf-8">      ...

  6. A. Pride

    You have an array a with length n, you can perform operations. Each operation is like this: choose t ...

  7. DB2创建function(一)

    案例一:根据传入的值返回一个满足条件的值.适用于查询的字段(经过较复杂逻辑得出) CREATE FUNCTION "FAS"."GET_ALL_NAME" ( ...

  8. Docker:一个装应用的容器

    一:简介:你是否经历过“我本地运行没问题啊!““哪个哥们有写死循环了““完了,服务器撑不住了“等等问题,docker就是这么帮你解决问题的工具,它可以帮你把web应用自动化打包和发布,在服务型环境下进 ...

  9. 2.2《想成为黑客,不知道这些命令行可不行》(Learn Enough Command Line to Be Dangerous)——列表

    也许最常用的Unix命令是ls了,它是'list'的简写(Listing 8) Listing 8 用ls以列表的形式显示文件和目录(内容输出跟各自电脑有关) $ ls Desktop Downloa ...

  10. 实现MD5的加密和解密

    加密代码 public static string Encrypt(string Text, string sKey) { DESCryptoServiceProvider des = new DES ...