Сейчас на форуме: _MBK_, Magister Yoda (+5 невидимых) |
![]() |
eXeL@B —› Основной форум —› Неизвестный алгоритм шифрования |
Посл.ответ | Сообщение |
|
Создано: 02 ноября 2009 23:33 · Личное сообщение · #1 Всем доброго времени суток. Столкнулся с интересным алгоритмом шифрования файлов одной коммерческой проги (делаю конвертер из нее в open формат). Собственно, алгоритм такой: - Файл зашифрован блоками по 0x80 байт. Каждый блок - полином 32й степени или число из 32х знаков с основанием системы счисления 0xFFFFFFFF (однозначно не определишь). Суть расшифровки - разбиение блока на равные подблоки, сложение, вычитание, умножение на коэффициенты и возведение в квадрат (схема достаточно мудрёная, рекурсивная с глубиной 3). Рекурсивная функция на один и тот же блок заряжается 16 раз, притом после каждой обработки из результирующего блока - тоже 80 байт вычитается ключ - такой же набор чисел. В итоге сначала имеем блок "мусора" в 128 байт, на выходе - расшифрованный блок такого же размера. какой алгоритм шифрования это может быть? Особенность - отсутствие XOR и сдвигов, т.е. только математика. Авторам за издевательство над юзерами я еще отпишу привет (файл родной прогой открывается за 30-40 сек, хотя используй они что-нибудь более умное из алгоритмов симметричного шифрования, все работало бы в разы быстрее). Сейчас просто хотелось бы знать, может кто с таким сталкивался. Отреверсить я его и так смогу, не проблема. ![]() |
|
Создано: 02 ноября 2009 23:58 · Личное сообщение · #2 |
|
Создано: 03 ноября 2009 00:15 · Личное сообщение · #3 |
|
Создано: 03 ноября 2009 00:43 · Поправил: coolangel · Личное сообщение · #4 |
|
Создано: 03 ноября 2009 01:01 · Личное сообщение · #5 К сожалению: 1. в статике бинарник не проанализируешь. Использовано многослойное полиморфное шифрование исполняемого кода и куски дешифровщика сначала расшифровываются, затем выполняются, затем обратно шифруются. 2. констант нет. ключ получается из ключевых файлов проги в динамике. точнее все константы - это размеры буферов, они задаются в коде напрямую. Часть ключа берется из самого кода (!) в виде контрольных сумм функций, т.е. лишний брекпоинт не в том месте приводит к разрушению ключа. 3. Сам алгоритм на 90% отреверсил уже, скажу точно что XOR, сдвигов и S-Box нет. Алгоритм думаю вряд ли классический, есть большие подозрения на самодеятельность авторов. на всякий случай - чем посоветуете прокатить код? работаю под IDA, может плагин какой? маловероятно конечно. ![]() |
|
Создано: 03 ноября 2009 09:45 · Поправил: sendersu · Личное сообщение · #6 |
|
Создано: 03 ноября 2009 11:11 · Личное сообщение · #7 |
|
Создано: 03 ноября 2009 12:50 · Личное сообщение · #8 |
|
Создано: 03 ноября 2009 23:58 · Личное сообщение · #9 |
|
Создано: 04 ноября 2009 00:15 · Поправил: Ultras · Личное сообщение · #10 |
|
Создано: 04 ноября 2009 12:41 · Личное сообщение · #11 Это точно не: - RSA - DES - Blowfish - IDEA - ГОСТ 28147 - MARS - RC6 - Rijndael - Serpent - Twofish Особенности 1. Используются только операции сложения, вычитания, возведения в квадрат и умножения на число 2. Зашифрованный участок, ключ и единицы обработки представляют собой числа из 32,16,8 и 4 знаков с основанием системы счисления 2 в 32 степени 3. S-box, сдвигов и XOR нет. 4. Это не сеть Фейштеля. 5. Расшифрованный блок - 32 x DWORD представляет собой нужные данные, которые затем побайтно разворачиваются в обратном порядке. ![]() |
|
Создано: 06 ноября 2009 17:40 · Личное сообщение · #12 |
|
Создано: 06 ноября 2009 22:31 · Личное сообщение · #13 Да, там арифметика с большими числами, но в отличие от RSA максимальная степень - квадрат. Ключ накладывается так: - буфер (32xdword) преобразуется в число (64 знака - dword) по определённому закону - старшие 2xdword делятся на старшие 2xdword ключа - получаем множитель. - ключ (32xdword) познаково умножается на множитель - берутся последние 32xdword числа, из них вычитается ключ помноженный на множитель. - в итоге имеется пересчитанное число. Цикл повторяется 32 раза, каждый раз идёт смещение на 1 знак к началу числа. - если учитывать, что и число, и ключ - это большие числа, которые хранятся младшими знаками вперёд, то последняя процедура похожа на деление полинома-данных на полином ключа, притом полином данных - 64й степени, а ключа - 32й. В итоге получается остаток от деления и 32 знака - частное. Затем частное побайтно разворачивается в обратном порядке и получается расшифрованный буфер. Насчёт асимметричности ключа - имею только алгоритм дешифровки, как тут проверишь? Может кто подскажет хотя бы несколько криптоанализаторов, которыми стоит прокатить скинутые дампы проги? т.к. в гугле самый крутой криптоанализатор - терморектальный ![]() Сам алгоритм дешифровки уже отреверсил, переписал, работает. Вопрос уже только с точки зрения интереса - что это был за зверь. ![]() |
|
Создано: 10 ноября 2009 01:11 · Личное сообщение · #14 |
|
Создано: 10 ноября 2009 01:11 · Личное сообщение · #15 |
![]() |
eXeL@B —› Основной форум —› Неизвестный алгоритм шифрования |