20135129李畅宇实验五

---恢复内容开始---

课程:Java程序与设计         班级:1351

姓名:李畅宇 陶俊杰

学号:20135129  20135127

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

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

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

实验名称:Java网络编程及安全

实验目的与要求:结对编程,实现客户端和服务器之间数据的发送与接收,实现加解密和验证Hash函数值。

实验仪器:


名称


型号


数量


PC


TOSHIBA


1


Eclipse


LUNA


1

结对伙伴:20135127 陶俊杰

博客地址:http://www.cnblogs.com/20135127tjj

我负责服务器,她负责客户端

【实验内容】

1.用书上的TCP代码,实现服务器与客户端。

2.客户端与服务器连接

3.客户端中输入明文,利用DES算法加密,DES的秘钥用RSA公钥密码中服务器的公钥加密,计算明文的Hash函数值,一起传送给客户端

4.客户端用RSA公钥密码中服务器的私钥解密DES的,秘钥,用秘钥对密文进行解密,得出明文。计算求得明文的Hash函数值,检查是否与传送过来的一致,如果一直,则表示匹配成功。

【实验步骤】

  我和20135236贾瑗结对编程,我设计客户端的部分。

  贾瑗的博客园主页: http://www.cnblogs.com/javajy/

  首先建立一个Socket对象,用来连接特定服务器的指定端口,输入的参数是ip地址和端口,注意ip地址是服务器的ip地址,即运行服务器的那台主机的ip地址。

  怎么查看主机的ip地址呢?在命令行中输入ipconfig即可。如下图所示:

  然后用BufferedReader对象获得从服务器传来的网络输入流,用PrintWriter对象获得从客户端向服务器输出数据的网络输出流,用BufferedReader对象创建键盘输入流,以便客户端从键盘上输入信息。以上根据TCP的客户端代码编写。

  下一步是先用RSA算法加密DES的秘钥,加密采用服务器的公钥。将加密后的秘钥传送给服务器。

  然后用DES算法加密明文,将密文传到服务器。

  然后计算明文的Hash函数值,传送给服务器。

  以上用到的加密算法、秘钥、Hash函数计算过程均利用的老师提供的代码。

  最后从网络输入流读取结果,把从服务端返回的结果输出出来。

  在抛出异常部分,因为继承的是Exception类,所以直接输出抛出的异常。

  代码写好后,先运行服务器,再运行客户端,显示“服务器已经启动后”启动客户端,,连接成功会显示“已经建立连接”,然后就可以从客户端输入数据发送到服务器了。

客户端代码:

import java.net.*;
import java.io.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.security.spec.*;
import javax.crypto.interfaces.*;
import java.security.interfaces.*;
import java.math.*;

public class TCP_Client
{
    public static void main(String srgs[]) throws Exception
    {
        try
        {
            KeyGenerator kg = KeyGenerator.getInstance("DESede");
            kg.init(168);
            SecretKey k = kg.generateKey();
            byte[] ptext2 = k.getEncoded();

            // 创建连接特定服务器的指定端口的Socket对象
            Socket socket = new Socket("192.168.253.1", 8030);//这里输入的是服务器的ip地址和端口号,端口号要注意和服务器保持一致。

            // 获得从服务器端来的网络输入流
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            // 获得从客户端向服务器端输出数据的网络输出流
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);

            // 创建键盘输入流,以便客户端从键盘上输入信息
            BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));

            //RSA算法,使用服务器端的公钥对DES的密钥进行加密
            FileInputStream f3 = new FileInputStream("Skey_RSA_pub.dat");
            ObjectInputStream b2 = new ObjectInputStream(f3);
            RSAPublicKey pbk = (RSAPublicKey) b2.readObject();
            BigInteger e = pbk.getPublicExponent();
            BigInteger n = pbk.getModulus();
            BigInteger m = new BigInteger(ptext2);
            BigInteger c = m.modPow(e, n);
            String cs = c.toString();
            out.println(cs); // 通过网络将加密后的秘钥传送到服务器

            //用DES加密明文得到密文
            System.out.print("请输入待发送的数据:");
            String s = stdin.readLine(); // 从键盘读入待发送的数据
            Cipher cp = Cipher.getInstance("DESede");
            cp.init(Cipher.ENCRYPT_MODE, k);
            byte ptext[] = s.getBytes("UTF8");
            byte ctext[] = cp.doFinal(ptext);
            String str = parseByte2HexStr(ctext);
            out.println(str); // 通过网络将密文传送到服务器

            // 将客户端明文的Hash值传送给服务器
            String x = s;
            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);
            out.println(result);//通过网络将明文的Hash函数值传送到服务器

            str = in.readLine();// 从网络输入流读取结果
            System.out.println("从服务器接收到的结果为:" + str); // 输出服务器返回的结果
        }
        catch (Exception e)
        {
            System.out.println(e);//输出异常
        }
        finally
        {

        }

    }

    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;
    }
}

【实验体会】

  1. 实验过程的理解,实验指导书中知识点的理解。

  这次实验主要是练习在已有的代码之上如何把功能在同一个程序中实现,老师在实验之前已经给了TCP的代码和密码算法的加解密方法,这给我们的编程带来了极大的方便,所以我们要做的就是熟悉这些代码所代表的含义,内化成自己的东西并能够掌握运用。

  2. 实验过程中遇到的问题以及解决方案。

  这次实验中我主要遇到了两个问题,其一是如何将代码整合到一起,其二是如何实现服务器与客户端的连接。在一开始我们的ip地址是在百度搜索框内输入ip这种方法查到的,怎么都会显示连接超时,后来发现这种方法查出来的ip是错误的,然后我们通过命令行得到了正确的ip地址,终于成功的实现了连接。


步骤


耗时


百分比


需求分析


1h

 16.7%

设计

 1h  16.7%

代码实现

 2h  33.2%

测试

 1h  16.7%

分析总结

 1h  16.7%

---恢复内容结束---

时间: 2024-08-04 18:31:32

20135129李畅宇实验五的相关文章

20135129李畅宇实验三

<Java程序设计>课实验报告 班级:201351              姓名及学号:李畅宇 20135129 指导教师:娄佳鹏            必修/选修:选修 实验日期: 2015年6月4日      实验时间: 15:30~17:30 实验序号:(三)           成绩: 实验步骤 (一)敏捷开发与XP 学习软件工程的标准和流程,其中主要以敏捷开发流程为主,而其中有一极限编程作为学习流程的主要软件开发方法.包括:编码,测试,倾听,设计,作为学习者,我主要关注和研究了编码

实验二Java面向对象程序设计_20135129李畅宇

ava第二次实验报告 课程:Java实验   班级:201352     姓名:池彬宁  学号:20135212 成绩:             指导教师:娄佳鹏   实验日期:15.05.05 实验密级:         预习程度:             实验时间: 仪器组次:          必修/选修:选修          实验序号:2 实验名称:     Java面向对象程序设计 实验目的与要求: 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3

Java实验四和实验五

实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1.  掌握OOP方式进行程序设计的方法, 2.  了解类的继承性和多态性的作用. [实验要求] 1.  编写体现类的继承性(成员变量,成员方法,成员变量隐藏)的程序. 2.  编写体现类多态性(成员方法重载,构造方法重载)的程序. [实验内容] 一 类的继承性练习 1. 进一步理解继承的含义 新类可从现有的类中产生,并保留现有类的成员变量和方法并可根

2017-2018-2 20165315 实验五《网络编程与安全》实验报告

2017-2018-2 20165315 实验五<网络编程与安全>实验报告 一.实验过程及结果截图 任务一: 两人一组结对编程: 参考博客 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java MyDC.java 示例代码: 1 import java.util.StringTokenizer; 2 import java.util.Stack; 3 4 public class MyDC 5 { 6 /*

20172308 2017-2018-2 《程序设计与数据结构》实验五报告

20172308 2017-2018-2 <程序设计与数据结构>实验五报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 马瑞蕃 学号:20172327 实验教师:王志强 实验日期:2018年6月13日~2018年6月18日 必修/选修: 必修 1.实验内容 + 任务1: 两人一组结对编程: 1.参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA 2.结对实现中缀表达式转后缀表达式的功能 MyBC.java 3.结对

实验五 视图--

实验五 视图 一.  实验内容: 1. 视图的创建与修改 2. 视图的查询 3. 视图的更新 二.  实验项目:员工管理数据库 用于企业管理的员工管理数据库,数据库名为YGGL中,YGGL数据库中包括三个表:Employees(员工信息表).Departments(部门信息表).Salary(员工薪水情况表). 三.  实验步骤:(要求用命令完成以下操作) 1. 创建视图Emp_view1,包括所有男员工的员工编号.姓名.工作年限和学历,要求字段名用中文表示,要求更新视图时检查性别条件: 2.

MySQL数据库实验五:数据更新

实验五   数据更新 一.实验目的 掌握数据更新操作的用法. 二.实验环境 三.实验示例 1.?往基本表SC中插入元组. ①    INSERT INTO S(S#,SNAME,AGE,SEX) VALUES('S36','GU',20,'M'): ②   INSERT INTO SC(S#,C#) VALUES('S5','C8'): ③        INSERT INTO SC VALUES('S4','C4',85), ('S3','C6',90), ('S7','C2',70): ④

《信息安全系统设计基础》实验五

<信息安全系统设计基础>实验五 简单嵌入式WEB 服务器实验 班级:1452 姓名:20415208蔡野 20145235李涛 20145230熊佳伟 实验日期:2016.12.1 时间:10:10-12:30 实验序号:5 实验目的: 掌握在 ARM 开发板实现一个简单 WEB 服务器的过程 . 学习在 ARM 开发板上的 SOCKET 网络编程 . 学习 Linux 下的 signal()函数的使用 . 实验内容 阅读并理解源代码 进入/arm2410cl/exp/basic/07_htt

CCNP实验五:修改OSPF各类型路由的管理距离

一:基本配置 r1(config)#router ospf 1 r1(config-router)#net 1.1.0.0 0.0.255.255 area 1 r1(config-router)#net 12.1.1.1 0.0.0.0 area 0 r1(config-router)#redistribute connected subnets r2(config)#router ospf 1 r2(config-router)#net 12.1.1.2 0.0.0.0 area 0 r2(