一、实验内容

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. C++第七次作业

    关于计算器项目的总结: 一.就目前完成的计算器,包括界面的实现这部分,总体实现了简单计算的功能,但仍有很多不足之处: 需改进完善之处:1.关于界面可再优化: 2.界面放大时,无法自动聚焦(按钮等控件无 ...

  2. python 使用csv 文件写入 出现多余空行数据解决方案

    因为csv.writerow() 方法会造成读取时每条数据后多一条空数据 解决方案如下: 分为两种情况 python2 和 python3 先说python2版本 with open('xxx.csv ...

  3. Oracle修改表空间为自动扩展

    https://gqsunrise.iteye.com/blog/2015692 1.数据文件自动扩展的好处1)不会出现因为没有剩余空间可以利用到数据无法写入2)尽量减少人为的维护3)可以用于重要级别 ...

  4. linux添加磁盘空间

    首先你要关掉系统,把分配的硬盘空间变大,或者重新建立一个虚拟硬盘(这时下面的就不是sda了,而是sdb1了).这两种方法都可行,我都试过了.其次用root用户登录到你的linux系统,查看你系统的分区 ...

  5. BZOJ4556:[TJOI\HEOI2016]字符串(后缀数组,主席树,二分,ST表)

    Description 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须正确回答这m个问题,才能打开箱 ...

  6. Git系列七之备份迁移 升级 恢复管理

    0.Gitlab安装 1.安装和配置必要的依赖关系在CentOS7,下面的命令将在系统防火墙打开HTTP和SSH访问. yum install curl openssh-server postfix ...

  7. [转]opengl入门例题(读取bmp图片,并显示)

    #include<gl/glut.h> #define FileName "bliss.bmp" static GLint imagewidth; static GLi ...

  8. STlinkSWD模式连线方式

    若使用SWD模式,则只需要连接4根线,7,9,20,1即SWDIO,SWDCLK,GND,VCC.VCC为3.3V

  9. JS实现网页换肤功能效果

    网页换肤的基本原理 使用 JS 切换对应的 CSS 样式表.例如hao123首页的右上方就有网页换肤功能.除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 Cookie 来记录用户之前更换过 ...

  10. bat输出重定向

    重定向符号主要有:>,>>,<,>&,<&和|,而本文只讨论前五个. 第一节 首先从一个经典问题开始,“1>nul 2>nul”的意思是 ...