20172328《程序設計與數據結構》實驗五 密碼學算法應用報告

20172328《程序設計與數據結構》實驗五 密碼學算法應用報告

課程:《程序設計與數據結構》
班級: 1723
姓名: 李馨雨
學號:20172328
實驗教師:王志強老師
實驗日期:2018年6月18日
必修選修: 必修html

1、實驗要求內容

  • 實驗1:
  1. 參考http://www.cnblogs.com/rocedu/p/6766748.html#SECDSA
  2. 結對實現中綴表達式轉後綴表達式的功能 Convert.java
  3. 結對實現從上面功能中獲取的表達式中實現後綴表達式求值的功能,調用Comparision.java
  4. 上傳測試代碼運行結果截圖和碼雲連接
  • 實驗2:
  1. 注意責任歸宿,要會經過測試證實本身沒有問題
  2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  3. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用Convert.java的功能轉化爲後綴表達式,把後綴表達式經過網絡發送給服務器
  4. 服務器接收到後綴表達式,調用Comparision.java的功能計算後綴表達式的值,把結果發送給客戶端
  5. 客戶端顯示服務器發送過來的結果
  6. 上傳測試結果截圖和碼雲連接
  • 實驗3:
  1. 注意責任歸宿,要會經過測試證實本身沒有問題
  2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  3. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用Convert.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密後經過網絡把密文發送給服務器
  4. 服務器接收到後綴表達式表達式後,進行解密(和客戶端協商密鑰,能夠用數組保存),而後調用Comparision.java的功能計算後綴表達式的值,把結果發送給客戶端
  5. 客戶端顯示服務器發送過來的結果
  6. 上傳測試結果截圖和碼雲連接
  • 實驗4:
  1. 注意責任歸宿,要會經過測試證實本身沒有問題
  2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  3. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用Convert.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文發送給服務器
  4. 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
  5. 服務器接收到後綴表達式表達式後,進行解密,而後調Comparision.java的功能計算後綴表達式的值,把結果發送給客戶端
  6. 客戶端顯示服務器發送過來的結果
  7. 上傳測試結果截圖和碼雲連接
  • 實驗5:
  1. 注意責任歸宿,要會經過測試證實本身沒有問題
  2. 基於Java Socket實現客戶端/服務器功能,傳輸方式用TCP
  3. 客戶端讓用戶輸入中綴表達式,而後把中綴表達式調用Convert.java的功能轉化爲後綴表達式,把後綴表達式用3DES或AES算法加密經過網絡把密文和明文的MD5値發送給服務器
  4. 客戶端和服務器用DH算法進行3DES或AES算法的密鑰交換
  5. 服務器接收到後綴表達式表達式後,進行解密,解密後計算明文的MD5值,和客戶端傳來的MD5進行比較,一致則調用Comparision.java的功能計算後綴表達式的值,把結果發送給客戶端
  6. 客戶端顯示服務器發送過來的結果
  7. 上傳測試結果截圖和碼雲連接

2、實驗過程及結果

  • 實驗1:實驗以前在四則運算中就已經實現了,直接運用已有成果。

  • 實驗2:和結對小夥伴分工,客戶端找到正確的服務器ip地址,並匹配相同的端口。
    客戶端負責讓用戶輸入中綴表達式並轉成後綴表達式傳給服務器,服務器經過字節流讀取,獲得相應的後綴表達式,再進行求值,把結果返回給客戶端。

  • 實驗3:先參考婁老師的博客,深刻理解對稱密鑰的用法以及如何將密鑰寫入到文件再用密鑰對後綴表達式進行加密,最後再將密文發送給服務器;服務器經過相同的密鑰進行解密,然後再利用後綴表達式求值的方法把結果求出返回給客戶端。

  • 實驗4:雙方各自創建本身的工鑰和私鑰,客戶端獲取本身的私鑰和對方的公鑰對同一段後綴表達式進行加密,加密後傳給服務器,服務器用本身的私鑰和對方的公鑰對其進行解密,然後對解密後的後綴表達式進行求值再返回給客戶端。
  • 須要注意的幾點:
    • 若A和B之間想祕密傳送大量數據,一方(如A)先建立公私鑰對,公鑰對外公佈,另外一方(如B)建立對稱密鑰,而後使用A的公鑰加密對稱密鑰,傳遞給A,A收到後用本身的私鑰解密,獲得對稱密鑰,之後A和B之間就可使用對稱密鑰加密通訊了。
    • 使用密鑰協定來交換對稱密鑰。執行密鑰協定的標準算法是DH算法(Diffie-Hellman算法)。
    • Java中KeyAgreement類實現了密鑰協定,它使用init( )方法傳入本身的私鑰,使用doPhase( )方法傳入對方的公鑰,進而可使用generateSecret( )方法生成共享的信息

  • 實驗5:只須要選定指定字符串,再使用Java計算指定字符串的消息摘要。要注意的幾點就是:
    • MessageDigest類也是一個工廠類,其構造器是受保護的,不容許直接使用new MessageDigist( )來建立對象,而必須經過其靜態方法getInstance( )生成MessageDigest對象。其中傳入的參數指定計算消息摘要所使用的算法,經常使用的有"MD5","SHA"等。
    • m.update(x.getBytes("UTF8" ));
      x爲須要計算的字符串,update傳入的參數是字節類型或字節類型數組,對於字符串,須要先使用getBytes( )方法生成字符串數組。

3、實驗過程當中遇到的問題和解決過程

  • 1.在作第三個小實驗的時候遇到BadPaddingException.當時去查獲得:若是傳給解密dofinal方法的參數是普通的一個字符串產生的byte數組,那麼就會拋出
    javax.crypto.badpaddingexception: data must start with zero
    java

  • 問題1的解決:檢查了一下,果真是傳給解密子句的byte數組出了問題,讓傳入正確的已加密數組便可。
  • 2.在作實驗3時我和結對夥伴討論的第一個思路是雙方既定密鑰,讓服務器生成密鑰,而後經過其餘途徑告訴客戶端,在客戶端中用Scanner讓用戶輸入密鑰,繼而在客戶端中把中綴表達式轉成後綴表達式而後加密再發給服務器,讓服務器去解密然後計算後綴表達式的值再把值發給客戶端。可是沒有考慮到每運行一次密鑰都會有所差別,而且也長度很長很難輸入。在寫這段代碼時,咱們遇到的錯誤是如何把客戶端輸入的一串密鑰編程key型,由於咱們要給明文加密,須要key型的密鑰。
  • 問題2的解決:郭愷同窗解決的這個問題,用代碼算法

KeyGenerator kg = KeyGenerator.getInstance("DES");
Key key = kg.generateKey();
byte[] keyBytes = key.getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "DES");
  • 3.在作實驗4使用DH算法加密,遇到了許多問題,其中一個就是下面的只複製忘記思考的命令行問題!
    編程

  • 問題3的解決:用 Key_DH文件分別生成文件Apub.dat和Apri.dat,前者保存着A的公鑰,後者保存着A的私鑰;Bpub.dat和Bpri.dat,前者保存着B的公鑰,後者保存着B的私鑰。這樣的話就能夠將arg[0]和arg[1]換成相應的文件啦。
    數組

  • 4.不正確的祕鑰長度!To be honest,看到的時候真的沒有什麼解決的頭緒。
    服務器

  • 問題4的解決:詢問了王文彬同窗,通過提點是由於我直接建立的密鑰有128位,可是後面要用的3DES算法只須要24位密鑰(這個我沒查到(◎_◎),而後辦法就是要不變成符合我祕鑰長度的算法、要不縮短個人祕鑰長度,知足24位的要求。
    • 變成符合我祕鑰長度的算法,用AES算法試了試,(畢竟資料裏面有說過如果「AES」,能夠是128, 192或256位),結果出現:
      網絡

    • 縮短個人祕鑰長度:王文彬同窗提醒我能夠看看SecretKeySpec的JDK文檔,果真找到了制勝法寶,噔噔噔噔!
      數據結構

因而就解決了啊。
測試

其餘(感悟、思考等)

此次實驗在密碼學方面有所擴充,讓我對對稱密碼、分組密碼、非對稱密碼的算法總有了一點了解。加密

國際上竊密和反竊密鬥爭的焦點,將永遠是互相徵收和破譯密碼,因此說密碼涉及數學、通訊學、信息學、計學、邏輯學等多門課程,是高新知識和技術的系統集成,是很是有深度的一門知識啊。

4、參考資料

相關文章
相關標籤/搜索