Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.12.2014, 17:48   #1
vasanov
Пользователь
 
Регистрация: 07.12.2014
Сообщений: 12
По умолчанию Разбор PKZIP

Здравствуйте. Решил на старости лет изучить Си.
Но столкнулся с таким при разборе 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
vasanov вне форума Ответить с цитированием
Старый 07.12.2014, 17:56   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Решил на старости лет изучить Си.
Цитата:
с таким при разборе PKZIP.
А может с калькулятора для начала?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.12.2014, 18:01   #3
vasanov
Пользователь
 
Регистрация: 07.12.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А может с калькулятора для начала?
Да, нет, на калькуляторе я цыфирки освоил. Даже проверяю результаты насчитанные на Си. А вот с такими исходниками непонятки.
vasanov вне форума Ответить с цитированием
Старый 07.12.2014, 18:22   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Будь я начинающий в Си я бы взял задачу попроще, но никак не упаковщик.
Это оффтоп...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.12.2014, 19:30   #5
vasanov
Пользователь
 
Регистрация: 07.12.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Будь я начинающий в Си я бы взял задачу попроще, но никак не упаковщик.
Не, знаю. Мне легче разбираться на примерах. Но почему-то ни один готовый исходник на Си никогда не компилируется. Всегда находит кучу ошибок. Вот исходники для расчета CRC-32 нашел, они тоже не компилируются. Не понимаю, это, что в инете специально неправильные исходники дают или у меня какой-то компилятор кривой, про свои ручки я давно знаю.
vasanov вне форума Ответить с цитированием
Старый 07.12.2014, 20:15   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну может быть и разница в компилях и ручки из другого места...
Смотря какие ошибки. Ну уж если с этим не справляешься однозначно бери задачу попроще - не пожалеешь.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.12.2014, 23:38   #7
vasanov
Пользователь
 
Регистрация: 07.12.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну может быть и разница в компилях и ручки из другого места...
однозначно бери задачу попроще - не пожалеешь.
Мне собственно, нужно понять как этот PKZIP работает. Наверное это уже хобби стало. Вот на MD5 я нашел исходники разработчика на СИ, они кстати тоже не компилируются. Но там кусочками мне удалось запустить это хэширование по MD5,пришлось даже немного подгонять под свой компилятор. И не прошло и полгода, разбирательства по настроению, как я понял как хэширование по MD5 работает. А вот с этим PKZIP полных исходников на СИ не найду, хотя принцип его работы понятен, но что-то с этими частями из исходников на Си не сходится. Не получаются правильными расчеты по ихнему алгоритму. Или я не так понял алгоритм PKZIP, либо у них компилятор специфический с навороченными библиотеками. В инете ничего толкового не нашел, по этому поводу, все повторяют одно и тоже и все нерабочее. Си я хоть немного знаю, на уровне первоклассника. А вот если дизассемлировать PKZIP.exe, то там точно ничего не пойму, в Ассемблере я вообще никак, в английском, кстати тоже.
vasanov вне форума Ответить с цитированием
Старый 08.12.2014, 00:40   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Цитата:
Что это за функция crc32 (key0, pt) или crc32(key(0),char) Си это не понимает
Все так и должно. У вас должна быть эта функция - напишите сами, возьмете готовую из либы не важно.

Цитата:
я тоже. Если это CRC-32, то как от двух аргументов?
Начните с вики. Прочитайте как вычисляется crc и может дойдет откуда два аргумента.

Цитата:
Например если ничего нет ""
Где?

Цитата:
то key такими и должны остаться
с чего вдруг? они ж обновляются...
p51x вне форума Ответить с цитированием
Старый 08.12.2014, 01:02   #9
vasanov
Пользователь
 
Регистрация: 07.12.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Все так и должно. У вас должна быть эта функция - напишите сами, возьмете готовую из либы не важно.
Прочитайте как вычисляется crc и может дойдет откуда два аргумента.
с чего вдруг? они ж обновляются...
Обязательно поищу. Ну, вообще-то есть готовые программы считающие все эти 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.
vasanov вне форума Ответить с цитированием
Старый 08.12.2014, 09:14   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Вы хоть код выложите на котором тестируете.

Цитата:
Правда для этих crc32(...,...) я не пересчитывал, так как не понял, что это такое, но это явно не CRC-32 с такими аргументами.
Это явно CRC32, почитайте все-таки википедию.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбор 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