2015-05-28 33 views
1

我想創建一個功能性的Java聊天應用程序。 因此,我有一個小應用程序,它允許用戶通過服務器類進行連接,並通過客戶端類相互交談,並且我已經開始添加加密。我無法在我的Java聊天應用程序中解密來自其他客戶端的輸出。如何在java中解密(包括我的代碼片段)

有人可以幫我嗎?

的我的代碼段包含如下:

THE CLIENTGUI.JAVA CLASS(加密是一個按鈕被點擊)

if(o == encrypt) { 

     String change = null; 
     try{ 
      change = tf.getText(); 
      change = FileEncryption.encryptString(change); 
      tf.setText("" + change); 

      return; 
     } catch (Exception e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     finally{ 
     } 

THE FILEENCRYPTION.JAVA

public class FileEncryption { 

    //Initial Vector 
    public static final byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };  

    //EncryptAndDecrypt String -> Input : PlainText + Return : CipherText+DecipherText 
    public static String encryptString(String src) throws Exception 
    { 
     String dst=""; 
     //Not Input! 
     if(src == null || src.length()==0) 
      return ""; 

     //Encryption Setting 
     byte[] k="Multimediaproces".getBytes(); 
     SecretKeySpec Key = new SecretKeySpec(k,"AES"); 
     IvParameterSpec ivspec = new IvParameterSpec(iv); 
     Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     encryptCipher.init(Cipher.ENCRYPT_MODE,Key,ivspec); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     CipherOutputStream cout = new CipherOutputStream(baos,encryptCipher); 
     cout.write(src.getBytes()); 
     cout.flush();    //ByteOutputStream -> Write Encryption Text 
     cout.close();   
    // in encrypt method 
     dst = DatatypeConverter.printHexBinary(baos.toByteArray()); 
     return dst; 
    } 

    //String src -> EncryptedData 
    public static String decryptString(String src) throws Exception 
    { 
     //src value is Encrypted Value! 
     //So, src value -> Not Byte! 
     String dst=""; 
     byte[] encryptedBytes = DatatypeConverter.parseHexBinary(src);;   
     //Not Input! 
     if(src == null || src.length()==0) 
      return "";   
     //Decryption Setting 
     IvParameterSpec ivspec = new IvParameterSpec(iv); 
     byte[] k="Multimediaproces".getBytes(); 
     SecretKeySpec Key = new SecretKeySpec(k,"AES"); 
     Cipher decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     decryptCipher.init(Cipher.DECRYPT_MODE,Key,ivspec); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     ByteArrayInputStream bais = new ByteArrayInputStream(encryptedBytes); 
     CipherInputStream cin = new CipherInputStream(bais,decryptCipher); 
     byte[] buf = new byte[1024]; 
     int read; 
     while((read=cin.read(buf))>=0) //reading encrypted data! 
     { 
      baos.write(buf,0,read);  //writing decrypted data! 
     } 

     // closing streams 
     cin.close(); 
     dst = new String(baos.toByteArray()); 
     return dst; 
    } 
} 

問題是當我試圖解密輸入以下代碼的代碼: if(o == decrypt){

  try{ 
       msg = tf.getText(); 
       msg = FileEncryption.decryptString(msg); 
       fop. 
      } catch (Exception e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      }finally{ 

      } 

目前,它允許我加密輸入到文本字段中的內容。

它不允許我解密用戶在聊天中所說的內容。我所包含的用於解密的當前代碼不起作用。

任何人都可以幫助我嗎?或者對我的程序有任何建議可以幫助解密?

感謝

編輯:

currently this is what my application looks like. The window at the bottom is the Server class where it can show who is logged in etc. the top left shows the client chat for me 'Harry'. in the text box shows when i have clicked the encrypt button. however, clicking the decrypt button does not work

+1

'fop.'不是一個有效的Java語句。你的實際代碼是什麼? – immibis

+0

測試你的加密和解密方法似乎對我來說很好......我想知道是否對當前機器有某種依賴性? – MadProgrammer

+0

啊道歉,fop。不是這個的一部分。解密位有點寫我看起來沒有用。 –

回答

1

您最好的選擇可能是簡單地使用SSL插座爲您的網絡通訊,而不是自己編寫的加密代碼。雖然你的問題是不完全這樣一個的副本,你很可能得到很好的被這裏的答案服務:

Secret Key SSL Socket connections in Java

+0

這是假設OP的目的是做些東西供使用,而不是學習一些基本的密碼學。 – immibis

+1

TLS/SSL也有一些要求(證書...),如果您不知道密碼是如何工作的,那麼這些要求就沒有意義。 – immibis

+0

確實。如果他正在嘗試學習密碼技術,學習TLS/SSL將是一個很好的開始。 –

1

我懷疑問題是不是經過2個客戶端之間的加密狀態。

如果「加密」對象是一個按鈕,那麼它只是客戶端 - 客戶端連接的一側的按鈕。您需要將加密狀態傳遞給另一個客戶端,以便知道解密該消息。

確認這一點的捷徑是在接收端自動顯示明文和解密消息。其中之一將永遠是胡言亂語,但它應該改變,取決於使用加密按鈕。

祝你好運:)

+0

您好格雷戈裏,因爲我在編程上相當業餘,所以我不太明白你的意思。 從我目前的理解,你已經說過,我需要從一邊發送加密的消息,並在接收端收到加密的消息。問題是,在接收方,解密仍然不起作用。該按鈕不起作用。我已經確認它可以被使用,使它在代碼之上更加真實......基本上,我想在文本字段中解密它,如果可能的話,或者任何方式...... –

+0

鑑於其他人似乎已經證實你加密/解密方法的工作,我的建議是「o ==解密」是問題。 我建議刪除測試並輸出所有消息的純文本和解密消息,以確保方法正在調用和工作。 –