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

    实验三:实验报告

    课程:程序设计与数据结构
    班级: 1623
    姓名: 张旭升
    学号:20162329
    指导教师:娄嘉鹏 王志强
    实验日期:5月10日

    实验密级: 非密级
    预习程度: 已预习

    必修/选修: 必修
    实验序号: cs_29

    实验名称: Java面向对象程序设计

    实验内容

    任务一:


    编写MyBC.java实现中缀表达式转后缀表达式的功能
    编写MyDC.java实现从上面功能中获取的表达式中实现后缀表达式求值的功能


    任务二:


    结对编程:一人负责客户端,另一人负责服务器
    注意责任归宿,要会通过测试证明自己没有问题
    基于Java Socket实现客户端/服务器功能,传输方式用TCP
    客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式通过网络发送给服务器
    服务器接收到后缀表达式,调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
    客户端显示服务器发送过来的结果


    任务三:


    客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
    服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
    其他要求同任务二


    任务四:


    客户端和服务器用DH算法进行3DES或AES算法的密钥交换
    其他要求同任务三


    任务五:


    服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端


    实验要求


    1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程

    1. 完成实验、撰写实验报告,实验报告以博客方式发表在博客园,注意实验报告重点是 运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决 办法(空洞的方法如“查网络”、“问同学”、“看书”等一律得0分)以及分析(从中可 以得到什么启示,有什么收获,教训等)。报告可以参考范飞龙老师的指导

    2. 严禁抄袭,有该行为者实验成绩归零,并附加其他惩罚措施。


    实验步骤

    (一)建立客户端服务器连接
    (二)创建MyDC MyBC类
    (三)实现客户端服务器的交互
    (四)调用MyDC MyBC进行相关转化计算
    (五)使用密码学算法对相关数据加密传输

    实验过程

    创建MyDC MyBC:

    实现客户端交互传输(调用MyDC MyBC):

    对相关传输数据加密处理:

    我主要负责的是服务器端,以下是相关代码:
    public class TalkServer {
        public static void main(String args[]) {
            MyDC counts = new MyDC();
            String Message ="";
            try {
                ServerSocket server = null;
                try {
                    server = new ServerSocket(9005);
                    System.out.println("连接成功!");
                //创建一个ServerSocket在端口4700监听客户请求
                } catch (Exception e) {
                    System.out.println("can not listen to:" + e);
                //出错,打印出错信息
                }
                Socket socket = null;
                try {
                    socket = server.accept();
                } catch (Exception e) {    
                    System.out.println("Error." + e);
                //出错,打印出错信息
                }
                String line;
                BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //由Socket对象得到输入流,并构造相应的BufferedReader对象
                PrintWriter os = new PrintWriter(socket.getOutputStream());
                //由Socket对象得到输出流,并构造PrintWriter对象
                BufferedWriter bw = new BufferedWriter(new FileWriter("lwk_pub_key.txt"));
                //解密
                ObjectInputStream B=new ObjectInputStream(new FileInputStream("zxs_RSA_priv.txt"));
                RSAPrivateKey prk=(RSAPrivateKey)B.readObject( );
                BigInteger D=prk.getPrivateExponent();
                BigInteger N=prk.getModulus();
                //加密    
                ObjectInputStream b=new ObjectInputStream(new FileInputStream("lwk_RSA_pub.txt"));
                RSAPublicKey pbk=(RSAPublicKey)b.readObject( );
                BigInteger e=pbk.getPublicExponent();
                BigInteger n=pbk.getModulus();
                MessageDigest m1 = MessageDigest.getInstance("MD5");
                //由系统标准输入设备构造BufferedReader对象
                line = is.readLine();
                while (!line.equals("OK")) {
                    if (line.equals("File")) {
                        line = is.readLine();
                        while (!line.equals("Yes")) {
                            bw.write(line);
                            bw.newLine();
                            line = is.readLine();
                        }
                        bw.close();
                        line = is.readLine();
                    } else {
                        System.out.println("服务器接收哈希值:" + line);
                        String Mi = line;
                        line = is.readLine();
                        String ctext = line;
                        BigInteger C = new BigInteger(ctext);
                        BigInteger M = C.modPow(D, N);
                        byte[] arr = M.toByteArray();
                        for (byte i : arr)
                            Message += (char) i;
                        System.out.println("解密结果:" + Message);
                        m1.update(Message.getBytes("UTF8"));
                        byte s1[] = m1.digest();
                        String result = "";
                        for (int i = 0; i < s1.length; i++) {
                            result += Integer.toHexString((0x000000ff & s1[i]) | 0xffffff00).substring(6);
                        }
                        if (result.equals(Mi)) {
                            String A = counts.evaluate(Message);
                            System.out.println("计算结果:" + A);
                            byte ptext[] = A.getBytes("UTF8");
                            BigInteger m = new BigInteger(ptext);
                            BigInteger c = m.modPow(e, n);
                            os.println(c.toString());
                            os.flush();
                            System.out.println("服务器器发送:" + c);
                            line = is.readLine();
                        }
                    }
                }
                os.close(); //关闭Socket输出流
                is.close();//关闭Socket输入流
                socket.close(); //关闭Socket
                server.close(); //关闭ServerSocket
            } catch (Exception e) {
                System.out.println("Error:" + e);
            //出错,打印出错信息
            }
        }
    }
    

    实验中遇到的问题

    • 实验中主要问题在于我与搭档之间的配合默契不足,再加上搭档的相关知识不够牢固,导致进度很慢,我这边虽然问题较少,但是他负责的客户端总是有很多问题。

    实验不足

    实验中还有一个第六项任务,我也尝试了一下,但是好多次都是服务器和客户端的连接出现问题,导致APP无法正常运行,结果就计划流产了。

    实验心得

    • 在本次实验中我们既学习到了相关网络编程的知识,又在这基础上使用了java密码算法,这对未来其他的学习打下了很好的基础。
  • 相关阅读:
    Python3 -- 多线程(threading模块、queue模块)
    MySQL -- 常用汇总
    MySQL -- 常用函数汇总
    MySQL -- 数据表添加字段(三种方式)
    MySQL -- 查看表结构命令
    MySQL -- 修改/删除字段
    MySQL -- ALTER TABLE:修改数据表
    MySQL -- 单行注释和多行注释
    GCC 提供的原子操作
    内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区[C++][内存管理][转载]
  • 原文地址:https://www.cnblogs.com/Zhangxusheng/p/7000790.html
Copyright © 2011-2022 走看看