2015-11-04 72 views
-1

轉換字符串到字節和返回是不同的。我用來加密/解密DES,當我通過服務器recive一個字符串時,服務器make toString(),我做myString.getByte解密。解密不起作用,因爲輸入長度必須是使用填充密碼解密時的8的倍數......任何人都可以幫助我。謝謝。 服務器:字符集編碼toString到getbyte

String keySession=DesKeySession.toString(); 
    String Message=keySessione+"1.1.1.1"; 
     byte [] text=(Message).getBytes(); 

      // Encrypt the text 
     byte[] textEncrypted = desCipher.doFinal(text); 
     String StringtextEncrypted = textEncrypted.toString(); 
     OutLista.InsertTail(StringtextEncrypted); 
//list to send client with all information 
outToClient.writeObject(OutLista); 

客戶:

 String mesage=listaFromServer.DeleteTail(); 


     byte [] messaggioKab=(message).getBytes();   

     // Initialize the same cipher for decryption 
      desCipher.init(Cipher.DECRYPT_MODE, myDesKey); 


     // Decrypt the text 
      byte[] textDecrypted = desCipher.doFinal(messaggioKab);//error 
+2

編輯您的問題以包含將字符串轉換爲字節和從字節轉換的代碼。 – VGR

+0

我做了更改。 – hesse

回答

0

有兩個問題在這裏:

  1. 您沒有正確轉換爲字節數組爲String。你必須使用new String,而不是toString()。
  2. 在C中,您可以使用字符串來保存字節。在Java中,你不能,因爲不是每個字節都是一個字符的有效表示。

這兩個問題給此線是由於:

String StringtextEncrypted = textEncrypted.toString(); 

在Java中,所有的原始陣列直接延伸java.lang.Object中。這樣的數組不需要定義一個toString方法,這意味着每個基本數組都繼承the toString method of Object,對於字節數組通常產生類似於「[B @ 19de8a6f89」的東西。

因此,您不能使用toString()將字節數組轉換爲字符串。您必須直接創建一個字符串:

String stringtextEncrypted = new String(textEncrypted); 

然而,這是不是安全除非你知道你的字節實際上代表了Charset編碼的字符。您的字節不會以字符集編碼 - 它們是加密操作的結果。在字符串中存儲任意字節是不安全的,因爲根據用於解碼它們的字符集,字節可能包含無效序列,並且這樣的無效序列將被自動替換爲指定的「無效序列」字符如新的字符串中的?。由於客戶端和服務器可能沒有相同的默認字符集,但以上問題需要使用,因爲您沒有明確指定;所使用的實際字符集是平臺的默認字符集,這是您的代碼的另一個問題首先要糾正)。

簡而言之,你不能安全地使用一個字符串來保存你的加密字節。但是,由於byte[]是Object的一個子類,因此您始終可以將加密的字節數組本身放入列表中。所有原始數組都是可序列化的。

順便說一下,在Java中的約定是所有的變量名和方法名以小寫字母開始(除了靜態最終變量,通常是常量)。您應該使用像messageinsertTaildeleteTail這樣的名稱。

+0

我認爲使用編碼base64 .. – hesse