zoukankan      html  css  js  c++  java
  • 20145208 实验五 Java网络编程

    20145208 实验五 Java网络编程

    实验内容

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

    2.客户端与服务器连接

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

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

    实验步骤

    结对实验

    • 我和20145215卢肖明组队进行实验
    • 由我负责服务器的部分,卢肖明负责客户端部分。

    了解JAVA网络编程的基础知识

    IP和端口

    • 通过老师给的链接JAVA网络编程中可以了解到对于网络编程来说,最主要的是计算机和计算机之间的通信,这样首要的问题就是如何找到网络上的计算机呢?这就需要了解IP地址的概念。
    • 寻找本机的IP地址也就是IPv4的地址可以通过命令行的ipconfig命令来查找,如图:

    • 因为我连接的是校网,所以我的DNS后缀是besti.edu.cn
    • 有了IP地址计算机就可以找到对方,但是一个计算机设有多个端口来运行多个网络程序,每个网络程序占用不同的端口,所以就算找到了,要想连接起来,还需要知道端口,且服务器和客户端 的端口必须要统一。
    • 有了IP地址和端口的概念以后,在进行网络通讯交换时,就可以通过IP地址查找到该台计算机,然后通过端口标识这台计算机上的一个唯一的程序。这样就可以进行网络数据的交换了。

    网络编程步骤

    客户端网络编程步骤
    • 首先指定连接到的服务器的IP地址和端口号来建立网络连接
    • 连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。
    • 本次实验要求要对数据进行加密操作:
      • 先获得DES的密钥
      • 然后使用RSA算法,使用服务器端的公钥对DES的密钥进行加密
      • 再用DES加密明文得到密文
    • 得到了明文就可以将客户端明文的Hash值传送给服务器,然后会收到来自服务器的返回数据
    • 数据交换完毕后关闭连接
    服务器端网络编程步骤
    • 服务器属于被动等待连接,所以首先要进行监听端口,等待客户端进行连接。

    • 在客户端连接之后,服务器就获得一个与客户端之间的连接,二者就可以通过这个连接进行数据交换了。

    • 服务器接收到客户端传来的数据之后要进行处理,针对本次实验来说,客户端传来的数据是加密过的,所以服务器需要进行解密的操作:

      • 首先要使用服务器端RSA的私钥对DES的密钥进行解密
      • 再将十六进制数据转换成十进制
      • 之后用解密得到的DES密钥对DES进行解密
      • 然后使用解密得到的DES对十进制进制密文数据进行解密
      • 最后将得到的十进制明文用“UTF-8”转码成明文字符
    • 解密之后得到明文之后还需要验证数据完整性,在这里使用Hash函数来检测。

    • 检测成功之后再向客户端返回数据表示匹配成功或者失败

    • 最后关闭连接。

    服务器代码
    package DO5;
    /**
     * Created by Cai Ye on 2016/5/5.
     */
            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(10001);//创建服务器套接字
                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);
                //使用服务器端RSA的私钥对DES的密钥进行解密
                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();
                BigInteger m=c.modPow(d,n);
                byte[] keykb=m.toByteArray();
                //使用DES对密文进行解密
                String aline=in.readLine();//读取客户端传送来的数据
                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); //通过网络输出流返回结果给客户端
                //使用Hash函数检测明文完整性
                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 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;
        }
    }
    

    实验结果

    实验中遇到的问题

    问题一

    • 在客户端进行连接的时候可能会出现端口被占用的情况,只需要服务器和客户端都将端口改成一个空闲端口就可以了
    • 如果已经安装了XAMPP,就可以快捷的发现被占用端口和找到空闲的端口了

    问题二

    • 在实验中我们有时候会遇到连接超时的情况,出现这种情况的原因有很多,可以通过换网络、共用一个热点或者使用服务器所在主机的WiFi等等方法来解决,但是我觉得这些都不是最有效的方法,最有效的方法我们还在研究

    问题三

    • 连接成功之后可能会出现如下错误:

    • 这是因为我们调用了RSA算法,但是没有将对应文件放入,只要将Skey_RSA_pub.datSkey_RSA_priv.dat两个文件放在和src同级目录下就可以了。

    时间分配

    步骤 耗时 百分比
    基础学习 30min 30%
    代码理解 30min 30%
    代码设计 15min 15%
    测试 15min 15%
    分析总结 10min 10%

    实验感想

    • 本次实验是我第一次切身接触到服务器与客户端的设计和使用,让我初步了解到了JAVA网络编程的基础知识,并且通过做中学的方式学习到了很多,老师给的代码条理很清晰,只要将每一个变量的意义看懂了,代码的整个思路和框架也就明了了,还需要通过API的使用来理解许多新出现的语法结构,来理解代码的原理和内容,最后我还用DEBUG的方法来对每一个变量的值和变量的变化进行理解,DEBUG最好的一点就是可以通过一步一步的执行,很清晰的看到整个代码的运行过程,更加有助于理解代码。
    • 本次实验最大的收获就是体会到了DEBUG的好处,DEBUG可以很好的帮助我理解一个陌生的代码,他用最笨的办法一步一步的告诉你这个代码每一步的作用。

  • 相关阅读:
    软件体系架构复习要点
    Operating System on Raspberry Pi 3b
    2019-2020 ICPC North-Western Russia Regional Contest
    2019 ICPC ShenYang Regional Online Contest
    2019 ICPC XuZhou Regional Online Contest
    2019 ICPC NanChang Regional Online Contest
    2019 ICPC NanJing Regional Online Contest
    Codeforces Edu Round 72 (Rated for Div. 2)
    Codeforces Round #583 (Div.1+Div.2)
    AtCoder Beginning Contest 139
  • 原文地址:https://www.cnblogs.com/20145208cy/p/5470525.html
Copyright © 2011-2022 走看看