一、实验内容

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. SASS对css的管理

    一.SASS简介 SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护. 本文总结了SASS的主要用法.我的目标是,有了这篇文章,日常的一般 ...

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

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

  3. cpu高占用,线程堆栈,jstack,pstack,jmap, kill -3 pid,java(weblogic,tomcat)

    1 ps -mp pid -o THREAD,tid,time 2 printf "%x\n" tid 3 jstack pid |grep tid -A 30

  4. js 自己项目中几种打开或弹出页面的方法

    自己项目中,几种打开或弹出页面的方法(部分需要特定环境下) var blnTop = false;//是否在顶层显示 ///动态生成模态窗体(通过字符串生成) ///strModalId:模态窗体ID ...

  5. chrome调试如何禁用浏览器缓存

    0.写在前面的话 遇到过很多很多次,修改了页面代码,但是程序始终没有按照设想的方向走,有时候折腾了几个小时,发现问题最后却是莫名其妙恢复的.后来进一步调试发现,自己已经修改了如js代码,但是前端在载入 ...

  6. 评定星级的前端显示js

    五颗星的星级评定: 说明:假设是利用三种图片显示星级评定,即 1.满亮的星 2.半亮的星星 3.不亮的星星: 满分是5分:(此处当然可以作为一个参数可变 函数传入参数grade表示当前分值. func ...

  7. 在main函数前后执行的函数之 C语言

    在gcc中,可以使用attribute关键字,声明constructor和destructor,来指定了函数在main之前或之后运行,代码如下: #include <stdio.h> __ ...

  8. Android之基于小米天气的天气源库

    大概去年的这个时候,有跟大家分享简洁天气这个应用. 该应用一開始使用的是中国天气网的数据,可是,由于须要反复多次请求server获取信息才干满足我们的需求,因此.后来我偷偷的将天气源更换成" ...

  9. SelectObject函数

    SelectObject 函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的同样类型的对象. 函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ ...

  10. 复习整理2:juit

    @FixMethodOrder(MethodSorters.NAME_ASCENDING)测试回环 https://blog.csdn.net/u014294166/article/details/5 ...