2013-02-25 27 views
0

我已經提供了有關加密的具體步驟,它基本上將字符串轉換爲字節數組,並將每個字節數組元素與特定數字「異或」並將其轉換新的字節數組轉換爲字符串。Java - 使用XOR解密的字符串不生成原始/加密的字符串

至於解密我重新將解密的字符串轉換爲字節數組,將每個元素與加密中使用的數字異或,並將新的解密數組轉換爲字符串,以給出我開始的確切字符串用。

不幸的是,我無法獲得我開始使用的字符串,例如,當我試圖加密6,7,8,9,10解密返回B @ 722b9406不是6,7,8,9,10。任何想法爲何如此?

我的加密代碼如下:

//Take each array element and do "Exclusive or" with "50" 
public void XORUnencryptedByteArray() { 
    System.out.println("\nPART 3:\nXORUnencryptedByteArray() - " + "UnencryptedStringAsByteArray.length IS: " + UnencryptedStringAsByteArray.length); 

    byte[] UnencryptedByteArraybyXOR = new byte[UnencryptedStringAsByteArray.length]; 

    int XOR_Value = 50; 

    byte XOR_Value_as_byte = (byte) XOR_Value; 

    System.out.println("\nPART 3:\nXORUnencryptedByteArray() - " + "XOR_Value_as_byte IS: " + XOR_Value_as_byte + "\n"); 

    for (int j = 0; j < UnencryptedStringAsByteArray.length; j++) { 

     System.out.println("\nPOSITION " + j + " OF UnencryptedStringAsByteArray[j] CONTAINS: " + UnencryptedStringAsByteArray[j]); 

     System.out.println("\n" + UnencryptedStringAsByteArray[j] + "^" + XOR_Value_as_byte + " IS: " + (UnencryptedStringAsByteArray[j]^XOR_Value_as_byte)); 

    } 

      for (int i = 0; i < UnencryptedByteArraybyXOR.length; i++) { 

        UnencryptedByteArraybyXOR[i] = (byte) (UnencryptedStringAsByteArray[i]^XOR_Value_as_byte); 

       System.out.println("\nPOSITION " + i + " OF UnencryptedByteArraybyXOR[i] IS: " + UnencryptedByteArraybyXOR[i]);  
      } 

    //Collect all encrypted array elements and convert the byte array to string 
    System.out.println("\nUnencryptedByteArraybyXOR.length IS: " + UnencryptedByteArraybyXOR.length); 

    System.out.println("\nUnencryptedByteArraybyXOR.toString() AS STRING IS: " + UnencryptedByteArraybyXOR.toString()); 

    UnencryptedByteArraybyXORAsString = new String(UnencryptedByteArraybyXOR); 

    //System.out.println("\nUnencryptedByteArraybyXORAsString IS: " + UnencryptedByteArraybyXORAsString); 

    WriteStringToFile(UnencryptedByteArraybyXOR.toString()); 


} 

public void WriteStringToFile(String UnencryptedByteArraybyXORAsString) { 
     try { 
      String str = UnencryptedByteArraybyXORAsString; 
      File newTextFile = new File("/Users/anmonari/Desktop/textfile.txt"); 

      FileWriter fw = new FileWriter(newTextFile); 
      fw.write(str); 
      fw.close(); 

     } catch (IOException iox) { 
      //do stuff with exception 
      iox.printStackTrace(); 
     } 

} 

我解密的代碼如下:

public void XORDecryptedByteArray(byte[] encryptedStringAsByteArray) { 

    System.out.println("\nXORencryptedByteArray() - " + "encryptedStringAsByteArray.length IS: " + encryptedStringAsByteArray.length); 

    byte[] encryptedByteArraybyXOR = new byte[encryptedStringAsByteArray.length]; 

    int XOR_Value = 50; 

    byte XOR_Value_as_byte = (byte) XOR_Value; 

    System.out.println("\nXORencryptedByteArray() - " + "XOR_Value_as_byte IS: " + XOR_Value_as_byte + "\n"); 

    for (int j = 0; j < encryptedStringAsByteArray.length; j++) { 

     System.out.println("\n" + encryptedStringAsByteArray[j] + "^" + XOR_Value_as_byte + " IS: " + (encryptedStringAsByteArray[j]^XOR_Value_as_byte)); 

    } 

      for (int i = 0; i < encryptedByteArraybyXOR.length; i++) { 

        encryptedByteArraybyXOR[i] = (byte) (encryptedStringAsByteArray[i]^XOR_Value_as_byte); 

        System.out.println("\n" + "POSITION " + i + " OF encryptedByteArraybyXOR[i] CONTAINS: " + encryptedByteArraybyXOR[i]);  
      } 

    System.out.println("\ndecryptedByteArraybyXOR.length IS: " + encryptedByteArraybyXOR.length); 

    System.out.println("\ndecryptedByteArraybyXOR.toString() AS STRING IS: " + encryptedByteArraybyXOR.toString()); 

} 

的任何援助表示讚賞!!!!!

+0

是否有一個原因,你不只是使用[KeyCzar](http://www.keyczar.org/)爲您的加密需求? – 2013-02-25 15:29:30

回答

3

這是主要的問題:

UnencryptedByteArraybyXORAsString = new String(UnencryptedByteArraybyXOR); 

,好像它是一個字符串,你處理任意的二進制數據。不是。你一定不能從字節數組中創建一個新的字符串,它不是實際上是編碼的二進制數據。

如果您確實想要以可逆方式將任意字節數組轉換爲字符串,請使用base64。

此外,當您打印出一個字節數組時,只需調用toString就可以得到確切的值,例如「B @ 722b9406」。這不是數據丟失的問題 - 它只是數組轉換爲字符串的方式。使用Arrays.toString(byte[])執行更有用的轉換。

最後,我希望你沒有打算將這個「加密」用於任何敏感的東西 - 這是最好的混淆。

+0

很高興看到歷史悠久的Jon Skeet與方法的鏈接編碼一起奮鬥有時:) +1當然 – 2013-02-25 17:30:05

+0

@owlstead:在我擊Ctrl-L之前沒事了:) – 2013-02-25 17:37:26