一、实验内容

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. swiper.js 多图片页面的懒加载lazyLoading

    swiper.js官网:http://www.swiper.com.cn/api/Images/2015/0308/213.html 设为true开启图片延迟加载,使preloadImages无效.需 ...

  2. Odoo附件传输

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9307319.html  一:odoo后端上传附件 odoo中的ir.attachment模型是附件模型,可以用 ...

  3. linux 的常用命令---------第二阶段

    vim编辑器 vim 文件名(首先进入命令模式) :(进行编辑文件内容)  → 按 i 键进入插入模式,可以写内容啦. ↓ 按 Esc 键,进入命令模式 ↓ 按 shift + : 键,进入末行模式  ...

  4. day4-课堂代码

    # ---------------------------------------------------------------------- # def my_function1(name, ad ...

  5. JAVA框架 Spring AOP注解

    一.准备工作: 1)导入jar包: 4个jar包. 2)约束:(spring需要所有的约束)有IOC约束和AOP 还有事务(tx)以及注解注入的约束(context). <?xml versio ...

  6. [Noi2017]整数 BZOJ4942

    分析: 30+暴力应该还是蛮水的,可以随便写写... 60+的就没那么容易了,但是应该挺裸的,往上架一颗线段树,查询连续1或0的长度,或者找到前缀中,第一个1或0,之后区间覆盖,单点查询,开bool, ...

  7. dotnet core webapi 发布部署到docker的步骤

    1. 创建web api项目,编译并测试成功 2. 在项目的根目录添加Dockerfile文件,注意:Dockerfile文件名区分大小写 文件内容如下 # 基于microsoft/dotnet:la ...

  8. L017-linux系统定时任务crond入门小节

    L017-linux系统定时任务crond入门小节 oh my god!how old are you? 怎么老是你?没错,我又来了,哈哈哈,今天是我的生日呢,在这么重要的日子里,必须要更一篇学习小节 ...

  9. CS50.4

    1, PDF,portable document format 便携式文档格式 2, 关于文本编辑器(文字编辑器)和文档编辑器(文字处理器),前者可用来写程序的源代码?名字挺难分辨的. *3, “-o ...

  10. [CF1060F]Shrinking Tree[树dp+组合计数]

    题意 你有一棵 \(n\) 个点的树,每次会随机选择树上的一条边,将两个端点 \(u,v\) 合并,新编号随机为 \(u,v\).问最后保留的编号分别为 \(1\) 到 \(n\) 的概率. \(n\ ...