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