這是這學期最後一次實驗了,也是學到了不少東西,但願本身能夠能夠有始有終,加油! 讓咱們開始這一篇博客吧!php
課程:《程序設計與數據結構》
班級: 1723
姓名: 王文彬
學號:20172329
實驗教師:王志強
實驗日期:2018年6月11日
必修/選修: 必修html
一、網絡編程與安全-1java
二、網絡編程與安全-2web
三、網絡編程與安全-3算法
四、網絡編程與安全-4編程
五、網絡編程與安全-5數組
一、網絡編程與安全-1安全
結果:服務器
二、網絡編程與安全-2網絡
1、客戶端
//1.創建客戶端Socket鏈接,指定服務器位置和端口 Socket socket = new Socket("127.0.0.1",8880); //2.獲得socket讀寫流 OutputStream outputStream = socket.getOutputStream(); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream); //輸入流 InputStream inputStream = socket.getInputStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
//3.利用流按照必定的操做,對socket進行讀寫操做 Scanner scan = new Scanner(System.in); System.out.println("我輸入的中綴表達式爲: "); String a =scan.nextLine(); Calculate p =new Calculate(); String temp = ""; for (int x = 0; x < p.parse(p.zb(a)).size(); ++x) { temp = temp + p.parse(p.zb(a)).get(x); } String info1 = temp; String info = new String(info1.getBytes("GBK"),"utf-8"); outputStreamWriter.write(info); outputStreamWriter.flush(); socket.shutdownOutput();
//接收服務器的響應 String reply = null; while (!((reply = bufferedReader.readLine()) ==null)){ System.out.println("接收服務器的信息爲:" + reply); }
2、服務器
//1.創建一個服務器Socket(ServerSocket)綁定指定端口 ServerSocket serverSocket=new ServerSocket(8880); //2.使用accept()方法阻止等待監聽,得到新鏈接 Socket socket=serverSocket.accept(); //3.得到輸入流 InputStream inputStream=socket.getInputStream(); BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF-8")); //得到輸出流 OutputStream outputStream=socket.getOutputStream(); PrintWriter printWriter=new PrintWriter(outputStream); //4.讀取用戶輸入信息 String info=null; while(!((info = bufferedReader.readLine()) ==null)){ System.out.println("我是服務器,用戶信息爲:" + info);
//給客戶一個響應 Calculate a = new Calculate(); String str=info; String[] temp = str.split(" "); List<String> ls= Arrays.asList(temp); String reply=String.valueOf(a.suanshu(ls)); printWriter.write(reply); printWriter.flush();}
結果:
三、網絡編程與安全-3
客戶端:
public class Skey_DES{ public static void main(String args[]) 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); } }
public class Skey_kb{ public static void main(String args[]) 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); // 打印密鑰編碼中的內容 for(int i=0;i<kb.length;i++){ System.out.print(kb[i]+","); } } }
FileInputStream f=new FileInputStream("key1.dat"); ObjectInputStream b=new ObjectInputStream(f); Key k=(Key)b.readObject( ); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext[]=s.getBytes("UTF8"); for(int i=0;i<ptext.length;i++){ System.out.print(ptext[i]+","); } System.out.println(""); byte ctext[]=cp.doFinal(ptext); String a=""; for(int i=0;i<ctext.length;i++){ a+=ctext[i] +","; // System.out.print(a); } FileOutputStream f2=new FileOutputStream("SEnc.dat"); f2.write(ctext); return a;
服務器:
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); // 顯示明文 String p=new String(ptext,"UTF8");
結果:
四、網絡編程與安全-4
FileInputStream f1=new FileInputStream("Bpub.dat"); ObjectInputStream b1=new ObjectInputStream(f1); PublicKey pbk=(PublicKey)b1.readObject( ); //讀取本身的DH私鑰 FileInputStream f3=new FileInputStream("Apri.dat"); ObjectInputStream b2=new ObjectInputStream(f3); PrivateKey prk=(PrivateKey)b2.readObject(); // 執行密鑰協定 KeyAgreement ka=KeyAgreement.getInstance("DH"); ka.init(prk); ka.doPhase(pbk,true); //生成共享信息 byte[ ] sb=ka.generateSecret(); SecretKeySpec k = new SecretKeySpec(sb, 0,24,"DESede"); Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.ENCRYPT_MODE, k); byte ptext[]=s.getBytes("UTF8"); byte ctext[]=cp.doFinal(ptext); String a=""; for(int i=0;i<ctext.length;i++){ a+=ctext[i] +","; // System.out.print(a); } FileOutputStream f2=new FileOutputStream("SEnc.dat"); f2.write(ctext); return a;
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( ); // 執行密鑰協定 KeyAgreement ka=KeyAgreement.getInstance("DH"); ka.init(prk); ka.doPhase(pbk,true); //生成共享信息 byte[ ] sb=ka.generateSecret(); SecretKeySpec k=new SecretKeySpec(sb,0,24,"DESede"); // 解密 Cipher cp=Cipher.getInstance("DESede"); cp.init(Cipher.DECRYPT_MODE, k); byte []ptext=cp.doFinal(ctext); // 顯示明文 String p=new String(ptext,"UTF8"); // System.out.println(p);
結果:
五、網絡編程與安全-5
public String Diget(String x) throws UnsupportedEncodingException, NoSuchAlgorithmException { MessageDigest m=MessageDigest.getInstance("MD5"); m.update(x.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); } return result; }
DigestPass ooo=new DigestPass(); String reply; if (ww.equals(ooo.Diget(p))) { reply= String.valueOf(a.suanshu(ls)); } else { reply="返回的MD5值不一樣"; }
結果:
split
的方法,咱們能夠利用這個方法把這兩個字符串用一個字符進行切分,而後分別保存,好比「String aa =A;B
」,咱們用String []bb =aa.split";";
就能夠將其分紅bb[0]
和bb[1]
這樣就把兩個東西都傳遞過去了。其次就是第二種方式,我相信第二種方式不用太過去強調,我認爲是我的應該都會的,並且最開始想到的辦法確定也是這一種方法。
問題2解決方案:
String info=null; String str1=""; while(!((info = bufferedReader.readLine()) ==null)){ System.out.println("我是服務器,用戶信息爲:" + info); str1=info;}
String info=null; while(!((info = bufferedReader.readLine()) ==null)){ System.out.println("我是服務器,用戶信息爲:" + info); }
咱們須要區分這兩個代碼的區別,運用第二個會出現報錯,出現空指針,由於第二個代碼的info是直到它爲空纔會跳出這個循環,天然會拋出空指針的異常。
SecretKeySpec k =new SecretKeySpec(sb,"DESede");
能夠實現,首先咱們的目的是想要把那個128的密鑰只取24位,所以咱們查找了API文檔SecretKeySpec k=new SecretKeySpec(sb,0,24,"DESede");
,問題也就能夠解決了。這一學期立刻就要結束了,不少人如今也都已經開始放飛自我了,端午這三天,本身決定本身的收穫仍是很是大的,最近的幾回編程,我以爲我學習Java的熱情又回來了,而後我發現API真是個好東西,就像一本字典同樣,並且講解的都很是詳細,但願本身能夠堅持下去,本身立的flag,必定要作到!
藍墨雲班課
2016-2017-2 《Java 程序設計》課堂實踐項目
Java 密碼學算法
JAVA加解密DH算法
3DES自定義密鑰問題
JAVA實現DES加密實現詳解
多線程方式實現Socket通訊
TCP