2012-10-02 87 views
0

我有以下C++代碼來用XOR對字符串進行加密。將C++加密轉換爲Java

#define MPI_CIPHER_KEY "qwerty" 

Buffer FooClient::cipher_string(const Buffer& _landing_url) 
{ 
    String key(CIPHER_KEY); 
    Buffer key_buf(key.chars(), key.length()); 
    Buffer landing_url_cipher = FooClient::XOR(_url, key_buf); 

    Buffer b64_url_cipher; 
    base64_encode(landing_url_cipher, b64_url_cipher); 

    return b64_url_cipher; 
} 

Buffer FooClient::XOR(const Buffer& _data, const Buffer& _key) 
{ 
    Buffer retval(_data); 
    unsigned int klen=_key.length(); 
    unsigned int dlen=_data.length(); 
    unsigned int k=0; 
    unsigned int d=0; 

    for(;d<dlen;d++) 
    { 
     retval[d]=_data[d]^_key[k]; 
     k=(++k<klen?k:0); 
    } 

    return retval; 
} 

我看過this question這樣的java impl。對於這種情況會起作用嗎?

String s1, s2; 

StringBuilder sb = new StringBuilder(); 
for(int i=0; i<s1.length() && i<s2.length();i++) 
    sb.append((char)(s1.charAt(i)^s2.charAt(i))); 
String result = sb.toString(); 

還是有一個更簡單的方法來做到這一點?

回答

1

否 - java代碼只會異或到較小字符串的長度 - 而C++代碼將完全異或整個數據。 假設S1是你的「鍵」,這可以通過改變固定於

for(int i=0; i<s2.length();i++) 
    sb.append((char)(s1.charAt(i%s1.length())^s2.charAt(i))); 

另外的返回值的基64編碼缺失。

3

對我來說看起來不一樣。無論_key長度是多少,C++版本都循環遍歷所有_data,並根據需要循環遍歷_key。 (在C++代碼中爲k=(++k<klen?k:0);

只要遇到最短的密鑰或數據,您就會返回。

就個人而言,我會從C++到Java的最接近的字面翻譯開始,您可以這樣做,保持參數和本地名稱相同。

然後寫爲它具有從C++

已知的輸入和輸出再啓動重構的Java版本到用java成語/等確保測試仍然通過單元測試。

+0

是的,我明白了。這就是爲什麼我問是否有一個簡單的方法,如我可以使用的圖書館。謝謝。 – DarthVader