实验报告五

实验三:实验报告

课程:程序设计与数据结构
班级: 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密码算法,这对未来其他的学习打下了很好的基础。
posted @ 2017-06-13 14:02  Don't_worry  阅读(210)  评论(0编辑  收藏  举报