实验五 网络编程与安全-----实验报告
一、實(shí)驗(yàn)五 網(wǎng)絡(luò)編程與安全-1
1.實(shí)驗(yàn)要求:
兩人一組結(jié)對(duì)編程:
(1)參考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA ;
(2)結(jié)對(duì)實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式的功能 MyBC.java;
(3)結(jié)對(duì)實(shí)現(xiàn)從上面功能中獲取的表達(dá)式中實(shí)現(xiàn)后綴表達(dá)式求值的功能,調(diào)用MyDC.java;
(4)上傳測(cè)試代碼運(yùn)行結(jié)果截圖和碼云鏈接;
2.實(shí)驗(yàn)過(guò)程:
(1)MyDC代碼:
(2)MyDCTest代碼:
import java.util.Scanner;public class MyDCTest {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 (again.equalsIgnoreCase("y"));}catch (Exception IOException){System.out.println("Input exception reported");}}}(3)MyBC代碼:
import java.util.*; public class MyBC {public String result(String s) {Stack<String> sta = new Stack<String>(); //新建棧String str = "";StringTokenizer t=new StringTokenizer(s);while (t.hasMoreTokens()){ //依次遍歷元素,轉(zhuǎn)為后綴表達(dá)式String temp;String c;c=t.nextToken();if (c.equals("+") || c.equals("-")) { //遇到優(yōu)先級(jí)最低的“+”、“-”,彈出“(”之前的所有元素while (sta.size() != 0) {temp = sta.pop();if (temp.equals("(")) {sta.push("(");break;}str = str + temp + " ";}sta.push(c);} else if (c.equals("*")|| c.equals("÷")) { //遇到優(yōu)先級(jí)高的“*”、“/”,彈出“(”之前的“*”、“/”while (sta.size() != 0) {temp = sta.pop();if (temp.equals("(") || temp.equals("+") || temp.equals("-")) {sta.push(temp);break;} else {str = str + temp + " ";}}sta.push(c);} else if (c.equals("(")) { //遇到“(”直接入棧sta.push(c);} else if (c.equals(")")) { //遇到“)”,彈出“(”之前的所有元素while (sta.size() != 0) {temp = sta.pop();if (temp.equals("(")) {break;} else {str = str + temp + " ";}}} else //遇到數(shù)字,直接存入數(shù)組{str = str + c + " ";}}while (sta.size()!=0){ //彈出棧中剩余的元素str=str+sta.pop()+" ";}return str;} }(4)Calculate代碼:
import java.util.Scanner; public class Caculate {public static void main(String[] args) {MyDC a = new MyDC();MyBC b = new MyBC();String str;int result;System.out.println("輸入算式:");Scanner reader = new Scanner(System.in);str = reader.nextLine();str = b.result(str);result = a.evaluate(str);System.out.println("答案為:"+result);} }3.實(shí)驗(yàn)截圖:
(1)測(cè)試MyDC截圖:
(2)計(jì)算結(jié)果截圖:
4.碼云鏈接:
https://gitee.com/zzm-zcc/zhang_zhi_min/tree/master/%E5%AE%9E%E9%AA%8C5--1
二、實(shí)驗(yàn)五 網(wǎng)絡(luò)編程與安全-2
1.實(shí)驗(yàn)要求:
結(jié)對(duì)編程:1人負(fù)責(zé)客戶端,一人負(fù)責(zé)服務(wù)器;
(1)注意責(zé)任歸宿,要會(huì)通過(guò)測(cè)試證明自己沒有問(wèn)題;
(2)基于Java Socket實(shí)現(xiàn)客戶端/服務(wù)器功能,傳輸方式用TCP;
(3)客戶端讓用戶輸入中綴表達(dá)式,然后把中綴表達(dá)式調(diào)用MyBC.java的功能轉(zhuǎn)化為后綴表達(dá)式,把后綴表達(dá)式通過(guò)網(wǎng)絡(luò)發(fā)送給服務(wù)器;
(4)服務(wù)器接收到后綴表達(dá)式,調(diào)用MyDC.java的功能計(jì)算后綴表達(dá)式的值,把結(jié)果發(fā)送給客戶端;
(5)客戶端顯示服務(wù)器發(fā)送過(guò)來(lái)的結(jié)果;
(6)上傳測(cè)試結(jié)果截圖和碼云鏈接;
2.實(shí)驗(yàn)過(guò)程:
(1)Server代碼(服務(wù)器端):
(2)Client代碼(客戶端):
import java.io.*; import java.net.*; import java.lang.*; import java.util.Scanner;public class Client {public static void main(String args[]) {Socket mysocket;DataInputStream in=null;DataOutputStream out=null;try{ mysocket=new Socket("127.1.0.0",2010);in=new DataInputStream(mysocket.getInputStream());out=new DataOutputStream(mysocket.getOutputStream());System.out.println("請(qǐng)輸入算式:");Scanner scanner=new Scanner(System.in);String str=scanner.nextLine();MyBC b=new MyBC();str=b.result(str);out.writeUTF(str);String s=in.readUTF(); //in讀取信息,堵塞狀態(tài)System.out.println("客戶收到服務(wù)器的回答:"+s);Thread.sleep(500);}catch(Exception e) {System.out.println("服務(wù)器已斷開"+e);}} }注:任然需要MyDC代碼與MyBC代碼。
3.實(shí)驗(yàn)截圖:
(1)服務(wù)器端截圖:
(2)客戶端截圖:
4.碼云鏈接:
https://gitee.com/zzm-zcc/zhang_zhi_min/commit/5377d0290f76f29daae2099b11936647409ae965
三、實(shí)驗(yàn)五 網(wǎng)絡(luò)編程與安全-3
1.實(shí)驗(yàn)要求:
加密結(jié)對(duì)編程:1人負(fù)責(zé)客戶端,一人負(fù)責(zé)服務(wù)器;
(1)注意責(zé)任歸宿,要會(huì)通過(guò)測(cè)試證明自己沒有問(wèn)題;
(2)基于Java Socket實(shí)現(xiàn)客戶端/服務(wù)器功能,傳輸方式用TCP;
(3)客戶端讓用戶輸入中綴表達(dá)式,然后把中綴表達(dá)式調(diào)用MyBC.java的功能轉(zhuǎn)化為后綴表達(dá)式,把后綴表達(dá)式用3DES或AES算法加密后通過(guò)網(wǎng)絡(luò)把密文發(fā)送給服務(wù)器;
(4)服務(wù)器接收到后綴表達(dá)式表達(dá)式后,進(jìn)行解密(和客戶端協(xié)商密鑰,可以用數(shù)組保存),然后調(diào)用MyDC.java的功能計(jì)算后綴表達(dá)式的值,把結(jié)果發(fā)送給客戶端;
(5)客戶端顯示服務(wù)器發(fā)送過(guò)來(lái)的結(jié)果;
(6)上傳測(cè)試結(jié)果截圖和碼云鏈接;
2.實(shí)驗(yàn)過(guò)程:
(1)ServerOne代碼(服務(wù)器端)
(2) ClientOne代碼(客戶端)
import java.io.*; import java.net.*; import java.lang.*; import java.util.Scanner;public class ClientOne {public static void main(String args[]) throws Exception {String key = "";int n = -1;byte[] a = new byte[128];try {File f = new File("key1.dat");InputStream in = new FileInputStream(f);while ((n = in.read(a, 0, 100)) != -1) {key = key + new String(a, 0, n);}in.close();} catch (IOException e) {System.out.println("File read Error" + e);}Socket mysocket;DataInputStream in = null;DataOutputStream out = null;System.out.println("請(qǐng)輸入算式:");Scanner scanner = new Scanner(System.in);String str = scanner.nextLine();//輸入算式MyBC b = new MyBC();str = b.result(str);String secret=Encoder.AESEncode(key,str);//客戶端進(jìn)行加密try {mysocket = new Socket("127.1.0.0", 2010);in = new DataInputStream(mysocket.getInputStream());out = new DataOutputStream(mysocket.getOutputStream());out.writeUTF(key);out.writeUTF(secret);String s = in.readUTF(); //in讀取信息,堵塞狀態(tài)System.out.println("客戶收到服務(wù)器的回答:" + s);Thread.sleep(500);} catch (Exception e) {System.out.println("服務(wù)器已斷開" + e);}} }(3) Encoder代碼(加解密代碼)
import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Base64; import java.util.Scanner;import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec;import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;/** AES對(duì)稱加密和解密*/ public class Encoder {/** 加密* 1.構(gòu)造密鑰生成器* 2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器* 3.產(chǎn)生密鑰* 4.創(chuàng)建和初始化密碼器* 5.內(nèi)容加密* 6.返回字符串*/public static String AESEncode(String encodeRules,String content){try {//1.構(gòu)造密鑰生成器,指定為AES算法,不區(qū)分大小寫KeyGenerator keygen=KeyGenerator.getInstance("AES");//2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器//生成一個(gè)128位的隨機(jī)源,根據(jù)傳入的字節(jié)數(shù)組keygen.init(128, new SecureRandom(encodeRules.getBytes()));//3.產(chǎn)生原始對(duì)稱密鑰SecretKey original_key=keygen.generateKey();//4.獲得原始對(duì)稱密鑰的字節(jié)數(shù)組byte [] raw=original_key.getEncoded();//5.根據(jù)字節(jié)數(shù)組生成AES密鑰SecretKey key=new SecretKeySpec(raw, "AES");//6.根據(jù)指定算法AES自成密碼器Cipher cipher=Cipher.getInstance("AES");//7.初始化密碼器,第一個(gè)參數(shù)為加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二個(gè)參數(shù)為使用的KEYcipher.init(Cipher.ENCRYPT_MODE, key);//8.獲取加密內(nèi)容的字節(jié)數(shù)組(這里要設(shè)置為utf-8)不然內(nèi)容中如果有中文和英文混合中文就會(huì)解密為亂碼byte [] byte_encode=content.getBytes("utf-8");//9.根據(jù)密碼器的初始化方式--加密:將數(shù)據(jù)加密byte [] byte_AES=cipher.doFinal(byte_encode);//10.將加密后的數(shù)據(jù)轉(zhuǎn)換為字符串//這里用Base64Encoder中會(huì)找不到包//解決辦法://在項(xiàng)目的Build path中先移除JRE System Library,再添加庫(kù)JRE System Library,重新編譯后就一切正常了。String AES_encode=new String(new BASE64Encoder().encode(byte_AES));//11.將字符串返回return AES_encode;} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}//如果有錯(cuò)就返加nulllreturn null;}/** 解密* 解密過(guò)程:* 1.同加密1-4步* 2.將加密后的字符串反紡成byte[]數(shù)組* 3.將加密內(nèi)容解密*/public static String AESDncode(String encodeRules,String content){try {//1.構(gòu)造密鑰生成器,指定為AES算法,不區(qū)分大小寫KeyGenerator keygen=KeyGenerator.getInstance("AES");//2.根據(jù)ecnodeRules規(guī)則初始化密鑰生成器//生成一個(gè)128位的隨機(jī)源,根據(jù)傳入的字節(jié)數(shù)組keygen.init(128, new SecureRandom(encodeRules.getBytes()));//3.產(chǎn)生原始對(duì)稱密鑰SecretKey original_key=keygen.generateKey();//4.獲得原始對(duì)稱密鑰的字節(jié)數(shù)組byte [] raw=original_key.getEncoded();//5.根據(jù)字節(jié)數(shù)組生成AES密鑰SecretKey key=new SecretKeySpec(raw, "AES");//6.根據(jù)指定算法AES自成密碼器Cipher cipher=Cipher.getInstance("AES");//7.初始化密碼器,第一個(gè)參數(shù)為加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二個(gè)參數(shù)為使用的KEYcipher.init(Cipher.DECRYPT_MODE, key);//8.將加密并編碼后的內(nèi)容解碼成字節(jié)數(shù)組byte [] byte_content= new BASE64Decoder().decodeBuffer(content);/** 解密*/byte [] byte_decode=cipher.doFinal(byte_content);String AES_decode=new String(byte_decode,"utf-8");return AES_decode;} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}//如果有錯(cuò)就返加nulllreturn null;}}(4)Skey_AES代碼(AES調(diào)用代碼)
import java.io.*; import javax.crypto.*; public class Skey_AES{public static void main(String args[]) throws Exception{KeyGenerator kg=KeyGenerator.getInstance("AES");kg.init(128);SecretKey k=kg.generateKey( );FileOutputStream f=new FileOutputStream("key1.dat");ObjectOutputStream b=new ObjectOutputStream(f);b.writeObject(k);} }注: Encoder代碼和Skey_AES代碼為參考網(wǎng)上的代碼,在運(yùn)行ServerOne代碼和ClientOne代碼前應(yīng)先運(yùn)行Skey_AES代碼,任然需要MyDC代碼與MyBC代碼。
3.實(shí)驗(yàn)截圖:
(1)服務(wù)器端截圖:
(2)客戶端截圖:
4.碼云鏈接:
https://gitee.com/zzm-zcc/zhang_zhi_min/commit/c3d15a343490157a6c1eda6e6c102c2590fa526b
四、實(shí)驗(yàn)五 網(wǎng)絡(luò)編程與安全-4
1.實(shí)驗(yàn)要求:
密鑰分發(fā)結(jié)對(duì)編程:1人負(fù)責(zé)客戶端,一人負(fù)責(zé)服務(wù)器;
(1)注意責(zé)任歸宿,要會(huì)通過(guò)測(cè)試證明自己沒有問(wèn)題;
(2)基于Java Socket實(shí)現(xiàn)客戶端/服務(wù)器功能,傳輸方式用TCP;
(3)客戶端讓用戶輸入中綴表達(dá)式,然后把中綴表達(dá)式調(diào)用MyBC.java的功能轉(zhuǎn)化為后綴表達(dá)式,把后綴表達(dá)式用3DES或AES算法加密通過(guò)網(wǎng)絡(luò)把密文發(fā)送給服務(wù)器;
(4)客戶端和服務(wù)器用DH算法進(jìn)行3DES或AES算法的密鑰交換;
(5)服務(wù)器接收到后綴表達(dá)式表達(dá)式后,進(jìn)行解密,然后調(diào)用MyDC.java的功能計(jì)算后綴表達(dá)式的值,把結(jié)果發(fā)送給客戶端;
(6)客戶端顯示服務(wù)器發(fā)送過(guò)來(lái)的結(jié)果;
(7)上傳測(cè)試結(jié)果截圖和碼云鏈接;
2.實(shí)驗(yàn)過(guò)程:
(1)Key_DH代碼:
(2)KeyAgree代碼:
import java.security.PublicKey; import java.security.PrivateKey; import java.io.*; import javax.crypto.KeyAgreement; import javax.crypto.spec.*;public class KeyAgree{public static void main(String args[ ]) throws Exception{File file=new File("Sharekey.dat");// 讀取對(duì)方的DH公鑰FileInputStream f1=new FileInputStream("Apub.dat");ObjectInputStream b1=new ObjectInputStream(f1);PublicKey pbk=(PublicKey)b1.readObject( );//讀取自己的DH私鑰FileInputStream f2=new FileInputStream("Bpri.dat");ObjectInputStream b2=new ObjectInputStream(f2);PrivateKey prk=(PrivateKey)b2.readObject( );// 執(zhí)行密鑰協(xié)定KeyAgreement ka=KeyAgreement.getInstance("DH");ka.init(prk);ka.doPhase(pbk,true);//生成共享信息byte[ ] sb=ka.generateSecret();for(int i=0;i<sb.length;i++){System.out.print(sb[i]+",");}OutputStream out=new FileOutputStream(file);out.write(sb);out.close();SecretKeySpec k=new SecretKeySpec(sb,"AES");} }(3)ServerTwo代碼(服務(wù)器端):
import java.io.*; import java.net.*; public class ServerTwo {public static void main(String args[]) throws IOException{String sharekey="";int n=-1;byte [] a=new byte[128];try{ File f=new File("Sharekey.dat");InputStream in = new FileInputStream(f);while((n=in.read(a,0,100))!=-1) {sharekey=sharekey+new String (a,0,n);}in.close();}catch(IOException e) {System.out.println("File read Error"+e);}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(); //堵塞狀態(tài),除非有客戶呼叫out=new DataOutputStream(socketOnServer.getOutputStream());in=new DataInputStream(socketOnServer.getInputStream());String keyone =in.readUTF();//讀取被DH算法加密的密鑰String truekey = Encoder.AESDncode(sharekey,keyone);//使用共享密鑰對(duì)被加密的原密鑰解密。String secret =in.readUTF(); // in讀取信息,堵塞狀態(tài)System.out.println("服務(wù)器收到的信息:"+secret);String clear = Encoder.AESDncode(truekey,secret);//使用原密鑰解密表達(dá)式MyDC d=new MyDC();int answer=d.evaluate(clear);out.writeUTF(answer+"");System.out.println("服務(wù)器提供的解密:"+clear);Thread.sleep(500);}catch(Exception e) {System.out.println("客戶已斷開"+e);}} }(4)ClientTwo代碼(客戶端):
import java.io.*; import java.net.*; import java.util.Scanner;public class ClientTwo {public static void main(String args[]) throws Exception {String key1="";int n1=-1;byte [] a1=new byte[128];try{ File f=new File("key1.dat");InputStream in = new FileInputStream(f);while((n1=in.read(a1,0,100))!=-1) {key1=key1+new String (a1,0,n1);}in.close();}catch(IOException e) {System.out.println("File read Error"+e);}String sharekey="";int n=-1;byte [] a=new byte[128];try{ File f=new File("Sharekey.dat");InputStream in = new FileInputStream(f);while((n=in.read(a,0,100))!=-1) {sharekey=sharekey+new String (a,0,n);}in.close();}catch(IOException e) {System.out.println("File read Error"+e);}Socket mysocket;DataInputStream in=null;DataOutputStream out=null;System.out.println("請(qǐng)輸入算式:");Scanner scanner = new Scanner(System.in);String str = scanner.nextLine();//輸入算式MyBC b=new MyBC();str=b.result(str);String secret=Encoder.AESEncode(key1, str);//客戶端對(duì)表達(dá)式進(jìn)行加密key1 = Encoder.AESEncode(sharekey,key1);//客戶端對(duì)密鑰進(jìn)行DH加密try{ mysocket=new Socket("127.1.0.0",2010);in=new DataInputStream(mysocket.getInputStream());out=new DataOutputStream(mysocket.getOutputStream());out.writeUTF(key1);out.writeUTF(secret);String s=in.readUTF(); //in讀取信息,堵塞狀態(tài)System.out.println("客戶收到服務(wù)器的回答:"+s);Thread.sleep(50000);}catch(Exception e) {System.out.println("服務(wù)器已斷開"+e);}} }注:任然需要MyDC代碼與MyBC代碼和Encoder代碼,在運(yùn)行ServerTwo代碼和ClientTwo代碼前應(yīng)先運(yùn)行Key_DH代碼、再運(yùn)行KeyAgree代碼、最后運(yùn)行ServerTwo代碼和ClientTwo代碼。
3.實(shí)驗(yàn)截圖:
(1)運(yùn)行Key_DH代碼的截圖(需要通過(guò)命令行):
(2)運(yùn)行KeyAgree代碼的截圖:
(3)服務(wù)器端運(yùn)行截圖:
(4)客戶端運(yùn)行截圖:
4.碼云鏈接:
https://gitee.com/zzm-zcc/zhang_zhi_min/commit/bba1a88b5ede8025aeb19f22c4254300c2cee901
五、實(shí)驗(yàn)五 網(wǎng)絡(luò)編程與安全-5
1.實(shí)驗(yàn)要求:
完整性校驗(yàn)結(jié)對(duì)編程:1人負(fù)責(zé)客戶端,一人負(fù)責(zé)服務(wù)器;
(1)注意責(zé)任歸宿,要會(huì)通過(guò)測(cè)試證明自己沒有問(wèn)題;
(2)基于Java Socket實(shí)現(xiàn)客戶端/服務(wù)器功能,傳輸方式用TCP;
(3)客戶端讓用戶輸入中綴表達(dá)式,然后把中綴表達(dá)式調(diào)用MyBC.java的功能轉(zhuǎn)化為后綴表達(dá)式,把后綴表達(dá)式用3DES或AES算法加密通過(guò)網(wǎng)絡(luò)把密文和明文的MD5値發(fā)送給服務(wù)器;
(4)客戶端和服務(wù)器用DH算法進(jìn)行3DES或AES算法的密鑰交換;
(5)服務(wù)器接收到后綴表達(dá)式表達(dá)式后,進(jìn)行解密,解密后計(jì)算明文的MD5值,和客戶端傳來(lái)的MD5進(jìn)行比較,一致則調(diào)用MyDC.java的功能計(jì)算后綴表達(dá)式的值,把結(jié)果發(fā)送給客戶端;
(6)客戶端顯示服務(wù)器發(fā)送過(guò)來(lái)的結(jié)果;
(7)上傳測(cè)試結(jié)果截圖和碼云鏈接;
2.實(shí)驗(yàn)過(guò)程:
(1)DigestPass代碼:
(2)ServerThree代碼(服務(wù)器端):
import java.io.*; import java.net.*; public class ServerThree {public static void main(String args[]) throws IOException{String sharekey="";int n=-1;byte [] a=new byte[128];try{ File f=new File("Sharekey.dat");InputStream in = new FileInputStream(f);while((n=in.read(a,0,100))!=-1) {sharekey=sharekey+new String (a,0,n);}in.close();}catch(IOException e) {System.out.println("File read Error"+e);}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(); //堵塞狀態(tài),除非有客戶呼叫out=new DataOutputStream(socketOnServer.getOutputStream());in=new DataInputStream(socketOnServer.getInputStream());String keyone =in.readUTF();//讀取被DH算法加密的密鑰String truekey = Encoder.AESDncode(sharekey,keyone);//使用共享密鑰對(duì)被加密的原密鑰解密。String secret =in.readUTF(); // in讀取信息,堵塞狀態(tài)System.out.println("服務(wù)器收到的信息:"+secret);String mdClient=in.readUTF();System.out.println("客戶端提供的MD5為:"+ mdClient);String clear = Encoder.AESDncode(truekey,secret);//使用原密鑰解密表達(dá)式MyDC d=new MyDC();int answer=d.evaluate(clear);if((mdClient.equals(DigestPass.MD5(clear)))==true) {//判斷MD5值是否相等,若相等,則返回答案System.out.println("MD5值匹配");System.out.println("服務(wù)器提供的解密:" + clear);System.out.println("服務(wù)器解出密文的MD5為:" + DigestPass.MD5(clear));out.writeUTF(answer + "");}Thread.sleep(500);}catch(Exception e) {System.out.println("客戶已斷開"+e);}} }(3)ClientThree代碼(客戶端):
import java.io.*; import java.net.*; import java.util.Scanner;public class ClientThree {public static void main(String args[]) throws Exception {String key1="";int n1=-1;byte [] a1=new byte[128];try{ File f=new File("key1.dat");InputStream in = new FileInputStream(f);while((n1=in.read(a1,0,100))!=-1) {key1=key1+new String (a1,0,n1);}in.close();}catch(IOException e) {System.out.println("File read Error"+e);}String sharekey="";int n=-1;byte [] a=new byte[128];try{ File f=new File("Sharekey.dat");InputStream in = new FileInputStream(f);while((n=in.read(a,0,100))!=-1) {sharekey=sharekey+new String (a,0,n);}in.close();}catch(IOException e) {System.out.println("File read Error"+e);}Socket mysocket;DataInputStream in=null;DataOutputStream out=null;System.out.println("請(qǐng)輸入算式:");Scanner scanner = new Scanner(System.in);String str = scanner.nextLine();//輸入算式MyBC b=new MyBC();str=b.result(str);String secret=Encoder.AESEncode(key1, str);//客戶端對(duì)表達(dá)式進(jìn)行加密String md=DigestPass.MD5(str);//客戶端提供的MD5key1 = Encoder.AESEncode(sharekey,key1);//客戶端對(duì)密鑰進(jìn)行DH加密try{ mysocket=new Socket("127.1.0.0",2010);in=new DataInputStream(mysocket.getInputStream());out=new DataOutputStream(mysocket.getOutputStream());out.writeUTF(key1);out.writeUTF(secret);out.writeUTF(md);String s=in.readUTF(); //in讀取信息,堵塞狀態(tài)System.out.println("客戶收到服務(wù)器的回答:"+s);Thread.sleep(50000);}catch(Exception e) {System.out.println("服務(wù)器已斷開"+e);}} }注:任然需要MyDC代碼、MyBC代碼、Encoder代碼、Key_DH代碼和KeyAgree代碼,在運(yùn)行ServerThree代碼和ClientThree代碼前應(yīng)先運(yùn)行Key_DH代碼(與實(shí)驗(yàn)五 網(wǎng)絡(luò)編程與安全-4中相同)、再運(yùn)行KeyAgree代碼、最后運(yùn)行ServerThree代碼和ClientThree代碼。
3.實(shí)驗(yàn)截圖:
(1)服務(wù)器端截圖:
(2)客戶端截圖:
4.碼云鏈接:
https://gitee.com/zzm-zcc/zhang_zhi_min/commit/33995dbe0838b1eebdceff7f6bb1b8a6b86e3922
六、實(shí)驗(yàn)感想:
通過(guò)此次實(shí)驗(yàn),充分了解了各種加密算法的結(jié)構(gòu)與思想,也加深了密碼學(xué)的部分知識(shí),拓展了知識(shí)面。
轉(zhuǎn)載于:https://www.cnblogs.com/zzmzcc/p/10925810.html
總結(jié)
以上是生活随笔為你收集整理的实验五 网络编程与安全-----实验报告的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小缇娜的奇幻之地游戏多少钱
- 下一篇: 思维构造——cf1090D