![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]()
Здравствуйте. Решил на старости лет изучить Си.
Но столкнулся с таким при разборе PKZIP. В инете ничего не нашел по этому поводу. Может тут подскажут. В родном описании: Step 1 - Initializing the encryption keys ----------------------------------------- Key(0) <- 305419896 Key(1) <- 591751049 Key(2) <- 878082192 loop for i <- 0 to length(password)-1 update_keys(password(i)) end loop Where update_keys() is defined as: update_keys(char): Key(0) <- crc32(key(0),char) Key(1) <- Key(1) + (Key(0) & 000000ffH) Key(1) <- Key(1) * 134775813 + 1 Key(2) <- crc32(key(2),key(1) >> 24) end update_keys В другом по русски: key0 = 0x12345678; key1 = 0x23456789; key2 = 0x34567890; Алгоритм изменения внутреннего состояния может быть представлен следующей функцией на языке С: unsigned char PKZIP_stream_byte (unsigned char pt) { unsigned short temp; key0 = crc32 (key0, pt); key1 = (key1 + (key0 & 0xFF)) * 0x08088405 + 1; key2 = crc32 (key2, key1 » 24); temp = (key2 & 0xFFFC) | 2; return ((temp * (temp ^ i )) » 8) & 0xFF; } Здесь pt (от "plaintext") содержит следующий байт открытого текста, возвращаемое функцией значение представляет собой следующий байт шифр-текста, а сгс32 — макрос или функция, принимающая предыдущее значение CRC32 и очередной байт и вычисляющая следующее значение многочлена CRC32, образованного "магическим числом" 0xEDB88320. Но ни то ни то в Си не работает. Что это за функция crc32 (key0, pt) или crc32(key(0),char) Си это не понимает, я тоже. Если это CRC-32, то как от двух аргументов? Да и вообще даже key1 = (key1 + (key0 & 0xFF)) * 0x08088405 + 1; правильно не считает, действия простые, а результат корявый, не совпадает с правильным. Например если ничего нет "", то key такими и должны остаться key0 = 0x12345678;key1 = 0x23456789; key2 = 0x34567890; А ничего подобного. Все только не key1 = 0x23456789 Не ну то, что из меня программист никакой, это понятно. Но почему готовые варианты ничего не считают? Я пользуюсь Codeblocks |
![]() |
![]() |
![]() |
#2 | ||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
Цитата:
I'm learning to live...
|
||
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]() |
![]() |
![]() |
![]() |
#4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Будь я начинающий в Си я бы взял задачу попроще, но никак не упаковщик.
Это оффтоп...
I'm learning to live...
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]()
Не, знаю. Мне легче разбираться на примерах. Но почему-то ни один готовый исходник на Си никогда не компилируется. Всегда находит кучу ошибок. Вот исходники для расчета CRC-32 нашел, они тоже не компилируются. Не понимаю, это, что в инете специально неправильные исходники дают или у меня какой-то компилятор кривой, про свои ручки я давно знаю.
|
![]() |
![]() |
![]() |
#6 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Ну может быть и разница в компилях и ручки из другого места...
Смотря какие ошибки. Ну уж если с этим не справляешься однозначно бери задачу попроще - не пожалеешь.
I'm learning to live...
|
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]()
Мне собственно, нужно понять как этот PKZIP работает. Наверное это уже хобби стало. Вот на MD5 я нашел исходники разработчика на СИ, они кстати тоже не компилируются. Но там кусочками мне удалось запустить это хэширование по MD5,пришлось даже немного подгонять под свой компилятор. И не прошло и полгода, разбирательства по настроению, как я понял как хэширование по MD5 работает. А вот с этим PKZIP полных исходников на СИ не найду, хотя принцип его работы понятен, но что-то с этими частями из исходников на Си не сходится. Не получаются правильными расчеты по ихнему алгоритму. Или я не так понял алгоритм PKZIP, либо у них компилятор специфический с навороченными библиотеками. В инете ничего толкового не нашел, по этому поводу, все повторяют одно и тоже и все нерабочее. Си я хоть немного знаю, на уровне первоклассника. А вот если дизассемлировать PKZIP.exe, то там точно ничего не пойму, в Ассемблере я вообще никак, в английском, кстати тоже.
|
![]() |
![]() |
![]() |
#8 | ||||
Старожил
Регистрация: 15.02.2010
Сообщений: 15,833
|
![]() Цитата:
Цитата:
Цитата:
Цитата:
|
||||
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]()
Обязательно поищу. Ну, вообще-то есть готовые программы считающие все эти key. Например PasswordsPro там это рассчет хэшей CRC-96(ZIP). Если ничего не задавать в графе пароль то получится 123456782345678934567890 - это и есть все эти 3 key по 8 знаков, при этом CRC-32 и CRC-32B = 00000000. А вот как это все реализовано в PKZIP на Си, не пойму. По сути, получается частный случай все key должны совпасть с начальными, при этом pt - байт отсутствует, но ничего не получается, даже для key1, где нет никаких функций. Ну, а вообще это CRC-96(ZIP) дает все эти свои key для каждого пароля. Но всеравно с расчетами в Си они не совпадают. Правда для этих crc32(...,...) я не пересчитывал, так как не понял, что это такое, но это явно не CRC-32 с такими аргументами.
Последний раз редактировалось vasanov; 08.12.2014 в 02:05. |
![]() |
![]() |
![]() |
#10 | |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,833
|
![]()
Вы хоть код выложите на котором тестируете.
Цитата:
|
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разбор message | RuVarez | Общие вопросы Delphi | 0 | 14.05.2012 18:31 |
Разбор string | vbutrim | C# (си шарп) | 5 | 11.04.2012 17:29 |
разбор строки | D_e_n_n | Помощь студентам | 2 | 03.03.2011 15:22 |
Разбор кода. С++ | TIT0 | Помощь студентам | 0 | 27.12.2010 11:17 |
разбор пути | m_kostik | Win Api | 3 | 01.04.2010 22:25 |