当前位置: 首页 > 编程日记 > 正文

20175203 2018-2019 实验五《网络编程与安全》

20175203 2018-2019 实验五《网络编程与安全》

知识重点(摘自实验资料)

  • 栈 :(Stack)是一种只允许在表尾插入和删除的线性表,有先进后出(FILO),后进先出(LIFO)的特点。允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom)
  • 栈的一个应用是用来对四则运算表达式进行求值:
    eg:表达式Exp = S1 + OP + S2(S1 ,S2是两个操作数,OP为运算符)有三种标识方法:
    OP + S1 + S2 为前缀表示法;S1 + OP + S2 为中缀表示法;S1 + S2 + OP 为后缀表示法
    例如:Exp = a * b + (c - d / e) * f
    前缀式: + * a b * - c / d e f
    中缀式: a * b + c - d / e * f
    后缀式: a b * c d e / - f * +
    我们可以看出:
    操作数之间的相对次序不变;
    运算符的相对次序不同;
    中缀式丢失了括弧信息,致使运算次序不确定;
    前缀式的运算规则为:连续出现的两个操作数和在它们之前且紧靠它们的运算符构成一个最小表达式;
    后缀式的运算规则为:运算符在式中出现的顺序恰为表达式的运算顺序;每个运算符和在它之前出现且紧靠它的两个操作数构成一个最小表达式。

    后缀表示法是波兰逻辑学家J.Lukasiewicz于1929年提出的,又叫做逆波兰表达式。

  • Linux命令dc可以用来对逆波兰式表达式进行求值,dc的打印类命令:

    p:打印栈顶元素并换行
    n: 打印栈顶元素并将其弹出栈,完毕后不换行
    P: putchar ( int(栈顶元素) % 256) 并弹栈顶,不换行
    f: 从栈顶至栈底打印栈中所有值,每个一行
    dc的运算符:

    +: 依次弹出w1与w2,将w2+w1压栈。精度为结果值精度
    -: 依次弹出w1与w2,将w2-w1压栈
    : 依次弹出w1与w2,将w2w1压栈。精度为结果值精度与precision中较大值
    / : 依次弹出w1与w2,将w2/w1压栈。精度为precision
    % : 依次弹出w1与w2,将w2-w2/w1*w1压栈
    ~ : 依次弹出w1与w2,依次将w2/w1与w2%w1压栈
    ^ : 依次弹出w1与w2,将w2^((int)w1)压栈。精度为w2精度与precision中较大值
    | : 依次弹出w1 w2与w3,将 w3 ^ ((int)w2) (mod w1) 压栈。w1 w3 需为整数
    v : 弹出w1,将sqrt(v)压栈。精度为precision
    dc支持栈操作:

    c : 清空栈
    d : 将栈顶元素复制并压栈
    r : 交换栈顶两元素 XXX
  • 对逆波兰式求值时,不需要再考虑运算符的优先级,只需从左到右扫描一遍后缀表达式即可。求值伪代码如下:

设置一个操作数栈,开始栈为空;
从左到右扫描后缀表达式,遇操作数,进栈;
若遇运算符,则从栈中退出两个元素,先退出的放到运算符的右边,后退出的放到运算符左边,运算后的结果再进栈,直到后缀表达式扫描完毕。
此时,栈中仅有一个元素,即为运算的结果。

任务一

要求

  • 参考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
  • 结对实现中缀表达式转后缀表达式的功能 MyBC.java
  • 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java
  • 上传测试代码运行结果截图和码云链接

    实验代码

  • 中缀转后缀
import java.util.*;public class MyBC {private Stack<String> stack;private List<String> list;private String message, Message = "";public MyBC() {stack = new Stack<String>();//用来暂时存放运算符的栈list = new ArrayList<String>();//用来暂时存放操作数及运算符的列表}public void conversion(String expr) {   //中缀转后缀String token;StringTokenizer tokenizer = new StringTokenizer(expr);while (tokenizer.hasMoreTokens()) {//当tokenizer有下一个值时,进行循环,并把值赋给tokentoken = tokenizer.nextToken();if (token.equals("(")) {//如果是左括号,入栈stack.push(token);} else if (token.equals("+") || token.equals("-")) {//如果是“+”或“-”,继续判断栈是否为空if (!stack.empty()) {//如果栈非空,判断栈顶元素是什么if (stack.peek().equals("(")) {//如果栈顶为“(”,运算符入栈stack.push(token);} else {//否则先把栈顶元素移除,加到列表中,再将运算符入栈list.add(stack.pop());stack.push(token);}} else {//若栈为空,运算符入栈stack.push(token);}} else if (token.equals("*") || token.equals("÷")) {//如果是“*”或“÷”,继续判断栈是否为空if (!stack.empty()) {//如果栈非空,判断栈顶元素是什么if (stack.peek().equals("*") || stack.peek().equals("÷")) {//如果栈顶为“*”或“÷”,先把栈顶元素移除,加到列表中,再将运算符入栈list.add(stack.pop());stack.push(token);} else {//如果栈顶为其他,运算符直接入栈stack.push(token);}} else {//如果栈为空,运算符直接入栈stack.push(token);}} else if (token.equals(")")) {//如果遇到“)”,开始循环while (true) {//先把栈顶元素移除并赋给AString A = stack.pop();if (!A.equals("(")) {//如果A不为“(”,则加到列表list.add(A);} else {//如果A为“(”,退出循环break;}}} else {//如果为操作数,进入列表list.add(token);}}while (!stack.empty()) {//将栈中元素取出,加到列表中,直到栈为空list.add(stack.pop());}ListIterator<String> li = list.listIterator();//返回此列表元素的列表迭代器(按适当顺序)。while (li.hasNext()) {//将迭代器中的元素依次取出,并加上空格作为分隔符Message += li.next() + " ";li.remove();}message = Message;}public String getMessage() {return message;}
}
  • 后缀表达式计算
import java.util.*;public class MyDC {private final char ADD = '+';private final char SUBTRACT = '-';private final char MUTIPLY = '*';private final char DIVIDE = '/';private Stack<Integer> stack;public MyDC(){stack = new Stack<Integer>();}public int evaluate(String expr){int op1,op2,result = 0;String token;StringTokenizer tokenizer = new StringTokenizer(expr);while(tokenizer.hasMoreTokens()){token = tokenizer.nextToken();if(isOperator(token)){op2 = (stack.pop().intValue());op1 = (stack.pop().intValue());result = evalSingleOp(token.charAt(0),op1,op2);stack.push(new Integer(result));}else {stack.push(new Integer((Integer.parseInt(token))));}}return result;}private boolean isOperator(String token){return (token.equals("+")||token.equals("-")||token.equals("*")||token.equals("/"));}private int evalSingleOp(char operation,int op1,int op2) {int result = 0;switch (operation){case ADD:result = op1+op2;break;case SUBTRACT:result = op1-op2;break;case MUTIPLY:result = op1*op2;break;case DIVIDE:result = op1/op2;}return result;}
}

*测试

import java.util.*;
public class Calculator {public static void main(String[] args) {String expression;int result;MyBC nts = new MyBC();MyDC value = new MyDC();System.out.println("Please input a nifix expression");Scanner in = new Scanner(System.in);expression = in.nextLine();nts.conversion(expression);System.out.println("The postfix expression is :"+nts.getMessage());result = value.evaluate(nts.getMessage());System.out.println("The result is :"+result);}
}

实验截图

1591742-20190530160536461-546162611.png

任务二

要求

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

    实验代码

  • 查看本机IP地址
import java.net.*;
public class Address {public static void main(String[] args) throws UnknownHostException {InetAddress net = InetAddress.getLocalHost();System.out.println(net.toString());}
}

注:这个其实可以在网上找公用IP但是有可能会和其他冲突造成无服务器连接的情况,运行后得到自己电脑的IP地址后就能进行后续步骤啦。

*服务器端

import java.io.*;
import java.net.*;public class Server2 {public static void main(String[] args) throws IOException {int answer;//while (true) {ServerSocket serverForClient = null;Socket socketOnServer = null;DataOutputStream out = null;DataInputStream in = null;try {serverForClient = new ServerSocket(2010);} catch (IOException e1) {System.out.println(e1);}try {System.out.println("等待客户呼叫");socketOnServer = serverForClient.accept(); //堵塞状态,除非有客户呼叫out = new DataOutputStream(socketOnServer.getOutputStream());in = new DataInputStream(socketOnServer.getInputStream());String s = in.readUTF(); // in读取信息,堵塞状态System.out.println("服务器收到客户的提问:" + s);MyDC myDC = new MyDC();answer = myDC.evaluate(s);out.writeUTF(answer + "");Thread.sleep(500);} catch (Exception e) {System.out.println("客户已断开" + e);}//}}
}

*客户端

import java.io.*;
import java.net.*;public class Client2 {public static void main(String args[]) {System.out.println("客户端启动...");//while (true) {Socket mysocket;DataInputStream in = null;DataOutputStream out = null;try {mysocket = new Socket("192.168.56.1", 2010);in = new DataInputStream(mysocket.getInputStream());out = new DataOutputStream(mysocket.getOutputStream());System.out.println("请输入:");String str = new BufferedReader(new InputStreamReader(System.in)).readLine();MyBC turner = new MyBC();turner.conversion(str);String str1 = turner.getMessage();out.writeUTF(str1);String s = in.readUTF();   //in读取信息,堵塞状态System.out.println("客户收到服务器的回答:" + s);Thread.sleep(500);} catch (Exception e) {System.out.println("服务器已断开" + e);}//}}
}

实验截图

1591742-20190530162036823-387445756.png

任务三

要求

  • 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密后通过网络把密文发送给服务器
  • 服务器接收到后缀表达式表达式后,进行解密(和客户端协商密钥,可以用数组保存),然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 客户端显示服务器发送过来的结果
  • 上传测试结果截图和码云链接

    实验代码

  • 服务器端
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;public class Server3 {public static void main(String args[]) {MyDC mydc = new MyDC();ServerSocket serverForClient = null;Socket socketOnServer = null;DataOutputStream out = null;DataInputStream in = null;try {serverForClient = new ServerSocket(5203);} catch (IOException e1) {System.out.println(e1);}try {System.out.println("等待客户呼叫");socketOnServer = serverForClient.accept(); //堵塞状态,除非有客户呼叫System.out.println("客户已连接");out = new DataOutputStream(socketOnServer.getOutputStream());in = new DataInputStream(socketOnServer.getInputStream());String leng = in.readUTF(); // in读取信息,堵塞状态byte ctext[] = new byte[Integer.parseInt(leng)];for (int i = 0;i<Integer.parseInt(leng);i++) {String temp = in.readUTF();ctext[i] = Byte.parseByte(temp);}// 获取密钥FileInputStream f2 = new FileInputStream("keykb1.dat");int num2 = f2.available();byte[] keykb = new byte[num2];f2.read(keykb);SecretKeySpec k = new SecretKeySpec(keykb, "DESede");// 解密Cipher cp = Cipher.getInstance("DESede");cp.init(Cipher.DECRYPT_MODE, k);byte[] ptext = cp.doFinal(ctext);/*for (int i = 0; i < ptext.length; i++) {System.out.print(ptext[i] + ",");}*/System.out.println("");// 显示明文String p = new String(ptext,"UTF8");System.out.println("被解密的后缀表达式:" + p);System.out.println("计算后缀表达式" + p);out.writeUTF(mydc.evaluate(p)+"");} catch (Exception e) {System.out.println("客户已断开" + e);}}
}
  • 客户端
import javax.crypto.Cipher;
import java.io.*;
import java.net.Socket;
import java.security.Key;
import java.util.Scanner;public class Client3 {public static void main(String args[]) {Socket mysocket;MyBC mybc = new MyBC();DataInputStream in = null;DataOutputStream out = null;Scanner scanner = new Scanner(System.in);String str;try {mysocket = new Socket("192.168.56.1", 5203);in = new DataInputStream(mysocket.getInputStream());out = new DataOutputStream(mysocket.getOutputStream());System.out.println("客户端启动...");FileInputStream f = new FileInputStream("key1.dat");ObjectInputStream b = new ObjectInputStream(f);Key key = (Key) b.readObject();Cipher cp = Cipher.getInstance("DESede");cp.init(Cipher.ENCRYPT_MODE, key);System.out.println("请输入中缀表达式:");str = scanner.nextLine();mybc.conversion(str);String str1 = mybc.getMessage();byte ptext[] = str1.getBytes("UTF-8");byte ctext[] = cp.doFinal(ptext);System.out.println("被加密的后缀表达式:");for (int i = 0; i < ctext.length; i++) {System.out.print(ctext[i] + ",");}System.out.println("");out.writeUTF(ctext.length + "");for (int i = 0; i < ctext.length; i++) {out.writeUTF(ctext[i] + "");//System.out.print();}String s = in.readUTF();   //in读取信息,堵塞状态System.out.println("客户收到服务器的回应:" + s);} catch (Exception e) {System.out.println("服务器已断开" + e);}}
}

*注:其中包含DES生成密钥及DH公钥和私钥使用的是娄老师博客中的代码https://www.cnblogs.com/rocedu/p/6683948.html就不在此一一列出了

实验截图

1591742-20190530220211608-1925535105.png

任务四

实验要求

  • 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文发送给服务器
  • 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  • 服务器接收到后缀表达式表达式后,进行解密,然后调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 客户端显示服务器发送过来的结果
  • 上传测试结果截图和码云链接

    代码

  • 服务器端
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.Key;public class Server4 {public static void main(String args[]) {MyDC mydc = new MyDC();ServerSocket serverForClient = null;Socket socketOnServer = null;DataOutputStream out = null;DataInputStream in = null;try {serverForClient = new ServerSocket(5203);} catch (IOException e1) {System.out.println(e1);}try {System.out.println("等待客户呼叫");socketOnServer = serverForClient.accept(); //堵塞状态,除非有客户呼叫System.out.println("客户已连接");out = new DataOutputStream(socketOnServer.getOutputStream());in = new DataInputStream(socketOnServer.getInputStream());Key_DH.DH("Spub.dat","Spri.dat");int len = Integer.parseInt(in.readUTF());byte np[] = new byte[len];for (int i = 0;i<len;i++) {String temp = in.readUTF();np[i] = Byte.parseByte(temp);}ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream (np));Key k2 = (Key)ois.readObject();;FileOutputStream f2 = new FileOutputStream("Cpub.dat");ObjectOutputStream b2 = new ObjectOutputStream(f2);b2.writeObject(k2);FileInputStream fp = new FileInputStream("Spub.dat");ObjectInputStream bp = new ObjectInputStream(fp);Key kp = (Key) bp.readObject();ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(kp);byte[] kb = baos.toByteArray();out.writeUTF(kb.length + "");for (int i = 0; i < kb.length; i++) {out.writeUTF(kb[i] + "");}KeyAgree.DH("Cpub.dat","Spri.dat");String leng = in.readUTF(); // in读取信息,堵塞状态byte ctext[] = new byte[Integer.parseInt(leng)];for (int i = 0;i<Integer.parseInt(leng);i++) {String temp = in.readUTF();ctext[i] = Byte.parseByte(temp);}// 获取密钥FileInputStream f = new FileInputStream("sb.dat");byte[] keysb = new byte[24];f.read(keysb);System.out.println("公共密钥:");for (int i = 0;i<24;i++) {System.out.print(keysb[i]+",");}System.out.println("");SecretKeySpec k = new SecretKeySpec(keysb, "DESede");// 解密Cipher cp = Cipher.getInstance("DESede");cp.init(Cipher.DECRYPT_MODE, k);byte[] ptext = cp.doFinal(ctext);System.out.println("");// 显示明文String p = new String(ptext,"UTF8");System.out.println("被解密的后缀表达式:" + p);System.out.println("计算后缀表达式" + p);out.writeUTF(mydc.evaluate(p)+"");} catch (Exception e) {System.out.println("客户已断开" + e);}}
}
  • 客户端
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.Socket;
import java.security.Key;
import java.util.Optional;
import java.util.Scanner;public class Client4 {public static void main(String args[]) {MyBC mybc = new MyBC();Socket mysocket;DataInputStream in = null;DataOutputStream out = null;Scanner scanner = new Scanner(System.in);String str;try {mysocket = new Socket("192.168.56.1", 5203);System.out.println("客户端启动...");in = new DataInputStream(mysocket.getInputStream());out = new DataOutputStream(mysocket.getOutputStream());System.out.println("请输入中缀表达式:");str = scanner.nextLine();Key_DH.DH("Cpub.dat","Cpri.dat");FileInputStream fp = new FileInputStream("Cpub.dat");ObjectInputStream bp = new ObjectInputStream(fp);Key kp = (Key) bp.readObject();ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(kp);byte[] kb = baos.toByteArray();out.writeUTF(kb.length + "");for (int i = 0; i < kb.length; i++) {out.writeUTF(kb[i] + "");}Thread.sleep(1000);int len = Integer.parseInt(in.readUTF());byte np[] = new byte[len];for (int i = 0;i<len;i++) {String temp = in.readUTF();np[i] = Byte.parseByte(temp);}ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream (np));Key k2 = (Key)ois.readObject();;FileOutputStream f2 = new FileOutputStream("Spub.dat");ObjectOutputStream b2 = new ObjectOutputStream(f2);b2.writeObject(k2);KeyAgree.DH("Spub.dat","Cpri.dat");FileInputStream f = new FileInputStream("sb.dat");byte[] keysb = new byte[24];f.read(keysb);System.out.println("公共密钥:");for (int i = 0;i<24;i++) {System.out.print(keysb[i]+",");}System.out.println("");SecretKeySpec k = new SecretKeySpec(keysb, "DESede");Cipher cp = Cipher.getInstance("DESede");cp.init(Cipher.ENCRYPT_MODE, k);mybc.conversion(str);String str1 = mybc.getMessage();byte ptext[] = str1.getBytes("UTF-8");byte ctext[] = cp.doFinal(ptext);System.out.println("后缀表达式已被加密:");for (int i = 0; i < ctext.length; i++) {System.out.print(ctext[i] + ",");}System.out.println("");out.writeUTF(ctext.length + "");for (int i = 0; i < ctext.length; i++) {out.writeUTF(ctext[i] + "");}String s = in.readUTF();   //in读取信息,堵塞状态System.out.println("客户收到服务器的回应:" + s);} catch (Exception e) {System.out.println("服务器已断开" + e);}}
}

实验截图

1591742-20190530220940922-1164431436.png

任务五

实验要求

  • 基于Java Socket实现客户端/服务器功能,传输方式用TCP
  • 客户端让用户输入中缀表达式,然后把中缀表达式调用MyBC.java的功能转化为后缀表达式,把后缀表达式用3DES或AES算法加密通过网络把密文和明文的MD5値发送给服务器
  • 客户端和服务器用DH算法进行3DES或AES算法的密钥交换
  • 服务器接收到后缀表达式表达式后,进行解密,解密后计算明文的MD5值,和客户端传来的MD5进行比较,一致则调用MyDC.java的功能计算后缀表达式的值,把结果发送给客户端
  • 客户端显示服务器发送过来的结果

    实验代码

    *服务器端
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.security.Key;public class Server5 {public static void main(String args[]) {MyDC mydc = new MyDC();ServerSocket serverForClient = null;Socket socketOnServer = null;DataOutputStream out = null;DataInputStream in = null;try {serverForClient = new ServerSocket(5203);} catch (IOException e1) {System.out.println(e1);}try {System.out.println("等待客户呼叫");socketOnServer = serverForClient.accept(); //堵塞状态,除非有客户呼叫System.out.println("客户已连接");out = new DataOutputStream(socketOnServer.getOutputStream());in = new DataInputStream(socketOnServer.getInputStream());Key_DH.DH("Spub.dat","Spri.dat");int len = Integer.parseInt(in.readUTF());byte np[] = new byte[len];for (int i = 0;i<len;i++) {String temp = in.readUTF();np[i] = Byte.parseByte(temp);}ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream(np));Key k2 = (Key)ois.readObject();;FileOutputStream f2 = new FileOutputStream("Cpub.dat");ObjectOutputStream b2 = new ObjectOutputStream(f2);b2.writeObject(k2);FileInputStream fp = new FileInputStream("Spub.dat");ObjectInputStream bp = new ObjectInputStream(fp);Key kp = (Key) bp.readObject();ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(kp);byte[] kb = baos.toByteArray();out.writeUTF(kb.length + "");for (int i = 0; i < kb.length; i++) {out.writeUTF(kb[i] + "");}KeyAgree.DH("Cpub.dat","Spri.dat");String leng = in.readUTF(); // in读取信息,堵塞状态byte ctext[] = new byte[Integer.parseInt(leng)];for (int i = 0;i<Integer.parseInt(leng);i++) {String temp = in.readUTF();ctext[i] = Byte.parseByte(temp);}String check = in.readUTF();// 获取密钥FileInputStream f = new FileInputStream("sb.dat");byte[] keysb = new byte[24];f.read(keysb);System.out.println("公共密钥:");for (int i = 0;i<24;i++) {System.out.print(keysb[i]+",");}System.out.println("");SecretKeySpec k = new SecretKeySpec(keysb, "DESede");// 解密Cipher cp = Cipher.getInstance("DESede");cp.init(Cipher.DECRYPT_MODE, k);byte[] ptext = cp.doFinal(ctext);System.out.println("");// 显示明文String p = new String(ptext, "UTF8");String pMd5 = DigestPass.DP(p);System.out.println("被解密明文的MD5值:"+pMd5);if (pMd5.equals(check)){System.out.println("和客户端的MD5值一致");System.out.println("计算后缀表达式" + p);out.writeUTF(mydc.evaluate(p)+"");}else {System.out.println("警告:和客户端的MD5值不一致!");}} catch (Exception e) {System.out.println("客户已断开" + e);}}
}
  • 客户端
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.*;
import java.net.Socket;
import java.security.Key;
import java.util.Scanner;public class Client5 {public static void main(String args[]) {MyBC mybc = new MyBC();Socket mysocket;DataInputStream in = null;DataOutputStream out = null;Scanner scanner = new Scanner(System.in);String str;try {mysocket = new Socket("192.168.56.1", 5203);System.out.println("客户端启动...");in = new DataInputStream(mysocket.getInputStream());out = new DataOutputStream(mysocket.getOutputStream());System.out.println("请输入中缀表达式:");str = scanner.nextLine();Key_DH.DH("Cpub.dat","Cpri.dat");FileInputStream fp = new FileInputStream("Cpub.dat");ObjectInputStream bp = new ObjectInputStream(fp);Key kp = (Key) bp.readObject();ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(kp);byte[] kb = baos.toByteArray();out.writeUTF(kb.length + "");for (int i = 0; i < kb.length; i++) {out.writeUTF(kb[i] + "");}Thread.sleep(500);int len = Integer.parseInt(in.readUTF());byte np[] = new byte[len];for (int i = 0;i<len;i++) {String temp = in.readUTF();np[i] = Byte.parseByte(temp);}ObjectInputStream ois = new ObjectInputStream (new ByteArrayInputStream (np));Key k2 = (Key)ois.readObject();;FileOutputStream f2 = new FileOutputStream("Spub.dat");ObjectOutputStream b2 = new ObjectOutputStream(f2);b2.writeObject(k2);KeyAgree.DH("Spub.dat","Cpri.dat");FileInputStream f = new FileInputStream("sb.dat");byte[] keysb = new byte[24];f.read(keysb);System.out.println("公共密钥:");for (int i = 0;i<24;i++) {System.out.print(keysb[i]+",");}System.out.println("");SecretKeySpec k = new SecretKeySpec(keysb, "DESede");Cipher cp = Cipher.getInstance("DESede");cp.init(Cipher.ENCRYPT_MODE, k);mybc.conversion(str);String str1 = mybc.getMessage();byte ptext[] = str1.getBytes("UTF-8");String ptextMd5 = DigestPass.DP(str1);System.out.println("明文的MD5值:"+ptextMd5);byte ctext[] = cp.doFinal(ptext);System.out.println("被加密的后缀表达式:");for (int i = 0; i < ctext.length; i++) {System.out.print(ctext[i] + ",");}System.out.println("");out.writeUTF(ctext.length + "");for (int i = 0; i < ctext.length; i++) {out.writeUTF(ctext[i] + "");}out.writeUTF(ptextMd5);String s = in.readUTF();   //in读取信息,堵塞状态System.out.println("客户收到服务器的回应:" + s);} catch (Exception e) {System.out.println("服务器已断开" + e);}}
}

实验截图

1591742-20190530222645364-1762509054.png

码云链接

https://gitee.com/mayuda20175203/20175203/tree/master/src/test05

实验感想

本次实验感受最深的就是做的比较晚,到最后之前和我结对的小伙伴已经和别人跑了,,,这个问题其实很早以前就有,总是在赶DDL,手忙脚乱的,以后一定要注意提前,即使有问题也可以从容些。
然后本次实验相当于是将密码学和java相结合,其中的中缀后缀式则是在大一下的离散数学中接触的,实验中比较受启迪的就是编程不应局限于题目要求中所给出的两个模块(即客户端和服务器端),也可以有自己的添加,然后在两个大模块中调用就完事儿了,比如其中的DES,这个我觉得就是“高内聚,低耦合”的一种体现。

转载于:https://www.cnblogs.com/20175203mayuda/p/10946269.html

相关文章:

统计文件种类数+获取子shell返回值的其它方法

前言 只是作为一个shell的小小练习和日常统计用&#xff0c;瞎折腾的过程中也是摸到了获取子shell返回值的几种方法&#xff1b; 肯定还有别的方法&#xff0c;跟进程间的通信相关&#xff0c;希望你能提出建议和补充&#xff0c;谢谢~ 完整程序&#xff1a; #! /bin/bash #检查…

java中next的用法_关于java iterator的next()方法的用法

UYOUnext()是java迭代器类(Iterator)的方法&#xff0c;获得当前游标指向的下一个元素&#xff0c;详细说明和应用如下&#xff1a;1、迭代器(Iterator)介绍  迭代器是一种设计模式&#xff0c;它是一个对象&#xff0c;它可以遍历并选择序列中的对象&#xff0c;而开发人员不…

Python如何进行cross validation training

以4-fold validation training为例 (1) 给定数据集data和标签集label 样本个数为 sampNum len(data)(2) 将给定的所有examples分为10组 每个fold个数为 foldNum sampNum/10 (3) 将给定的所有examples分为10组 参考scikit-learn的3.1节&#xff1a;Cross-validation 1 impor…

Python的while循环

2019独角兽企业重金招聘Python工程师标准>>> 1.while循环的格式 while 条件:条件满足时&#xff0c;做的事情1条件满足时&#xff0c;做的事情2条件满足时&#xff0c;做的事情3...(省略)...demo i 0while i < 5:print("当前是第%d次执行循环" % (i …

LeetCode Add Binary

Given two binary strings, return their sum (also a binary string). For example,a "11"b "1"Return "100". 这题用数组来做可能更简单&#xff0c;但考虑到可能面试的时候要求不能开额外的数组&#xff0c;就只能对string操作了。最主要的…

linux java内存分析_Java内存分析利器MAT使用详解

这是一篇阅读MAT helper的笔记。Heap dump是Java进程在特定时间的一个内存快照。通常在触发heap dump之前会进行一次full gc&#xff0c;这样dump出来的内容就包含的是被gc后的对象。dump文件包含的内容&#xff1a;1&#xff0c;全部的对象&#xff1a;类&#xff0c;域&#…

[js] MD5算法

js版md5算法&#xff1a; /** * * MD5 (Message-Digest Algorithm) * http://www.webtoolkit.info/ * **/var MD5 function (string) {function RotateLeft(lValue, iShiftBits) {return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));}function AddUn…

vue中的时间过滤器

//全局过滤器&#xff0c;进行时间的格式化//所谓的全局过滤器即使所有的vue实例都共享的Vue.filter(dateFormat ,function(dateStr, pattern""){//根据给定的时间字符串&#xff0c;得到特定的时间var dt new Date(dateStr)//yyy---mm-ddvar y dt.getFullYear() /…

windows线程同步-原子操作-Interlocked系列函数(用户模式)

Interlocked系列函数用来保证原子访问。InterlockedExchangeAdd提供保证long类型的原子操作。InterlockedExchangeAdd64提供long long 64位的原子操作。搞不懂为什么不提供int类型的&#xff0c;int类型转换成long类型就是2个不同内存地址的变量&#xff0c;再来对long类型进行…

java 比较器comparator_Java中比较器的使用Compare和Comparator

Comparable和Comparator接口都是为了对类进行比较&#xff0c;众所周知&#xff0c;诸如Integer&#xff0c;double等基本数据类型&#xff0c;java可以对他们进行比较&#xff0c;而对于类的比较&#xff0c;需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比…

20160127:开始学VBA:(三)、判断语句

IIF函数判断 Sub 判断4() Range("a3") IIf(Range("a1") < 0, "负数或零", "负数")End Sub Sub 判断1() 单条件判断 If Range("a1").Value > 0 Then Range("b1") "正数" Else Range(…

java jdk中的归并排序实现

在Arrays.java中的sort中public static void sort(Object[] a, int fromIndex, int toIndex) {if (LegacyMergeSort.userRequested)legacyMergeSort(a, fromIndex, toIndex);elseComparableTimSort.sort(a, fromIndex, toIndex);}/** To be removed in a future release. */pri…

LeetCode.3-最长无重复字符子串(Longest Substring Without Repeating Characters)

这是悦乐书的第341次更新&#xff0c;第365篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第2题Longest Substring Without Repeating Characters&#xff08;顺位题号是3&#xff09;。给定一个字符串&#xff0c;找到最长无重复字符子字符串的长度。例如&am…

java代码操作git_JGit--实现Git命令操作的Java API

问题来源:最近在做一个项目&#xff0c;其中有一块需要用户上传代码到服务器中&#xff0c;然后分析用户所传的代码&#xff0c;传代码最直接的方式就是用户打个包上传&#xff0c;但是后期再分析代码的时候还要代码实现解压上传的代码&#xff0c;操作起来比较复杂。解决方案与…

Python学习(一) 安装,环境搭建,IDE

第一篇废话太多了&#xff0c;我的博客最主要的是给自己看的&#xff0c;大家觉得还凑合也可以看看&#xff0c;能说自己想法的就更好了&#xff0c;因为一个人的思想是有局限性的。集思广益&#xff0c;自己的认知才不会被禁锢。 注&#xff1a;其他的系统没装&#xff0c;在W…

桑叶黑芝麻糊,从头到脚通补

人体通补手册:丹道医学中的养命之术/武国忠著. —南京&#xff1a;江苏人民出版社&#xff0c;2009.8&#xff08;国医健康绝学系列&#xff09;ISBN 978-7-214-05938-3 桑叶黑芝麻糊&#xff0c;从头到脚通补 桑叶味甘、苦&#xff0c;性寒&#xff0c;可以入肝、肺经&#xf…

CSS jQuery制作漂亮的文字模糊效果

CSS3漂亮的模糊效果 运用CSS3 和 jQuery 以及其他javascript框架&#xff0c;将 CSS模糊效果发挥到极致. 本文底部可提供下载以及预览&#xff0c;并且包含了所有需要的文件包。 1. 烟雾模糊效果&#xff1a; 2.彩色灯晕效果 3. 鼠标悬浮模糊效果 4, 模糊效果 5&#xff0c;随机…

java 三维全景_3D开发-全景技术基础

全景&#xff0c;英文名(Panorama)&#xff0c;又被称为3D实景&#xff0c;是一种新兴的富媒体技术&#xff0c;其与视频&#xff0c;声音&#xff0c;图片等传统的流媒体最大的区别是“可操作&#xff0c;可交互”。 全景分为虚拟现实和3D实景两种。虚拟现实是利用maya等软件&…

HAProxy基础

HAProxy HAProxy是法国开发者Willy Tarreau 开发的一个开源然教案&#xff0c;是一款具备高并发、高性能的TCP和HTTP负载均衡器&#xff0c;支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统计。 HAProxy功能 HAProxy是TCP/HTTP反向代理服…

不试过你怎么知道?开博第一篇(本人菜鸟也,高手可以飘过)

我是菜鸟&#xff0c;一直都是&#xff0c;只不过以前比现在更菜而已。 注册博客园居然有5个月了。昨晚看过一位迷茫中的仁兄30岁了不知道干什么。。我跟他差不多。 既然他可以申请开博&#xff0c;为什么我就不试试看呢&#xff1f; 试试看又不会损失什么&#xff1f;被拒绝又…

java 类隔离_微服务架构中zuul的两种隔离机制实验

ZuulException REJECTED_SEMAPHORE_EXECUTION 是一个最近在性能测试中经常遇到的异常。查询资料发现是因为zuul默认每个路由直接用信号量做隔离&#xff0c;并且默认值是100&#xff0c;也就是当一个路由请求的信号量高于100那么就拒绝服务了&#xff0c;返回500。信号量隔离既…

技术网站/博客网址收藏

1、W3CHtmlDom标准 http://www.w3school.com.cn/htmldom/dom_obj_window.asp2、JavaScirpt参考教程&#xff1a;http://www.iselong.com/online/ebooks/javascript/3、CSS手册http://www.w3school.com.cn/css/css_positioning_floating.asp4、Lucene查询语句http://tech.ddvip.…

TableStore: 海量结构化数据分层存储方案

2019独角兽企业重金招聘Python工程师标准>>> 前言 表格存储是阿里云自研分布式存储系统&#xff0c;可以用来存储海量结构化、半结构化的数据。表格存储支持高性能和容量型两种实例类型。高性能使用SSD的存储介质&#xff0c;针对读多写多的场景都有较好的访问延时。…

计算 webView 显示内容后实际高度

两种方法&#xff0c;方法1可以得到内容的实际高度&#xff0c;方法2得到了将内容显示完整后的 webView 的尺寸&#xff08;包含 UIEdgeInsets&#xff09; - (void)webViewDidFinishLoad:(UIWebView *)wb{//方法1CGFloat documentWidth [[wb stringByEvaluatingJavaScriptFro…

另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...

在我的Android应用程序&#xff0c;我想有一类处理所有“写入/读取到文本文件”的行动。所以&#xff0c;我根本就调用我的readUserFile.java文件我想的方法。但我的方法将不会在该文件中工作&#xff1f;创建一个文件在我的MainActivity工作正常&#xff0c;但不会在我的readU…

编译器实现(五)

1.自底向上的分析 最普通的自底向上算法称作LR(1)分析( LR(1)parsing) ( L表示由左向右处理输入&#xff0c;R表示生成了最右推导&#xff0c;而数字1则表示使用了先行的一个符号)。 1.1自底向上分析概览 自底向上的分析程序使用了显式栈来完成分析&#xff0c;这与非递归的自顶…

Python字符串的修改以及传参

前两天去面试web developer&#xff0c;面试官提出一个问题&#xff0c;用JavaScript或者Python实现字符串反转&#xff0c;我选择了Python&#xff0c;然后写出了代码&#xff08;错误的&#xff09;&#xff1a; 1 #!/usr/bin/env python2 #-*-coding:utf-8-*-3 __author__ …

充血模式和贫血模式

贫血模型&#xff1a;是指领域对象里只有get和set方法&#xff0c;或者包含少量的CRUD方法&#xff0c;所有的业务逻辑都不包含在内而是放在Business Logic层。 优点是系统的层次结构清楚&#xff0c;各层之间单向依赖&#xff0c;Client->(Business Facade)->Busin…

java 方法里面定义接口_java – 当接口A在其方法签名中定义接口B时

…如何限制A的实现在方法签名中使用B的某个实现&#xff1f;用例这是一个Unit接口和两个实现它的枚举&#xff1a;public interface Unit { ... }public enum ForceUnit implements Unit { ... }public enum MassUnit implements Unit { ... }属性界面使用哪个&#xff1a;publ…

ANDROID_MARS学习笔记_S01_011ProgressBar

文档是这样来设置样式 <ProgressBarandroid:layout_width"wrap_content"android:layout_height"wrap_content"style"android:style/Widget.ProgressBar.Small"android:layout_marginRight"5dp" /> 1.xml <RelativeLayout xml…