2011-11-14 21 views
1

我試圖將一些C代碼轉換爲Java,但它的工作方式稍有不同。這是XOR加密,對於某些數據它返回相同的結果,所以我知道它非常接近,但對於某些數據,它不能完全相同(不同的結果)。此Java和C代碼之間的區別?

C代碼(在x86 Windows中,與Borland生成器編譯後運行):

void Crypt(unsigned char *data,long len) 
{ 
char key[] = "X02$B:"; 
ULONG crypt_ptr; 
long x; 

    for(crypt_ptr=0,x=0;x<len;x++) 
     { 
     data[x] ^= key[crypt_ptr]; 
     if(crypt_ptr < (sizeof(key) - 2)) 
     key[crypt_ptr] += key[crypt_ptr + 1]; 
     else 
     key[crypt_ptr] += key[0]; 
     if(!key[crypt_ptr]) 
     key[crypt_ptr] += (char) 1; 
     if(++crypt_ptr >= sizeof(key) - 1) 
     crypt_ptr = 0; 
     } 
} 

的Java代碼(它運行,如果它的事項在Android平臺上):

public static void Crypt(byte[] data,int offset,int len) 
{ 
    // EDIT: Changing this to byte[] instead of char[] seems to have fixed code 
    //char[] key = {'X','0','2','$','B',':'}; 
    byte[] key = {'X','0','2','$','B',':'}; 
    int size_of_key = 7; 
    int crypt_ptr; 
    int x; 

    for(crypt_ptr=0,x=0;x<len;x++) 
    { 
     data[x+offset] ^= key[crypt_ptr]; 
     if(crypt_ptr < (size_of_key - 2)) 
      key[crypt_ptr] += key[crypt_ptr + 1]; 
     else 
      key[crypt_ptr] += key[0]; 
     if(key[crypt_ptr] == 0) 
      key[crypt_ptr] += (char) 1; 
     if(++crypt_ptr >= size_of_key - 1) 
      crypt_ptr = 0; 
    } 
} 

我已經證實,進入每個函數的數據是相同的,而對於Java版本,我在字節數組中傳遞正確的偏移值。如前所述,它有時會起作用,所以我認爲這不是一個主要/顯而易見的問題,更像是有符號值和無符號值之間的一些小問題。如果它有幫助,那麼第一個不同的字節就是數據中的第125個字節(索引爲124,如果從零開始)。我沒有看到一個模式,就像每125個字節一樣,它之後幾乎是隨機的。數據只有171字節,我可以根據需要找出如何作爲附件發佈,但我不認爲它是。

+2

這是這個問題的更新:http://stackoverflow.com/questions/8098383/need-help-converting-c-code-to-java? – home

+0

在Java代碼中聲明'int size_of_key = key.length;' –

+0

是更好的樣式是的,這是對我其他帖子的更新。它已經關閉了,所以我認爲我需要開始一個新的(併發佈一個更好的問題,而不是要求別人去做我的工作;)?我想我會改變爲size_of_key = key.length建議,但我會使用+1,因爲在C sizeof()包括空終止符。 – eselk

回答

6

我想這是因爲char是java中的16位。所以當你增加密鑰key[crypt_ptr] += (char) 1或添加兩個字符key[crypt_ptr] += key[crypt_ptr + 1]時,它的行爲與c不同(char是8位)。

嘗試使用字節到處而不是字符,只需使用符號代碼進行初始化即可。

+0

就是這樣,謝謝!我改爲byte []而不是char []作爲密鑰,使用Java,現在它似乎正常工作。我必須用更多的數據來測試它,但我認爲就是這樣。 – eselk

-1

你爲什麼不向我們展示一個差異體現自己的例子?

BTW,我會寫:

char[] key = {'X','0','2','$','B',':', '\0'}; 
0

你的鍵值必須是8位。嘗試

byte[] key = "X02$B:".getBytes(); 
相關問題