Алилуя! Проблема решена!
Покопался поглубже в исходниках. Нашел класс 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));
}