Показать сообщение отдельно
Старый 17.03.2015, 03:30   #5
Новичок
 
Аватар для noklin
 
Регистрация: 15.03.2015
Сообщений: 6
Сказал Спасибо: 1
Имеет 0 спасибок в 0 сообщенях
noklin пока неопределено
По умолчанию

Алилуя! Проблема решена!
Покопался поглубже в исходниках. Нашел класс LoginCrypt в нем метод ecrypt(массив, смещение, и размер) который обращался к методу decrypt(массив, смещение, и размер) Объекта NewCrypt

public void decrypt(byte raw[], int offset, int size) throws IOException
{
byte result[] = new byte[size];
int count = size / 8;
for(int i = 0; i < count; i++)
_decrypt.processBlock(raw, offset + i * 8, result, i * 8);

System.arraycopy(result, 0, raw, offset, size);
}
Видно, что тут блоки явно по 8 байт.
Берем 8 байт кидаем их в processBlock он в свою очередь вызывает метод decryptBlock(in, inOff, out, outOff);

private void decryptBlock(byte[] src, int srcIndex, byte[] dst, int dstIndex)
{
int xl = bytesTo32bits(src, srcIndex);
int xr = bytesTo32bits(src, srcIndex + 4);
xl ^= P[ROUNDS + 1];
for (int i = ROUNDS; i > 0; i -= 2)
{
xr ^= func(xl) ^ P[i];
xl ^= func(xr) ^ P[i - 1];
}
xr ^= P[0];
bits32ToBytes(xr, dst, dstIndex);
bits32ToBytes(xl, dst, dstIndex + 4);
}

А вот и метод где байты инвертируются

private int bytesTo32bits(byte[] b, int i)
{
return ((b[i + 3] & 0xff) << 24) | ((b[i + 2] & 0xff) << 16) | ((b[i + 1] & 0xff) << 8)
| ((b[i] & 0xff));
}
На выходе инвертируются обратно:

private void bits32ToBytes(int in, byte[] b, int offset)
{
b[offset] = (byte) in;
b[offset + 1] = (byte) (in >> 8);
b[offset + 2] = (byte) (in >> 16);
b[offset + 3] = (byte) (in >> 24);
}

Проблемы была в том что я на входе ничего не инвертировал.
Пользовался вместо вышеуказанного метода bytesTo32bits
таким:

private int BytesTo32bits(byte[] b, int i)
{
return ((b[i] & 0xff) << 24) | ((b[i + 1] & 0xff) << 16) | ((b[i + 2] & 0xff) << 8) | ((b[i + 3] & 0xff));
}
noklin вне форума   Ответить с цитированием