2018-2019-2 20175204 张湲祯 实验五《网络编程与安全》实验报告
2018-2019-2 20175204 張湲禎 實驗五《網絡編程與安全》實驗報告
實驗五《網絡編程與安全》
一.實驗內容:
1.網絡編程與安全-1
任務詳情
兩人一組結對編程:
0.參考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
1.結對實現中綴表達式轉后綴表達式的功能 MyBC.java
2.結對實現從上面功能中獲取的表達式中實現后綴表達式求值的功能,調用MyDC.java
3.上傳測試代碼運行結果截圖和碼云鏈接
2.網絡編程與安全-2
結對編程:1人負責客戶端,一人負責服務器
3.網絡編程與安全-3
加密結對編程:1人負責客戶端,一人負責服務器
4.網絡編程與安全-4
密鑰分發結對編程:1人負責客戶端,一人負責服務器
5.網絡編程與安全-5
實驗五 網絡編程與安全-5
完整性校驗結對編程:1人負責客戶端,一人負責服務器
二.實驗步驟
1.任務一
1.使用棧對后綴表達式掃描:
-設置一個操作數棧,開始棧為空;
-從左到右掃描后綴表達式,遇操作數,進棧;
-若遇運算符,則從棧中退出兩個元素,先退出的放到運算符的右邊,后退出的放到運算符左邊,運算后的結果再進棧,直到后綴表達式掃描完畢。
2.實驗代碼
3.測試代碼
import java.util.Scanner; public class MyDCTester {public static void main (String[] args) {String expression, again;int result;try{Scanner in = new Scanner(System.in);do{MyDC evaluator = new MyDC();System.out.println ("Enter a valid postfix expression: ");expression = in.nextLine();result = evaluator.evaluate (expression);System.out.println();System.out.println ("That expression equals " + result);System.out.print ("Evaluate another expression [Y/N]? ");again = in.nextLine();System.out.println();}while ("y".equalsIgnoreCase(again));}catch (Exception IOException){System.out.println("Input exception reported");}} }4.實驗截圖
5.MyBC
-設立一個棧,存放運算符,首先棧為空;
-從左到右掃描中綴式,若遇到操作數,直接輸出,并輸出一個空格作為兩個操作數的分隔符;
-若遇到運算符,則與棧頂比較,比棧頂級別高則進棧,否則退出棧頂元素并輸出,然后輸出一個空格作分隔符;
-若遇到左括號,進棧;若遇到右括號,則一直退棧輸出,直到退到左括號止;
-當棧變成空時,輸出的結果即為后綴表達式。
6.實驗代碼
7.實驗截圖
2.任務二
1.客戶端
/*** javaclient** @author 20175204* @date 2019/5/28*/ import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket;public class javaClient {public static final String IP_ADDR = "127.0.0.1";public static final int PORT = 12345;public static void main(String[] args) {System.out.println("客戶端啟動...");while (true) {Socket socket = null;try {socket = new Socket(IP_ADDR, PORT);DataInputStream input = new DataInputStream(socket.getInputStream());DataOutputStream out = new DataOutputStream(socket.getOutputStream());System.out.print("請輸入: \t");String str = new BufferedReader(new InputStreamReader(System.in)).readLine();MyBC turner = new MyBC();String str1 = turner.turn(str);int length=0,i=0;while(str1.charAt(i)!='\0'){length++;i++;}String str2 = str1.substring(1,length-1);out.writeUTF(str2);String ret = input.readUTF();System.out.println("服務器端返回過來的是: " + ret);out.close();input.close();} catch (Exception e) {System.out.println("客戶端異常:" + e.getMessage());} finally {if (socket != null) {try {socket.close();} catch (IOException e) {socket = null;System.out.println("客戶端 finally 異常:" + e.getMessage());}}}}} }2.服務器
/*** javaclient** @author 20175204* @date 2019/5/28*/ import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket;public class javaServer {public static final int PORT = 12345;public static void main(String[] args) {System.out.println("服務器啟動...\n");javaServer server = new javaServer();server.init();}public void init() {try {ServerSocket serverSocket = new ServerSocket(PORT);while (true) {Socket javaclient = serverSocket.accept();new HandlerThread(javaclient);}} catch (Exception e) {System.out.println("服務器異常: " + e.getMessage());}}private class HandlerThread implements Runnable {private Socket socket;public HandlerThread(Socket client) {socket = client;new Thread(this).start();}public void run() {try {DataInputStream input = new DataInputStream(socket.getInputStream());String clientInputStr = input.readUTF();System.out.println("客戶端發過來的內容:" + clientInputStr);MyDC evalute = new MyDC();int result = evalute.evaluate(clientInputStr);DataOutputStream out = new DataOutputStream(socket.getOutputStream());System.out.print("計算結果:\t" + result);System.out.print("\n");out.writeUTF(String.valueOf(result));out.close();input.close();} catch (Exception e) {System.out.println("服務器 run 異常: " + e.getMessage());} finally {if (socket != null) {try {socket.close();} catch (Exception e) {socket = null;System.out.println("服務端 finally 異常:" + e.getMessage());}}}}} }3.實驗截圖
3.任務三
1.Skey_DES
import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import java.io.FileOutputStream; import java.io.ObjectOutputStream;public class Skey_DES{public static void key_DES()throws Exception{KeyGenerator kg=KeyGenerator.getInstance("DESede");kg.init(168);SecretKey k=kg.generateKey( );FileOutputStream f=new FileOutputStream("key1.dat");ObjectOutputStream b=new ObjectOutputStream(f);b.writeObject(k);} }2.Skey_kb
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.security.Key;public class Skey_kb{public static void key() throws Exception{FileInputStream f=new FileInputStream("key1.dat");ObjectInputStream b=new ObjectInputStream(f);Key k=(Key)b.readObject( );byte[ ] kb=k.getEncoded( );FileOutputStream f2=new FileOutputStream("keykb1.dat");f2.write(kb);// 打印密鑰編碼中的內容System.out.println("密鑰為:");for(int i=0;i<kb.length;i++){System.out.print(kb[i]+",");}System.out.println();} }3.服務器
import java.io.DataInputStream; import java.io.DataOutputStream; import java.net.ServerSocket; import java.net.Socket;public class Server1 {public static final int PORT = 12345;//監聽的端口號public static void main(String[] args) {System.out.println("服務器啟動...\n");Server1 server = new Server1();server.init();}public void init() {try {ServerSocket serverSocket = new ServerSocket(PORT);while (true) {// 一旦有堵塞, 則表示服務器與客戶端獲得了連接Socket client = serverSocket.accept();// 處理這次連接new HandlerThread(client);}} catch (Exception e) {System.out.println("服務器異常: " + e.getMessage());}}private class HandlerThread implements Runnable {private Socket socket;public HandlerThread(Socket client) {socket = client;new Thread(this).start();}public void run() {try {// 讀取客戶端數據DataInputStream input = new DataInputStream(socket.getInputStream());String clientInputStr = input.readUTF();//這里要注意和客戶端輸出流的寫方法對應,否則會拋 EOFException//處理客戶端數據System.out.println("客戶端發過來的內容:" + clientInputStr);MyDC evalute = new MyDC();SDec sDec = new SDec();int result = evalute.evaluate(clientInputStr);// 向客戶端回復信息DataOutputStream out = new DataOutputStream(socket.getOutputStream());System.out.print("計算結果:\t");// 發送鍵盤輸入的一行//String s = new BufferedReader(new InputStreamReader(System.in)).readLine();out.writeUTF(String.valueOf(result));out.close();input.close();} catch (Exception e) {System.out.println("服務器 run 異常: " + e.getMessage());} finally {if (socket != null) {try {socket.close();} catch (Exception e) {socket = null;System.out.println("服務端 finally 異常:" + e.getMessage());}}}}} }4.客戶端
import java.io.*; import java.net.Socket;public class Client1 {public static final String IP_ADDR = "127.0.0.1";//服務器地址public static final int PORT = 12345;//服務器端口號public static void main(String[] args) {System.out.println("客戶端啟動...");while (true) {Socket socket = null;try {//創建一個流套接字并將其連接到指定主機上的指定端口號socket = new Socket(IP_ADDR, PORT);//讀取服務器端數據DataInputStream input = new DataInputStream(socket.getInputStream());//向服務器端發送數據DataOutputStream out = new DataOutputStream(socket.getOutputStream());System.out.print("請輸入: \t");String str = new BufferedReader(new InputStreamReader(System.in)).readLine();MyBC turner = new MyBC();Skey_DES skey_des = new Skey_DES();skey_des.key_DES();Skey_kb skey_kb = new Skey_kb();skey_kb.key();/*產生密鑰*/SEnc sEnc = new SEnc();String str1 = turner.turn(str);int length = 0, i = 0;while (str1.charAt(i) != '\0') {length++;i++;}String str2 = str1.substring(1, length - 1);out.writeUTF(str2);String ret = input.readUTF();System.out.println("服務器端返回過來的是: " + ret);// 如接收到 "OK" 則斷開連接/*if ("OK".equals(ret)) {System.out.println("客戶端將關閉連接");Thread.sleep(500);break;}*/out.close();input.close();} catch (Exception e) {System.out.println("客戶端異常:" + e.getMessage());} finally {if (socket != null) {try {socket.close();} catch (IOException e) {socket = null;System.out.println("客戶端 finally 異常:" + e.getMessage());}}}}} }5.實驗截圖
4.任務四
1.Keyagree
import java.io.*; import java.math.*; import java.security.*; import java.security.spec.*; import javax.crypto.*; import javax.crypto.spec.*; import javax.crypto.interfaces.*;public class KeyAgree{public KeyAgree(){}public static SecretKeySpec KeyAgree(String a,String b) throws Exception{// 讀取對方的DH公鑰FileInputStream f1=new FileInputStream(a);ObjectInputStream b1=new ObjectInputStream(f1);PublicKey pbk=(PublicKey)b1.readObject( ); //讀取自己的DH私鑰FileInputStream f2=new FileInputStream(b);ObjectInputStream b2=new ObjectInputStream(f2);PrivateKey prk=(PrivateKey)b2.readObject( );// 執行密鑰協定KeyAgreement ka=KeyAgreement.getInstance("DH");ka.init(prk);ka.doPhase(pbk,true);//生成共享信息byte[ ] s=ka.generateSecret();byte []sb = new byte[24];for(int i=0; i<24; i++)sb[i] = s[i];System.out.println("共享秘鑰:");for(int i=0;i<sb.length;i++){System.out.print(sb[i]+" ");}System.out.println();SecretKeySpec k=new SecretKeySpec(sb,"DESede");return k;} }2.服務器
import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.net.*; public class Server2 {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("服務器啟動...\n");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("服務端 finally 異常:");}} }3.客戶端
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 Client2 {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.turn(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("客戶端 finally 異常:" + e);}} }4.實驗截圖
5.任務五
1.客戶端
import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.net.Socket; import java.security.*; import java.util.Scanner; import java.net.*; public class Client2 {public static void main(String[] args) {Socket mysocket;DataInputStream in=null;DataOutputStream out=null;Scanner scanner = new Scanner(System.in);try {System.out.print("輸入服務器的IP:");String IP = scanner.nextLine();InetAddress address=InetAddress.getByName(IP);mysocket = new Socket(address, 2010);in = new DataInputStream(mysocket.getInputStream());out = new DataOutputStream(mysocket.getOutputStream());Key_DH.DH("Lpub.dat","Lpri.dat");FileInputStream my = new FileInputStream("Lpub.dat");ObjectInputStream mypub = new ObjectInputStream(my);Key kp = (Key) mypub.readObject();ByteArrayOutputStream DH = new ByteArrayOutputStream();ObjectOutputStream myDH = new ObjectOutputStream(DH);myDH.writeObject(kp);byte []pub = DH.toByteArray();out.writeUTF(pub.length+"");for(int i=0;i<pub.length;i++) {out.writeUTF(pub[i]+ "");}Thread.sleep(1000);int length = Integer.parseInt(in.readUTF());byte cpub[] = new byte[length];for(int i=0;i<length;i++) {String temp = in.readUTF();cpub[i] = Byte.parseByte(temp);}ByteArrayInputStream ckey1 = new ByteArrayInputStream(cpub);ObjectInputStream ckey = new ObjectInputStream(ckey1);Key k = (Key) ckey.readObject();FileOutputStream f2 = new FileOutputStream("W1pub.dat");ObjectOutputStream b2 = new ObjectOutputStream(f2);b2.writeObject(k);KeyAgree.Agree("W1pub.dat","Lpri.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("\n請輸入中綴表達式:");while(scanner.hasNext()) {String question = scanner.next();MyBC change = new MyBC();change.ChangeString(question);String question1 = change.ChangeOrder();System.out.println("后綴表達式為:" + question1);String mtoMD5 = DigestPass.MD5(question1);System.out.println("明文的MD5值為:"+mtoMD5);out.writeUTF(mtoMD5);SecretKeySpec k1 = new SecretKeySpec(keysb, "DESede");Cipher cp = Cipher.getInstance("DESede");cp.init(Cipher.ENCRYPT_MODE, k1);byte ptext[] = question1.getBytes("UTF8");byte ctext[] = cp.doFinal(ptext);System.out.println("加密后的后綴表達式為:");for (int i = 0; i < ctext.length; i++) {System.out.print(ctext[i] + " ");}out.writeUTF(ctext.length + "");for (int i = 0; i < ctext.length; i++) {out.writeUTF(ctext[i] + "");}String s=in.readUTF(); //in讀取信息,堵塞狀態System.out.println("\n客戶收到服務器的回答:"+s);Thread.sleep(500);System.out.println("請輸入中綴表達式:");}}catch (Exception e) {System.out.println(e);}} }2.服務器
import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.security.*;public class Server2 {public static void main(String[] args) throws Exception {ServerSocket serverForClient = null;Socket socketOnServer = null;DataOutputStream out = null;DataInputStream in = null;try {serverForClient = new ServerSocket(2010);} catch (IOException e) {System.out.println(e);}System.out.println("等待客戶呼叫");try {socketOnServer = serverForClient.accept();out = new DataOutputStream(socketOnServer.getOutputStream());in = new DataInputStream(socketOnServer.getInputStream());Key_DH.DH("Wpub.dat","Wpri.dat");int length = Integer.parseInt(in.readUTF());byte cpub[] = new byte[length];for(int i=0;i<length;i++) {String temp = in.readUTF();cpub[i] = Byte.parseByte(temp);}ByteArrayInputStream ckey1 = new ByteArrayInputStream(cpub);ObjectInputStream ckey = new ObjectInputStream(ckey1);Key k1 = (Key) ckey.readObject();FileOutputStream f2 = new FileOutputStream("L1pub.dat");ObjectOutputStream b2 = new ObjectOutputStream(f2);b2.writeObject(k1);FileInputStream my = new FileInputStream("Wpub.dat");ObjectInputStream mypub = new ObjectInputStream(my);Key kp = (Key) mypub.readObject();ByteArrayOutputStream DH = new ByteArrayOutputStream();ObjectOutputStream myDH = new ObjectOutputStream(DH);myDH.writeObject(kp);byte []pub = DH.toByteArray();out.writeUTF(pub.length+"");for(int i=0;i<pub.length;i++) {out.writeUTF(pub[i]+ "");}KeyAgree.Agree("L1pub.dat","Wpri.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]+" ");}while(true) {String c = in.readUTF();SecretKeySpec k = new SecretKeySpec(keysb, "DESede");Cipher cp = Cipher.getInstance("DESede");cp.init(Cipher.DECRYPT_MODE, k);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);}byte[] ptext = cp.doFinal(ctext);String question = new String(ptext, "UTF8");System.out.println("\n解密后的后綴表達式為:" + question);String mtoMD5 = DigestPass.MD5(question);System.out.println("MD5的值為"+ mtoMD5);if(mtoMD5.equals(c)) {System.out.println("傳遞的MD5值和解密的后綴表達式的MD5值相同,可以解密!");MyDC getanswer = new MyDC();getanswer.set(question);Rational answer = getanswer.get();int a = answer.getNumerator();int b = answer.getDenominator();float result = (float) a / b;System.out.println("計算出的結果為"+String.format("%.2f",result));out.writeUTF(String.format("%.2f",result));}else {System.out.println("密文有誤,不能解密!");}Thread.sleep(500);}}catch(Exception e) {System.out.println("客戶已斷開" + e);}} }3.實驗截圖
轉載于:https://www.cnblogs.com/zyzgl/p/10937611.html
總結
以上是生活随笔為你收集整理的2018-2019-2 20175204 张湲祯 实验五《网络编程与安全》实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工具类--Excel 导出poi
- 下一篇: css 限制字数