Разница между этим кодом Java и C? - PullRequest
1 голос
/ 14 ноября 2011

Я пытался преобразовать код C на Java, но он работает немного по-другому.Это XOR-шифрование, и для некоторых данных он возвращает те же результаты, поэтому я знаю, что он довольно близок, но для некоторых данных он не работает точно так же (разные результаты).

C-код (работает наWindows x86, скомпилированная с Borland Builder):

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 байт, и я могу выяснить, как публиковать вложения, возможно, при необходимости, но я не думаю, что это так.

Ответы [ 3 ]

6 голосов
/ 14 ноября 2011

Я полагаю, это потому, что в Java 16-битный символ.Поэтому, когда вы увеличиваете ключ key[crypt_ptr] += (char) 1 или добавляете два символа key[crypt_ptr] += key[crypt_ptr + 1], он действует иначе, чем c (где char является 8-битным)

Попробуйте использовать байты везде вместо символов, просто используйте коды символов для инициализации.

0 голосов
/ 14 ноября 2011

Ваши ключевые значения должны быть 8-битными. Попробуйте

byte[] key = "X02$B:".getBytes();
0 голосов
/ 14 ноября 2011

Почему бы вам не показать нам пример, где различия проявляются?

Кстати, я бы написал:

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