private long S(long x, byte i)
{
byte[] bts = new byte[4];
bts = BitConverter.GetBytes(x);
return SBoxes[i, bts[3-i]];
}
Проблема в чем: С# выдает {3, 169, 95, 79, 0, 0, 0, 0}, а ява {3, -87, 95, 79, 0,0,0,0}. Понятное дело что нет в массиве такого числа. Кто знает как эту проблему решить?
число 169 и -87 в двоичном представлении (и в шестнадцатеричном) в первом байте одно и тоже (169 = 0x000000A9; -87 = 0xFFFFFFA9), отличается только знаком. Скорее всего вся проблема в том что элементы твоего массива размером больше чем 1 байт, поэтому при чтении пакета и работы с однобайтовыми элементами, добавляются FF. И если я не ошибаюсь, особо это не влияет на работу с пакетами. И мой тебе совет, просматривай числа в шестнадцатеричном режиме =)
число 169 и -87 в двоичном представлении (и в шестнадцатеричном) в первом байте одно и тоже (169 = 0x000000A9; -87 = 0xFFFFFFA9), отличается только знаком. Скорее всего вся проблема в том что элементы твоего массива размером больше чем 1 байт, поэтому при чтении пакета и работы с однобайтовыми элементами, добавляются FF. И если я не ошибаюсь, особо это не влияет на работу с пакетами. И мой тебе совет, просматривай числа в шестнадцатеричном режиме =)
Проблема в том что реализация немного разная. Байт в C# 0..255, а в java -128..127. И еще один здоровенный гемор, то что порядок следования байт в C# {3, 169, 95, 79, 0, 0, 0, 0}, а в java {0,0,0,0, 79, 95, -87, 3}. И помоему это значительно портит мне жизнь). Походу в делфи тоже порядок {3, 169, 95, 79, 0, 0, 0, 0} и байт 0..255.
что касается последовательности байт, это где такая у тебя последовательность, я что то не понял? А что касается разных реализаций типа байт, я же говорю - смысл для байта в двоичном и шестнадцатеричном представлении от этого не меняется
что касается последовательности байт, это где такая у тебя последовательность, я что то не понял? А что касается разных реализаций типа байт, я же говорю - смысл для байта в двоичном и шестнадцатеричном представлении от этого не меняется
Код:
private long S(long x, byte i)
{
byte[] bts = new byte[4];
bts = BitConverter.GetBytes(x);
return SBoxes[i, bts[3-i]];
}
Вот тут такая последовательность. Понимаешь тут смысл в чем, оно выбирает из bts числа (которые там получились) bts[3-i] - это число {3, 169, 95, 79, 0, 0, 0, 0}. И в массиве SBoxes выбирает число. Понятное дело что оно не может быть отрицательным. Ща попробую запилить в яве не в байт а в short и глянуть какие данные будут.
Кстати, чисто для сверки, выкинь полученные Parray и SBoxes из BlowFish.Init(key), ключ тоже подсунь.
private long S(long x, byte i)
{
byte[] bts = new byte[4];
bts = BitConverter.GetBytes(x);
return SBoxes[i, bts[3-i]];
}
Вот тут такая последовательность. Понимаешь тут смысл в чем, оно выбирает из bts числа (которые там получились) bts[3-i] - это число {3, 169, 95, 79, 0, 0, 0, 0}. И в массиве SBoxes выбирает число. Понятное дело что оно не может быть отрицательным. Ща попробую запилить в яве не в байт а в short и глянуть какие данные будут.
Кстати, чисто для сверки, выкинь полученные Parray и SBoxes из BlowFish.Init(key), ключ тоже подсунь.
для bts[3-i], 3-i - никогда и не будет отрицательным, потому что в моем классе значение i > 3 нигде не используется.
Что касается записи числа в массив.
Вообще, в процессорах Intel используется обратная запись числа, поэтому в пакетах тебе приходит массив с числами, которые записаны задом наперед. И видимо поэтому C# и Delphi переводит число в массив именно задом наперед. И то что ява переводит так число в массив действительно беда, но это уже врятли исправишь. Хотя.. Я яву не знаю, так что может просто есть другая функция для этого)
для bts[3-i], 3-i - никогда и не будет отрицательным, потому что в моем классе значение i > 3 нигде не используется.
так верно i проходит от 0 до 3. Тут просто берется значение которые попало под этот индекс (3-i), а вот там уже с -)). В общем с блоу фишем вроде разобрался. сравнил с Делфой).
Проблема теперь в другом... пакет который приходит 186, но данные другие от делфи).
P.S. У меня еще столько IDE никогда не стояло)) QT, Java-ские, C#, Delphi 7
Далее отсекаю у него размер пакета (ba00) и получившийся пакет без первых 2 байт я должен декодить по блоуфишу с начальным ключём, правильно?
Тогда я получаю:
Дальше я по идее должен получить ключ для XOR, т.е. взять 178-181 байты (из оставшихся 184, т.к. отрезал 2 байта размера), или другие, если допустим не считать уже отрезанные 2 байта размера? Вот тут я не понимаю, запутался. Просто xkor тут такие значения писал http://coderx.ru/showpost.php?p=30849&postcount=53
Какие всё таки байты брать для ключа ксора?
Правильно ли я понимаю что ксорить надо будет по 4 байта начиная с первого и заканчивая размером пакета минус размер ксор ключа (т.е. 4 байта).
Ещё загвоздка в том, что не могу найти описание того как ксорить на яве, я так понял через символ ^, но он ругается на то что его нельзя использовать с типом byte, в котором у меня пакет и ключ. Где можно найти инфу по этому поводу? в исходниках серва не смог более менее путное найти.
Сильно не пинайти, кодить на яве начал неделю назад.
ErgoZ, что бы долго не писать, сразу пришлю код =) (C#)
Код:
public static byte[] AntiXor(byte[] s)
{
long key, b;
int i;
byte[] b_temp;
b_temp = new byte[4];
i = s.Length - 8;
key = BitConverter.ToInt32(s, i);
while (i >= 7)
{
i = i - 4;
b = BitConverter.ToInt32(s, i);
b = b ^ key;
key = key - b;
Array.Copy(BitConverter.GetBytes((Int32)b), 0, b_temp, 0, 4);
Array.Copy(b_temp, 0, s, i, 4);
}
return s;
}