码迷,mamicode.com
首页 > 其他好文 > 详细

20135227黄晓妍实验四

时间:2015-06-09 23:31:33      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

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

20135227黄晓妍实验四

标签:

原文地址:http://www.cnblogs.com/angelahxy/p/4564808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!