Цитата:
Сообщение от ScythLab
Ты сам пишешь алгоритм blowfish?
|
Да. Точнее писал, пока не наткнулся на готовое решение в сорцах сборки l2jskyline.ru.
Так вот там, там есть метод:
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 ^= F(xl) ^ P[i];
xl ^= F(xr) ^ P[i - 1];
}
xr ^= P[0];
Bits32ToBytes(xr, dst, dstIndex);
Bits32ToBytes(xl, dst, dstIndex + 4);
}
Он работает с массивами байт из одного читает->расшифровывает а в другой записывает и главное что есть индекс начального байта с которого начинают работу как для массива из которого читают , так и для массива в который пишут. Из этого складывается мысль что для конкретного пакета существует свой алгоритм или такая архитектура связана с механизмом формирования пакета.
Я ваще думаю что байты инвертировать надо в пакете.
Всем известный факт: 2 первых байта это размер пакета. Так? Да окей берем 2 байта BA00 читаем как в школе учили слева на право: 1011101000000000 а это у нас ваще -17920(в десятичной системе) Отсюда мысль про ивертирование. По моей гипотезе нужно брать по порядку значимые байты и их инвертировать. То есть зная что 2 байта есть размер пакета, мы берем и инвертируем это 2 байта получаем 00BA. Следующий байт 8С тип пакета его не трогаем. Следующие 4 байта ID сессии его тоже инвертируем и так далее. А потом применить мой BlowFish без первых 2х байт конечно же.
Копался в исходниках но нечего похожего на это не нашел.