2012-06-30 278 views
2

我有一個關於加密和解密的字符串問題加密和解密字符串

我必須通過網絡發送一個加密的字符串。(Android應用程序是客戶端),這是我做了什麼至今

byte[] input = getByteArray(filePath);//get the message stored in a file as a byte array 

通過一些教程去我設法字符串消息以一個字節數組和 使用javax.crypto中

Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); 

cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 

加密毫秒加密它g的retrived作爲一個字節數組

byte[] encrypted 

我甚至管理使用反向方法對其進行解密,並得到消息再次

但我的問題是當我嘗試將這個加密的字節數組,字符串(以通過它在網絡上) ,然後將其重新轉換爲一個字節數組

我tryed此

String encryptedStrn = new String(encrypted); // convert to string 

當我將其轉換爲字節數組由 byte [] enc = encryptedStrn.getBytes();

,並使用此ENC陣列解密,但輸出不正確地執行了。

我錯過了關於把一些基本的東西。請幫幫我。 在此先感謝

+1

請勿使用'encryptedStrn.getBytes()'。使用Base64編碼。 – CodesInChaos

+0

DES也相當薄弱。改用AES。 – CodesInChaos

+0

@CodeInChaos我在將字節轉換爲字符串時遇到了問題。 –

回答

4

由於CodeInChaos在評論中寫道,您不應該使用String(byte[])構造函數從不透明的二進制數據創建字符串。字符串的構造旨在用於已經使用類似ASCII的編碼編碼文本數據,UTF-8等不透明的二進制數據,例如加密,或圖像文件的結果,是不同一編碼文本數據方式,所以你最終失去了信息。

您應該使用base64代替,它將任意二進制數據編碼爲ASCII。有各種各樣的第三方庫,包括一個好的public domain one。另外,在Android上,您可以使用Base64類。

此外,甚至當你編碼或解碼真正的文字,你不應該使用String.getBytes()String(byte[])構造反正 - 他們所使用的平臺默認的編碼,這是幾乎總是錯誤的選擇。相反,您應該使用明確採用CharSet或字符編碼名稱的重載。 UTF-8通常是一個很好的編碼使用,如果你能控制兩端 - 如果你只控制一個結束,你需要知道哪些編碼的另一端期待。

+0

感謝您指點我正確的方向。您提供的信息對我非常有用 –

0

你應該使用Base64編碼的密文。不要將其轉換爲字符串。字符串不是二進制數據的容器。

0
public string EncryptUser(string userID) 
    { 
     using (var cryptoProvider = new DESCryptoServiceProvider()) 
     using (var memoryStream = new MemoryStream()) 
     using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(DESKey, DESInitializationVector), CryptoStreamMode.Write)) 
     using (var writer = new StreamWriter(cryptoStream)) 
     { 
      writer.Write(userID); 
      writer.Flush(); 
      cryptoStream.FlushFinalBlock(); 
      writer.Flush(); 
      return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length); 
     } 
    } 


    public string DecryptUserID(string userID) 
    { 
     using (var cryptoProvider = new DESCryptoServiceProvider()) 
     using (var memoryStream = new MemoryStream(Convert.FromBase64String(userID))) 
     using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(DESKey, DESInitializationVector), CryptoStreamMode.Read)) 
     using (var reader = new StreamReader(cryptoStream)) 
     { 
      return reader.ReadToEnd(); 
     } 
    }