zoukankan      html  css  js  c++  java
  • 实验四报告

    北京电子科技学院(BESTI)

                         实     验    报     告

          课程:Java   班级: 1352     姓名:谈愈敏    学号:20135220

          成绩:               指导教师:娄嘉鹏        实验日期:2015.6.9

          实验密级:           预习程度:              实验时间:15:30~18:00

          仪器组次:20         必修/选修:选修        实验序号:04

          实验名称: 网络编程与安全                                                        

          实验目的与要求:  

               1.掌握Java网络编程的方法;

             2.掌握Java安全编程的方法;

             3.能综合使用各种技术。                                                

          实验仪器:

    名称

    型号

    数量

    计算机

    2

         

          统计的PSP(Personal Software Process)时间

    步骤

    耗时(min)

    百分比

    需求分析

    10

    10%

    设计

    20

    20%

    代码实现

    40

    40%

    测试

    10

    10%

    分析总结

    20

     20%

    一、    实验内容与步骤

    实验人员:

    服务器  :20135220谈愈敏 

    客户端  :20135227黄晓妍  http://www.cnblogs.com/angelahxy/

    实验内容:

    1       编写网络通信程序(基于TCP)

    2       对通信内容使用对称加密算法进行加密

    3       使用非对称算法分发对称加密中使用的密钥

    4       对通信内容进行摘要计算并验证

    5       其他安全措施

    代码:

    客户端:

    package net;

    import java.math.*;

    import java.net.*;

    import java.io.*;

    public class ComputeTCPClient {

        public static void main(String srgs[]) {

            try {

                //创建连接特定服务器的指定端口的Socket对象

                Socket socket = new Socket("10.0.6.143", 4421);

                //获得从服务器端来的网络输入流

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

                //获得从客户端向服务器端输出数据的网络输出W流

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

                //创建键盘输入流,以便客户端从键盘上输入信息eredWriter(new OutputStreamWriter(socket.getOutputStream())), true);

                //创建键盘输入流

                BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));

                System.out.print("请输入待发送的数据:");

                String s = stdin.readLine(); //从键盘读入待发送的数据

                String cs = new SEnc().enc(s);

                System.out.println("发送到服务器的密文为:" + cs);

    //            String t=Read.read();

                String ck = new Enc_RSA().Enc();

                System.out.println("发送到服务器的加密秘钥为:" + ck);

                String result = DigestCalc.hash(s);

                out.println(ck);

                out.println(cs);  //通过网络传送到服务器

                out.println(result);

            } catch (Exception e) {

                System.out.println(e);

            } finally {

                //stdin.close();

                //in.close();

                //out.close();

                //socket.close();                   

            }

        }

    }

    服务器:

    package net;

    import java.net.*;

    import java.io.*;

    public class ComputeTCPServer {

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

            ServerSocket sc = null;

            Socket socket = null;

            try {

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

                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 key = in.readLine();

                System.out.println("从客户端收到的加密秘钥为:" + key);

                byte[] keykb = new Dec_RSA().Dec(key);

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

                System.out.println("从客户端收到的密文为:" + ctext);

                String result=SDec.des(ctext, keykb);

                String ha = in.readLine();

                String sa = DigestCalc.hash(result);

                boolean q = Compare.compare(sa, ha);

                System.out.println("程序是否完整:" + q);

                out.close();

                in.close();

                sc.close();

            } catch (Exception e) {

                System.out.println(e);

            }

        }

    }

    客户端:

     

    服务端:

    二、实验中遇到的问题及其解决方法

    1.发送经过DES加密后的密文时采用的是将其转化为字符串的方式,在这里客户端采用的是toString()函数,服务器采用的是getBytes()函数,传输后的密文出现错误。对其问题进行探讨并上网查证,经DES加密后的密文不能使用上述两个函数进行传输,使用网上的一个Change类,问题得以解决,代码如下:

    package net;

    public class Change {

        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; 

        } 

       

    }

    2、在两机互联的过程中,无法进行连接,后了解到代码中的端口和IP地址的设置有问题,将IP地址设置为本机之后,同时进行网络连接,两机实现互联。

    三、实验体会

    本次实验极大的扩展了我们的视野,使我了解到编写程序不仅仅是一个电脑单机操作的事情,也可以上升到网络层次,引起了我对JAVA极大的兴趣。在实验中,我明白怎样创建客户端和服务器,同时利用out.println()和in.readline()函数使其进行数据连接和传输。实验中最大的难点是怎样对数据进行加密,然后进行传输。对老师所给代码进行调用,起初不知道从何做起,后经过大家共同努力,问题得以解决。本次实验对同学们有很大的挑战,同时我们也有相当大的进步。

  • 相关阅读:
    mysql常用基本命令
    mysql8.0.13下载与安装图文教程
    k8s ingress 增加跨域配置
    Jenkins 备份恢复插件 thinBackup 使用
    k8s HA master 节点宕机修复
    nginx 跨域问题解决
    mongodb 3.4.24 主从复制
    k8s 线上安装 jenkins并结合 jenkinsfile 实现 helm 自动化部署
    k8s helm 运用与自建helm仓库chartmuseum
    centos6 源码安装 unzip
  • 原文地址:https://www.cnblogs.com/tymjava/p/4564894.html
Copyright © 2011-2022 走看看