• 20135227黄晓妍实验四


    北京电子科技学院(BESTI)

                         实     验    报     告

          课程:Java   班级: 1352     姓名:黄晓妍    学号:20135227

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

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

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

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

          实验目的与要求:  

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

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

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

          实验仪器:

    名称

    型号

    数量

    计算机

    2

         

          统计的PSP(Personal Software Process)时间

    步骤

    耗时(min)

    百分比

    需求分析

    10

    10%

    设计

    20

    20%

    代码实现

    40

    40%

    测试

    10

    10%

    分析总结

    20

     20%

    一、    实验内容与步骤

    实验内容:

    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()函数使其进行数据连接和传输。实验中最大的难点是怎样对数据进行加密,然后进行传输。对老师所给代码进行调用,起初不知道从何做起,后经过大家共同努力,问题得以解决。本次实验对同学们有很大的挑战,同时我们也有相当大的进步。

  • 相关阅读:
    jquery ajax下拉框省市联动效果实现代码
    冒泡排序算法
    Ext.form.ComboBox调用store.filterBy失效问题
    高性能建站之前端优化篇
    不用任何插件实现 WordPress 的彩色标签云
    Javascript 实现select的美化
    RabbitMQ安装与测试
    Select 下拉列表选择插件 (包含下拉选择图片,下拉grid等)
    Javascript 通过cookie记录浏览记录
    ActiveMQ安装与测试
  • 原文地址:https://www.cnblogs.com/angelahxy/p/4564808.html
Copyright © 2020-2023  润新知