一、实验内容

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. 如何在SAE搭建属于自己的黑盒xss安全测试平台

    Author:雪碧 http://weibo.com/520613815 此篇文章技术含量不高,大牛不喜勿喷,Thx!写这篇文章主要是为了各位小伙伴在SAE搭建XSSING平台的时候少走点弯路(同志们 ...

  2. Oracle_spatial的空间操作符介绍

    空间操作符 一.主要空间操作符 1.SDO_FILTER SDO_FILTER(geometry1, geometry2, param); 判断两个几何体是否有相交 SELECT c.mkt_id, ...

  3. Netty入门(九)空闲连接以及超时

    检测空闲连接和超时是为了及时释放资源.常见的方法是发送消息来测试一个不活跃的连接,通常称为“心跳”. Netty 提供了几个 ChannelHandler 来实现此目的,如下: 下面是 IdleSta ...

  4. 【转】Android实战技巧之四十九:Usb通信之USB Host

    零 USB背景知识 USB是一种数据通信方式,也是一种数据总线,而且是最复杂的总线之一. 硬件上,它是用插头连接.一边是公头(plug),一边是母头(receptacle).例如,PC上的插座就是母头 ...

  5. Spark项目之电商用户行为分析大数据平台之(三)大数据集群的搭建

    Zookeeper集群搭建 http://www.cnblogs.com/qingyunzong/p/8619184.html Hadoop集群搭建 http://www.cnblogs.com/qi ...

  6. 2.3.1 TextView(文本框)详解

    http://www.runoob.com/w3cnote/android-tutorial-textview.html 1.基础属性详解: 通过下面这个简单的界面,我们来了解几个最基本的属性: 布局 ...

  7. WorldWind源码剖析系列:四元数类Quaternion

    PluginSDK中的Quaternion4d类可能是感觉Microsoft.DirectX. Quaternion类不太实用或不够用,自己有重新写的. 四元数是英国数学家哈密顿(W.R.Hamilt ...

  8. 利用存储过程来重命名SQL Server数据库

    最近遇到一个需要在多用户模式下重新命名数据库的Case, 因为数据库可能被其他用户使用,所以直接修改可能会失败.对于此种情况,我们可以等所有用户结束使用数据库时修改,或者是将数据库切换到单用户模式下进 ...

  9. 在ROS中使用QT界面

    在终端可以直接用catkin_create_qt_pkg命令创建带Qt界面的ROS package,再按照前面说的方法导入到Qt即可 这里参考的是qt_createTutorialsQt App Te ...

  10. Android检查手机上是否安装了第三方软件的方法------本文以百度地图为例

    package com.example.myapi.thirdbaidumap; import java.net.URISyntaxException; import java.util.ArrayL ...