[TOC]html
以前結隊編程作過同樣的題目,因此就肥腸簡單啦java
爲何要將中綴表達式轉爲後綴表達式算法
後綴表達式的定義編程
ab+cde+**
,改成中綴表達式實際上是(a+b)*((d+e)*c)
中綴轉後綴數組
後綴表達式的計算安全
import java.util.Stack; public class MyBC { MyBC(){} public static String infixToSuffix(String exp){ Stack<String> s = new Stack<String>(); // 建立操做符堆棧 String suffix = ""; // 要輸出的後綴表達式字符串 String suffix1 = ""; //上一次的後綴表達式 String suffix2 = ""; String str[] = exp.split(" "); int length = str.length; // 輸入的中綴表達式的長度 String temp=""; for (int i = 0; i < length; i++) { // 對該中綴表達式的每個字符並進行判斷 switch (str[i]) { case " ":break; // 忽略空格 case "(": s.push(str[i]); // 若是是左括號直接壓入堆棧 break; case "+": case "-": if(s.size() != 0){ // 碰到'+' '-',將棧中的全部運算符所有彈出去,直至碰到左括號爲止,輸出到隊列中去 temp = s.pop(); if (temp.equals("(")) { // 將左括號放回堆棧,終止循環 s.push(temp); s.push(str[i]); break; } else{ s.push(str[i]); suffix2 = suffix2 + temp + " "; break; } } else{ s.push(str[i]); // 說明是當前爲第一次進入或者其餘前面運算都有括號等狀況致使棧已經爲空,此時須要將符號進棧 break; } // 若是是乘號或者除號,則彈出全部序列,直到碰到加好、減號、左括號爲止,最後將該操做符壓入堆棧 case "*": case "÷": if(s.size()!=0){ temp = s.pop(); if(temp.equals("+")||temp.equals("-")||temp.equals("(")){ s.push(temp); s.push(str[i]); break; } else{ s.push(str[i]); suffix2 = suffix2+temp+" "; break; } } else { s.push(str[i]); //當前爲第一次進入或者其餘前面運算都有括號等狀況致使棧已經爲空,此時須要將符號進棧 break; } // 若是碰到的是右括號,則距離棧頂的第一個左括號上面的全部運算符彈出棧並拋棄左括號 case ")": while (!s.isEmpty()) { temp = s.pop(); if (temp.equals("(")) { break; } else { suffix2 = suffix2+temp+" "; } } break; // 默認狀況,若是讀取到的是數字,則直接送至輸出序列 default: suffix2 = suffix2+str[i]+" "; break; } } // 若是堆棧不爲空,則把剩餘運算符一次彈出,送至輸出序列 while (s.size() != 0) { suffix2 = suffix2+s.pop()+" "; } if(suffix1.equals("")){ //第一個題目 suffix1 = suffix2; suffix = suffix2; } else{ if(suffix2.equals(suffix1)) suffix = ""; else suffix = suffix2; } suffix1 = suffix2; return suffix; } }
首先固然要知道本身本機的IP地址服務器
套接字網絡
客戶端套接字數據結構
Socket clientSocket = new Socket("服務器的IP地址",一個端口號)
SeverSocket對象與服務器端套接字socket
SeverSocket severForClient = new SeverSocket(端口號)
Socket sc = severForClient.accept()
使用close()
關閉套接字連接
import java.net.*; public class getHostAddress { public static void main(String[] args) { try{ InetAddress hostaddress = InetAddress.getLocalHost(); System.out.println(hostaddress.toString()); }catch (UnknownHostException e){ System.out.println(e); } } }
import java.io.*; import java.net.*; import java.util.Scanner; public class Client { public static void main(String[] args) { Scanner inn = new Scanner(System.in); Socket mysocket; DataInputStream in = null; DataOutputStream out = null; try{ mysocket = new Socket("172.30.1.177",2010); in = new DataInputStream(mysocket.getInputStream()); out = new DataOutputStream(mysocket.getOutputStream()); System.out.println("請輸入中綴表達式:"); String infix = inn.nextLine(); String suffix = MyBC.infixToSuffix(infix); out.writeUTF(suffix); String result = in.readUTF(); System.out.println("小猴收到胖礫的回答"+result); Thread.sleep(500); }catch (Exception e){ System.out.println("胖礫又去吃飯了"+e); } } }
import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils; import java.io.*; import java.net.*; public class Sever { public static void main(String[] args) { ServerSocket serverForClient = null; Socket socketOnServer = null; DataOutputStream out = null; DataInputStream in = null; MyDC myDC = new MyDC(); 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 suffix = in.readUTF(); System.out.println("胖礫收到小猴的提問"+suffix); out.writeUTF(myDC.evaluate(suffix)+""); Thread.sleep(500); }catch (Exception e){ System.out.println("小猴已斷開鏈接"); } } }
獲取本機地址
客戶端
服務器端
DES密鑰
KeyGenerator kg=KeyGenerator.getInstance("DESede")
kg.init(168)
SecretKey k=kg.generateKey( )
DES密鑰編碼內容
byte[ ] kb=k.getEncoded( )
傳送祕鑰的長度,out.writeUTF(kb.length+"")
傳送密鑰內容
for(int i=0; i<kb.length; i++){ out.writeUTF(kb[i]+""); }
客戶端DES加密
Cipher cp=Cipher.getInstance("DESede")
cp.init(Cipher.ENCRYPT_MODE, k)
byte ptext[]=suffix.getBytes("UTF8")
byte ctext[]=cp.doFinal(ptext)
傳輸密文長度,out.writeUTF(ctext.length+"")
傳輸密文內容
for(int i=0; i<ctext.length; i++){ out.writeUTF(ctext[i]+""); }
獲取密鑰長度,String keylength = in.readUTF()
獲取密鑰
byte []kb = new byte[Integer.parseInt(keylength)]; for(int i=0; i<Integer.parseInt(keylength); i++){ String t = in.readUTF(); kb[i] = Byte.parseByte(t); }
獲取密文長度,String clength = in.readUTF()
獲取密文
byte []ctext = new byte[Integer.parseInt(clength)]; for(int i=0; i<Integer.parseInt(clength); i++){ String temp = in.readUTF(); ctext[i] = Byte.parseByte(temp); }
建立密碼器(Cipher對象)
Cipher cp=Cipher.getInstance("DESede")
初始化密碼器
cp.init(Cipher.DECRYPT_MODE, k)
執行解密
byte []ptext=cp.doFinal(ctext)
import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.io.*; import java.net.*; import java.util.Scanner; public class Client1 { public static void main(String[] args) { Scanner inn = new Scanner(System.in); Socket mysocket; DataInputStream in = null; DataOutputStream out = null; try{ mysocket = new Socket("127.0.0.1",2010); in = new DataInputStream(mysocket.getInputStream()); out = new DataOutputStream(mysocket.getOutputStream()); KeyGenerator kg=KeyGenerator.getInstance("DESede"); kg.init(168); SecretKey k=kg.generateKey( ); byte[ ] kb=k.getEncoded( ); out.writeUTF(kb.length+""); for(int i=0; i<kb.length; i++){ out.writeUTF(kb[i]+""); } System.out.println("請輸入中綴表達式:"); String infix = inn.nextLine(); MyBC myBC = new MyBC(); String suffix = myBC.infixToSuffix(infix); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext[]=suffix.getBytes("UTF8"); byte ctext[]=cp.doFinal(ptext); out.writeUTF(ctext.length+""); for(int i=0; i<ctext.length; i++){ out.writeUTF(ctext[i]+""); } String result = in.readUTF(); System.out.println("小猴收到胖礫的回答"+result); Thread.sleep(500); }catch (Exception e){ System.out.println("胖礫又去吃飯了"+e); } } }
import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.net.*; public class Sever1 { public static void main(String[] args) { ServerSocket serverForClient = null; Socket socketOnServer = null; DataOutputStream out = null; DataInputStream in = null; MyDC myDC = new MyDC(); 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 keylength = in.readUTF(); byte []kb = new byte[Integer.parseInt(keylength)]; for(int i=0; i<Integer.parseInt(keylength); i++){ String t = in.readUTF(); kb[i] = Byte.parseByte(t); } String clength = in.readUTF(); byte []ctext = new byte[Integer.parseInt(clength)]; for(int i=0; i<Integer.parseInt(clength); i++){ String temp = in.readUTF(); ctext[i] = Byte.parseByte(temp); } SecretKeySpec k=new SecretKeySpec(kb,"DESede"); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.DECRYPT_MODE, k); byte []ptext=cp.doFinal(ctext); String suffix = new String(ptext,"UTF8"); System.out.println("胖礫收到小猴的提問"+suffix); out.writeUTF(myDC.evaluate(suffix)+""); Thread.sleep(500); }catch (Exception e){ System.out.println("小猴已斷開鏈接"); } } }
客戶端
服務端
建立DH公鑰和私鑰
建立共享祕鑰
FileInputStream f1 = new FileInputStream("Serverpub.dat"); ObjectInputStream b1 = new ObjectInputStream(f1); FileInputStream f2 = new FileInputStream("Clientpri.dat"); ObjectInputStream b2 = new ObjectInputStream(f2);
建立密鑰協定對象,KeyAgreement ka=KeyAgreement.getInstance("DH")
初始化密鑰協定對象,ka.init(prk)
執行密鑰協定,ka.doPhase(pbk,true)
生成共享信息,byte[ ] sb=ka.generateSecret()
使用SecretKeySpec k=new SecretKeySpec(sb,"DESede")
,建立密鑰。
用3DES算法加密中綴表達式
用共享祕鑰加密密鑰
給服務器發送密文和加密後的密鑰
服務器用共享祕鑰解密密鑰
服務器用解密後的密鑰對密文進行解密
import javax.crypto.spec.*; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.Socket; import java.util.Scanner; public class Client4 { public static void main(String[] args) { Scanner inn = new Scanner(System.in); Socket mysocket; DataInputStream in = null; DataOutputStream out = null; try { mysocket = new Socket("127.0.0.1", 2010); in = new DataInputStream(mysocket.getInputStream()); out = new DataOutputStream(mysocket.getOutputStream()); KeyGenerator kg = KeyGenerator.getInstance("DESede"); kg.init(168); SecretKey k = kg.generateKey(); byte[] kb = k.getEncoded(); System.out.println("請輸入中綴表達式:"); String infix = inn.nextLine(); MyBC myBC = new MyBC(); String suffix = myBC.infixToSuffix(infix); System.out.println(suffix); //中綴表達式加密 Cipher cp = Cipher.getInstance("DESede"); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext[] = suffix.getBytes("UTF8"); byte ctext[] = cp.doFinal(ptext); out.writeUTF(ctext.length + ""); for (int i = 0; i < ctext.length; i++) { out.writeUTF(ctext[i] + ""); } //對密鑰進行加密 KeyAgree keyAgree = new KeyAgree(); SecretKeySpec k1 = keyAgree.KeyAgree("Serverpub.dat","Clientpri.dat"); cp.init(Cipher.ENCRYPT_MODE, k1); byte ckey[] = cp.doFinal(kb); out.writeUTF(ckey.length + ""); for (int i = 0; i < ckey.length; i++) { out.writeUTF(ckey[i] + ""); } String result = in.readUTF(); System.out.println("小猴收到胖礫的回答" + result); Thread.sleep(500); } catch (Exception e) { System.out.println("胖礫又去吃飯了" + e); } } }
import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.net.*; public class Server4 { public static void main(String[] args) { ServerSocket serverForClient = null; Socket socketOnServer = null; DataOutputStream out = null; DataInputStream in = null; MyDC myDC = new MyDC(); 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 clength = in.readUTF(); byte []ctext = new byte[Integer.parseInt(clength)]; for(int i=0; i<Integer.parseInt(clength); i++){ String temp = in.readUTF(); ctext[i] = Byte.parseByte(temp); } //獲取密鑰 String keylength = in.readUTF(); byte []ckey = new byte[Integer.parseInt(keylength)]; for(int i=0; i<Integer.parseInt(keylength); i++){ String temp = in.readUTF(); ckey[i] = Byte.parseByte(temp); } //密鑰解密 SecretKeySpec k1 = KeyAgree.KeyAgree("Clientpub.dat","Serverpri.dat"); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.DECRYPT_MODE, k1); byte []pkey=cp.doFinal(ckey); //密文解密 SecretKeySpec k=new SecretKeySpec(pkey,"DESede"); cp.init(Cipher.DECRYPT_MODE, k); byte []ptext=cp.doFinal(ctext); String suffix = new String(ptext,"UTF8"); System.out.println("胖礫收到小猴的提問"+suffix); out.writeUTF(myDC.evaluate(suffix)+""); Thread.sleep(500); }catch (Exception e){ System.out.println("小猴已斷開鏈接"); } } }
客戶端
服務器
MessageDigest m=MessageDigest.getInstance("MD5")
m.update(x.getBytes("UTF8" ))
byte s[ ]=m.digest( )
MessageDigest m = MessageDigest.getInstance("MD5"); m.update(suffix.getBytes("UTF8")); byte s[] = m.digest(); String result=""; for (int i=0; i<s.length; i++){ result+=Integer.toHexString((0x000000ff & s[i]) | 0xffffff00).substring(6); }
客戶端
服務器
本次實驗是對教材十三章網絡編程和Java密碼學算法的實際應用,當時學的時候感受就有點迷糊不知道如何真實應用,經過此次實驗不只複習了相關知識,理解之前不懂的知識點,還了解了另外一種通訊手段