2012-04-18 53 views
3

我想要加密的字符串,它的一部分是XOR運算IV字符串文本。 具有計算器一些困難,我結束了在那裏一個人給了下面的代碼後:XOR兩個字符串在JAVA

import sun.misc.BASE64Decoder; 
import sun.misc.BASE64Encoder; 
import java.io.IOException; 

public class StringXORer { 

public String encode(String s, String key) { 
    return base64Encode(xorWithKey(s.getBytes(), key.getBytes())); 
} 

public String decode(String s, String key) { 
    return new String(xorWithKey(base64Decode(s), key.getBytes())); 
} 

private byte[] xorWithKey(byte[] a, byte[] key) { 
    byte[] out = new byte[a.length]; 
    for (int i = 0; i < a.length; i++) { 
     out[i] = (byte) (a[i]^key[i%key.length]); 
    } 
    return out; 
} 

private byte[] base64Decode(String s) { 
    try { 
     BASE64Decoder d = new BASE64Decoder(); 
     return d.decodeBuffer(s); 
    } catch (IOException e) {throw new RuntimeException(e);} 
} 

private String base64Encode(byte[] bytes) { 
    BASE64Encoder enc = new BASE64Encoder(); 
    return enc.encode(bytes).replaceAll("\\s", ""); 

} 
} 

似乎除了2個問題需要解決: 結果字符串變得更長。當試圖在「abcdefgh」和「abcdefgh」之間進行XOR時,我得到:「aaaaaaaaaaaa」。 其次,兩個相同的字符串的結果爲「AAAA ......」 - 「一」 S串....

所以這兩個問題是:

  1. 爲什麼導致字符串變長?
  2. 爲什麼相同字符串之間異或的結果由「a」列表組成?

這是功課,得到任何幫助。

Thanx!

+0

爲什麼......你使用'sun.misc.BASE64Decoder'? – trutheality 2012-04-18 19:27:45

+0

我不是。它帶有代碼,所以我把它留在那裏,直到確定我不需要它。 – 2012-04-18 19:51:47

+0

也許這將幫助你:http://stackoverflow.com/questions/1205135/how-to-encrypt-string-in-java – yegor256 2012-12-26 16:01:29

回答

2

字符串變長,因爲除了與鑰匙進行異或,它是Base64編碼。

,以獲得原始字符串進行異或與new String(...)base64Decode(s)s.getBytes()更換呼叫base64Encode(...)。但請注意,打印時編碼的字符串看起來不太好。與本身異或的字符串將由\0個字符組成,這些字符以空格形式打印。

即使改變之後,有可能的是getBytes()返回一個字節數組長於所述串列長度,依賴於平臺默認字符集。例如。 UTF-8會將字符> = 128編碼爲兩個或三個字節。使用ISO-8859-1作爲字符與字符的一一對應的字符集< = 255和字節。同樣,new String(...)可能無法產生預期字符,因爲給定的字節對於平臺默認編碼無效。

+0

我做了什麼,你告訴我,這工作,但經過30輪壞了。我想補充的截圖,但不知道怎麼做,在這裏,所以我上傳的截圖zip文件: http://www.2shared.com/file/O4B5MctP/steps.html 你可以看到有回合數。 在第50輪左右,它變得太慢了,而且在我得到一些記憶錯誤之後 - 這就是爲什麼我首先提出這個問題的原因。 有什麼想法發生了什麼? 順便說一句,IV在CBC加密方案中不斷變化(XOR的結果成爲新的IV)。 – 2012-04-18 19:49:29

+0

你可以檢查加密,然後用相同的密鑰解密字符串產生原始的字符串?如果失敗了,你可能需要用'getBytes()'和'new String()'方法來指定charSet'「ISO-8859-1」'。請教JavaDoc如何做到這一點。 – 2012-04-18 20:05:08

+0

它確實產生了原始字符串。 Thanx的幫助。 – 2012-04-20 09:09:45