![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Ky6uk |
|
||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 22.6.2007 Репутация: нет Всего: нет |
Необходимо реализовать C++-функцию для снятия XOR-шифрования с данных (в частности с пакета, прочитанного из сокета). Для примера возьмем статический пакет, полученный в этой теме:
После дешифрования должен получиться пакет вида:
Известно, что последние 8 и первые 2 байта не шифруются. XOR-ключом являются 4 предпоследних байта в обратном порядке (A1 6F 07 3B). Рабочая функция на С++:
Хотелось бы реализовать данный алгоритм на Perl, без использования inline. Написанный мной код работает не совсем верно. Верно получается только XOR-ключ, но конечный результат неверен. В чем проблема понять не могу. Буду благодарен за подсказку. Мой алгоритм дешифрования:
|
||||||||
|
|||||||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый Ky6uk, предлагаю свой вариант
результат работы отличается от того, что должно получится тем, что у Вас байты 3, 4, 5, 6 не расшифрованы, хотя должны бы судя по исходнику. Это сообщение отредактировал(а) ginnie - 8.7.2008, 21:57 -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Ky6uk |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 22.6.2007 Репутация: нет Всего: нет |
Благодарю за вариант, но он опять же не ведет к желаемому результату.
Для начала ключ должен идти в обратном порядке. В первом посте указан ключ, который должен получиться. Так же выше указан ожидаемый результат декодирования (получившийся с помощью функции декодирования написанной на С++). Может я сам не совсем понял алгоритм расшифровки, приведенный на С++, но он верный (нужный мне для правильного декодирования пакета). По этому старался сделать аналогию. |
|||
|
||||
| Ky6uk |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 22.6.2007 Репутация: нет Всего: нет |
После анализа еще нескольких расшифрованых пакетов заметил закономерность:
1. Первые 2 байта BA 00 не шифруются и означают длину пакета (об этом написано выше). 2. Третий байт всегда 00. 3. 8, 9, 10 и 11 байты всегда постоянны и равны 21 C6 00 00 4. Последние восемь байт остаются нетронутыми до и после дешифрования. 5. предпоследние четыре байта в обратном порядке составляют XOR-ключ. Мой алгоритм, написаный по аналогии с сишным выполняет все пункты, кроме п.3. Почему пока не понял. Это сообщение отредактировал(а) Ky6uk - 8.7.2008, 23:45 |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый Ky6uk, мой исправленый вариант
в результате расшифровки получаем код, который Вы привели. В предыдущем варианте я неверно определил момент окончания расшифровки, кроме того, забыл убрать отладочный вывод символами "*". С ключом в моем варианте все нормально, просто у Вас используется целочисленное представление значения, а у меня побитовое. Для перевода в целочисленное надо использовать unpack('I', $key). -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Ky6uk |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 22.6.2007 Репутация: нет Всего: нет |
Хм. У меня получается не тот результат.
Для примера выладываю еще один декодированый пакет программой на С++. До:
После:
Не могу понять где запарка в алгоритме... Добавлено через 4 минуты и 54 секунды Байты под номерами 8, 9, 10 и 11 во всех случаях должны быть постоянны и равны 21 C6 00 00. Байт номер 3 так же постоянен и равен 00. |
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Ky6uk, у меня программа выдает
а у Вас что? -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Ky6uk |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 22.6.2007 Репутация: нет Всего: нет |
Видите? в десятом байте например С0 вметсо 00. Вроде сделал даже копипаст кода в новый файл. Ничего не понимаю... Это сообщение отредактировал(а) Ky6uk - 9.7.2008, 13:28 |
|||
|
||||
| shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
вот так у меня |
|||
|
||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Уважаемый Ky6uk, удалось воспроизвести Ваш результат на Windows (я тестировал на FreeBSD). Попробую разобраться в чем дело.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
| Ky6uk |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 22.6.2007 Репутация: нет Всего: нет |
Если важно, то у меня Debian.
|
|||
|
||||
| shamber |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1422 Регистрация: 5.9.2006 Где: Россия Репутация: 17 Всего: 18 |
У Меня WINXP
|
|||
|
||||
| ginnie |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
В ходе исследования выяснилось, что в perl 5.8.8 от Activestate (Windows)
возвращается 80000000 вместо 7382ED24. Напрямую к текущей проблеме не относится, но все-же странно. Добавлено через 4 минуты и 42 секунды Еще странно следующее
должен возвращать 1937960228 (это беззнаковое представление числа -2357007068, именно так его возвращает perl во FreeBSD), а под Windows возвращается 2147483648. -------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
||||
|
|||||
| Ky6uk |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 22.6.2007 Репутация: нет Всего: нет |
Я так полагаю будет необходимостью провести дополнительные операции для получения желаемого результата? Есть идеи? |
||||
|
|||||
| ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Ky6uk, получается, что неверно упаковываются некоторые отрицательные числа, при этом их беззнаковые эквиваленты обрабатываются нормально. Для нормальной работы надо перевести знаковые значения в беззнаковые.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |