![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 | |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]() Цитата:
Например из вышеприведенных отрывков из исходников для расчета key1 использую такой дилетантский код: Код:
Хотя вроде правильно рассуждаю. Ну, а про расчеты crc32, я еще молчу. В программах считающих контрольную сумму файла CRC32 никакого второго аргумента нет, это меня и смутило. Ну, а вообще разработчики, что-то темнят. Я еще помню, как долго морочился с исходниками для MD5, пришлось кое-что переделывать по своему, чтоб оно выдавало правильную хэш. Неужели и PKZIP обманывает. Правда я ихних полных исходников на Си нигде не нашел. Последний раз редактировалось Stilet; 09.12.2014 в 20:15. |
|
![]() |
![]() |
![]() |
#12 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
![]()
crc8|16|32 все считают от бита, а когда входные аргументы в виде байтов, то это усовершенствование исключительно во имя скорости, и в бекграунде подразумеваются все равно операции над каждым битом последовательно)
И мне сомнительно, что в CRC используется умножение, а не операция XOR. |
![]() |
![]() |
![]() |
#13 | |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#14 | |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
![]()
У них, при беглом взгляде, правильно с алгоритмом:
Цитата:
Потом пробегается по символам пароля и все ключи на каждой итерации изменяются совершенно странным (но однозначным) образом, в зависимости от символа. В конце концов, из известных ключей и уникального пароля получаются уникальные ключи известные только держателю пароля, на исходные совсем-совсем непохожие. key0, key1, key2 слабо взаимосвязаны. Все их взаимное влияние - исключительно в одном последнем байте. В принципе, можно вообще избегнуть взаимовлияний через последний байт, а изменять ключи совершенно отдельно. Поэтому и нельзя, зная один ансайнед интегер и изменчивый байт, получить полноценный второй ансайнед интегер (с диапазоном значений от 0 до 2^32-1). Из одного заданного интегера и случайного байта можно по жестко заданному алгоритму получить всего 2^8 вариантов второго интегера. Последний раз редактировалось Smogg; 08.12.2014 в 21:16. |
|
![]() |
![]() |
![]() |
#15 |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]()
По быстрому почитал в вики про CRC,лучше бы не читал, еще больше запутался, но так и не понял куда там приткнуть байт pt. Поищу может где-то есть готовая библиотека для подсчета ихних crc32(key0,pt). Хотя гложет сомнение, что будет правильный результат при вычислениях. Может получится найти готовые полные исходники для PKZIP на Си. Если нет, то дизассемблирую и буду разбираться с ассемблером.
|
![]() |
![]() |
![]() |
#16 | |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]() Цитата:
Но из алгоритма который порусски , вначале топика. Выходит, что key1 должно получаться из текушего key0 и начального key1, но почемуто не выходит, это если файл пустой тоесть pt вообще нет, тоесть пароль пустой. |
|
![]() |
![]() |
![]() |
#17 | |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
![]() Цитата:
Читайте оригиналы) Переводы - исключительно для прояснений мутности оригиналов. Из приведенного мной алгоритма, если пароль пустой, то и ключи не изменяются. Понимаете? Ведь просто не было ни одной итерации. А каждый новый key, по задумке авторов, должен быть максимально отличен от любого предыдущего keyN. |
|
![]() |
![]() |
![]() |
#18 | |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]() Цитата:
Я тоже подозревал, что для пустого пароля ничего не считается. А вот проверить, простой пример, например, когда файл 1 и пароль 1 не могу.Потому, что так и не понял как считается функция из алгоритма crc32(key0,pt). Если только crc32(key0), еще можно вычислить, а куда эту pt приткнуть, которая символьная 1, или 16 ричн 31, двоичн 0011 0001, ну никак не пойму. Если бы Си воспринял бы эти crc32(... , ...) у меня и голова не болела бы, просто бы кодировал бы побитно и все. Но Си ругается и не принимает эту функцию. Для кого же написан такой код 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; } если Си его не воспринимает, может нужна специальная библиотека для Си, где есть расчеты по такой функции crc32(... , ...) ? Последний раз редактировалось vasanov; 09.12.2014 в 20:23. |
|
![]() |
![]() |
![]() |
#19 |
Участник клуба
Регистрация: 14.06.2011
Сообщений: 1,138
|
![]()
передача аргумента pt - это следствие табличного расчета CRC. Я целый вечер втыкал в десяток описаний, пока не вкурил, как оказывается, достаточно примитивную идею:
В основе табличного алгоритма лежит свойство ассоциативности операции XOR и предварительное вычисление промежуточных данных. Рассмотрим, как будет вести себя алгоритм при размере регистра более одного байта. На каждой итерации производится выдвигание старшего бита и в зависимости от того, равен он нулю или нет, производится XOR регистра с полиномом или не производится соответственно. Таким образом, за восемь итераций (количество битов в байте) порядок применения или не применения XOR однозначно определяется только значением старшего байта. Таким образом, при выполнении операции XOR регистра с постоянной величиной при различных ее сдвигах всегда будет существовать некоторое значение, которое при применении операции "исключающее ИЛИ" с исходной величиной регистра даст нам тот же самый результат. Например, последовательность операций: 0100110 регистр ...0110 XOR ..0110. XOR .0110.. XOR 0110... XOR ------- 0100100 Можно заменить на одну операцию: 0100110 регистр 0000010 XOR ------- 0100100 Произведя предварительно вычисления всех вариантов использования/не использования XOR полинома самого с собой (в зависимости от значения первого байта регистра) и занеся их в таблицу, можно заменить 8 операций битового сдвига одной операцией поиска в таблице по индексу. Ну, а после общего понимания CRC уже можно копипастить вики) Последний раз редактировалось Smogg; 09.12.2014 в 20:58. |
![]() |
![]() |
![]() |
#20 |
Пользователь
Регистрация: 07.12.2014
Сообщений: 12
|
![]()
Уже много начитал, про эти CRC, но с каждым разом все больше и больше запутываюсь. Всеравно не понимаю, что же делать с этим байтом pt. Это, что номер индекса таблицы значений стандартного полинома для CRC32 ? И мне, что нужно побитно перемножить полином от key0=0x12345678 на значения полинома из таблицы? Нормальные исходники Cи для подсчета CRC32, тоже не получилось найти, те, что нашел совершенно не хотят компилироваться- явно они написаны не для моего компилятора, да и они для профессионалов, которые поймут как к ним дописать код, чтоб все работало. Наверное у программистов так принято, в интернете писать только, то что не работает, или требует специфического компилятора. Так сказать, разберись и доделай сам.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Разбор 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 |