2009-10-19 118 views
8

我有一個客戶端和服務器的Java應用程序,需要加密文本相互傳遞。我正在使用XOR加密來加密我想要的文本。Java字符串bytearray回字符串

問題是,readline()不接受已經異或的字符串,並且只有在以字節爲單位接受時纔會被接受。

所以我已經將我的明文(字符串)轉換爲客戶端的一個字節數組,並嘗試將其轉換回服務器端的字符串。

不幸的是,我所尋找的結果仍然是亂碼,而不是我尋找的明文。

有誰知道如何使字節碼更改回原始字符串?或者是否有更好的方法通過readline()函數發送XOR加密文本?

回答

19

在應用了XOR之類的東西之後,最終會得到任意的二進制數據 - 而不是的編碼字符串。

將任意二進制轉換爲文本的常規安全方法是使用base64 - 不要嘗試從中創建一個新字符串。所以你的過程將是這樣的:

  • 以純文本開頭爲字符串。
  • 使用UTF-8,UTF-16或類似的東西對純文本進行編碼。 不要使用平臺的默認編碼,或者像ASCII這樣的任何限制。你現在有一個字節數組。
  • 應用您的加密。 (XOR很弱,但讓我們把它留在一邊。)你還有一個字節數組。
  • 應用base64編碼來獲取字符串。

然後,當你需要解密...

  • 應用的base64 解碼將字符串轉換成字節數組。
  • 應用您的二進制解密過程(例如再次XOR)。你仍然有一個字節數組。
  • 現在將該字節數組解碼爲一個字符串,例如,用new String(data, utf8Charset)找回原始字符串。

有各種Java base64庫可用,如this classApache Commons Codec。 (你想要encodeToString(byte[])decode(String)方法。)

+0

+1答案。 @ NewJavaProgrammer- base64也沒有加密,但它是編碼的。 – RichardOD 2009-10-19 06:58:01

+1

@RichardOD - 實際上@ Jon的方法生成的base64都是編碼和加密的。 – 2009-10-19 07:06:16

+0

是的 - 我以某種方式沒有看到「應用您的加密」位。一大早! – RichardOD 2009-10-19 07:25:34

1

首先,不要調用XORing加密。嚴重的是,如果你需要保護你的數據,CipherOutputStream和CipherInputStream在你身邊。

感謝流鏈接,你可以有DataOutputStream - > CipherOutputStream - > ByteArrayOutputStream。這將使您得到正確加密的字節。在另一端使用反向API,你會得到你的字符串。