LINUX.ORG.RU

Определить метод шифрования

 ,


0

2

Добрый день, подскажите возможно ли определить метод шифрования, если имеется ассемблерный листинг дешифровки файла?

Требуется зашифровать некий хеш файл и подсунуть в программу, чтобы на выходе появился требуемый - расшифрованный хеш.

Имеется возможность динамической проверки работы «дешифратора», так сказать в отладчике (не удобно конечно, но всё же)

В процессе дешифровки имеются Логические сдвиги по 4 байта, смешивание со вторым файлом (находящимся в коде) и обратный сдвиг, примерно так работает. Возможно ли сделать реверс функций?

В общем случае метод определить можно (AES, RSA, и т.п.), зашифровать - нельзя, т.к. это может быть ассиметричным шифрованием.

Deleted ()
Ответ на: комментарий от Deleted

Если пойти от обратного, т.е. с конца кода и делать все наоборот с «выходным» хешем, не получится получить исходный-шифрованный фал?

Devill ()

Очень сильно зависит от того, каким конкретно образом это реализовано. То есть без непосредственно бинарного файла тебе никто решение не подскажет.

Deleted ()
Ответ на: комментарий от Devill

Угадай, почему хэш-преобразование именуется необратимым шифрованием.

Avial ★★★★ ()
Ответ на: комментарий от Avial

Я не пытаюсь сам ХЕШ расшифровать. Суть такая, имеется зашифрованный MD5_хеш, и он расшифровывается внутри программы, далее этот расшифрованный MD5_хеш сравнивается с другим ХЕШ'ем.

Тут дело не в ХЕШ, вместо него может быть безсистемный набор байтов, котрые проходят через определённую функцию расшифровки.

Вот и задумался, почему нельзя сделать как бы Реверс этой функции, но дело в том что используется логический сдвиг влево, потмо вправо, соответственно теряются определённые биты

Devill ()
Ответ на: комментарий от Devill

1) Может покажешь код? Вдруг кто-то в нём узнает известный алгоритм шифрования.

2) А не проще ли пропатчить бинарник, который дешифрует и сравнивает хеш?

Deleted ()
Ответ на: комментарий от Deleted

1) Код сильно растянут, много служебного кода - обеспечивающий контроль и расчёт счетчиков, инициализацию переменных и так далее.

2)Патчить нельзя, стандартные функции не будут работать, надо только рассчитать (кодирование исходного Хеш'а)

Дешифровка:

1.Два массива, первый Входной, второй встроен в Код (размер у них одинаковый)

2.Входной массив увеличивается в 2 раза (множится сам на себя) затем сдвигается влево(LSL+OR)

3.Встроенный массив сдвигается влево (LSL+OR)

4.Расчет Третьего Массива из первых Двух (в результате размер Третьего массива восстанавливается до исходного)

5.Третий массив (из п.4) сдвигается вправо (LSR+OR)

Дальше всё повторяется 16 раз, Только вместо Первого входного массива, подаётся результат работы фукции из п.5

Devill ()
Ответ на: комментарий от Devill

А можно псевдокодом? А то из описания не понятно.

Deleted ()
Ответ на: комментарий от Devill

он расшифровывается внутри программы, далее этот расшифрованный MD5_хеш сравнивается с другим ХЕШ'ем.

А можно примеры входного и расшифрованного хеша? А то что-то мне подсказывает, что там RSA, и обратно его без закрытого ключа не обернешь.

segfault ★★★★★ ()
Ответ на: комментарий от segfault

Добрый день, извините не отвечал - уезжал по делам. Пример позже скину (надо запустить отладку чтоб скопировать)

Почитал немного про DES, AES, RSA, по-моему это что-то подобно модифицированному DES, так как имеется:

1. Входной блок(DATA)

2. Вектор инициализации(IV) (он равен размеру DATA)

3. Блок «дополнения» (увеличивает DATA в 2 раза )

4. Начальные(прямое) преобразования DATA и IV (L_сдвиг+ИЛИ)

5. Основная процедура (на вход DATA*x2 + IV) на выходе (DATA)

5. Конечное(обратное) преобразование DATA (R_сдвиг+ИЛИ)

6. Далее повторяется Раунд 16-18 раз (подзабыл уже)

Подскажите такая схема дает понять что это не RSA?

Иначе RSA - я понимаю не стоит пытаться рашифровать, так-как бесполезно.

Devill ()
Ответ на: комментарий от Devill

Ставил эксперимент:

Заполнил массив DATA единицами hex значений 0x11

Заполнил массив (начальный вектор) IV двойками hex значений 0x22

На выходе получил массив размером DATA,

Данные в котором повторялись каждые 7 байт (по 56_бит) (не считая первые 4 байта)

Devill ()

р-к спициалисты на лоре

по машинам поцоны

missxu ()
Ответ на: комментарий от Devill

Иди методом исключения.

Что известно:

  • блочный шифр (какой размер DATA?)
  • есть вектор инициалиции равный размеру блока
  • 16 раундов

Из этого можно уже ограничить круг подозреваемых.

beastie ★★★★★ ()
Ответ на: комментарий от Devill

по 56_бит

По совокупности улик очень похоже на DES. Проверь на нулевых данных и нулевом ключе:

https://play.golang.org/p/Po1lzKTW1nV

Если это ванильный DES, выйдет 8c a6 4d e9 c1 b1 23 a7

beastie ★★★★★ ()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от beastie

Спасибо за помощь, проверю обязательно.

Размер Блока не увязывается не в один алгоритм, во всех примерах блоков много и они по 32,64,128,256 бит, а тут получается Один блок и он около 200 Байт !!!

Основную функцию еще толком не смотрел и ключ даже не искал, теперь понимаю что он должен быть. В основной процедуре по копаюсь (она не маленька), сходу там видно только что имеются константы FFFFFFFF. А может он копируется откуда-нибудь на определённом этапе

В мыслях найти онлайн сервис и попробовать, но в данном случае могут быть добавлены какие-нибудь доработаки.

В преобразованиях идёт работа с блоками по 32 бита (4_байта)

Они сдвигаются и 7(семь)бит с одного блока операцией ИЛИ подмешиваются в следующий блок.

Devill ()
Ответ на: комментарий от beastie

Вспомнил что с нулями не получится, уже пытался, поэтому проверял на единицах и двойках.

При «00» происходит выход из функции, на начальном этапе, не происходит ни одного цикла.

Стоит цикл проверки DATA на сравнение с «00_00_00_00», и если такое значение появляется, то достигнут конец - DATA

(как-то так я понял)

Devill ()

Распиши на бумажке весь алгоритм досконально и покури. Судя по описанию - делали шпециолишты на коленке, скорее всего можно то, что ты хочешь, если хорошо подумать, но может и не додумаешь. Подходи к этому, как к задаче по математике. Если нормальный криптографический хеш, конечно ничего не выйдет.

Legioner ★★★★★ ()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

Спасибо. Буду изучать основную функцию, что там происходит.

Подскажите еще пожалуйста, Если не брать этот случай, а чисто в теории:

Если используется стандартный алгоритм (DES, AES и их модификации), плюс имеется шифротекст, вектор_инициализации, ну и пароль выудить, то в чём сложность Дешифровки сообщений, ведь имеются стандартные функции «Зашифровать/Расшифровать»

Или я чего-то не понял ещё :) ?

Devill ()
Ответ на: комментарий от Devill

Я не до конца понимаю, что именно там происходит, то ли хеш, то ли шифрование. Если речь о симметричном шифровании, то проблем нет. Если речь об асимметричном шифровании, то это невозможно. Если речь о хешировании, то надо смотреть на то, что за хеш, с хорошими криптографическими хешами это невозможно, с плохими можно пытаться, с некриптографическими скорее всего достаточно легко.

Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

Спасибо я вас понял.

В моем случае на вход подаётся hex файл 200 байт, на выходе тоже hex 200 байт - Расшифрованный.

(Забудьте про MD5 это только наводит путаницу)

Devill ()
Ответ на: комментарий от Devill

{

1. DATA 200 -> DATA 400

2. DATA 400 -> (LSL+OR) = 400

3. IV 200 -> (LSL+OR) = 200

4. Result = Func_Decode (DATA_400, IV_200)

5. Result 200 -> (LSR+OR) = 200

}

Devill ()
Ответ на: комментарий от Devill

Да... Пахнет каким-то велосипедным шифром. Если это все же симметричный шифр, попробуй выписать все операции с данными и реализовать «обратный» проход алгоритма. Т.е. из конечных данных получить входные.

segfault ★★★★★ ()
Ответ на: комментарий от segfault

Похоже метод не стандартный, если считать что это блочный шрифр, он по 32 бита шифрует одним раундом, затем следующие 32 и так до конца.

Почти во всех блочных первым идёт перестановка бит и последним обратная перестановка, а тут первым делом входной файл увеличивается в два раза и только потом перестановка.

А вектор оказался не вектором, а что то типа ключа, он с помощью арифметических действий смешивается с увеличененным входным массивом.

Долго видимо разбираться придётся, самое интересное каждые 7 байт повторяется в выходном файле, если на вход подать одинаковые данные (массив с повторяющимся значением)

Devill ()
Ответ на: комментарий от beastie

Подскажите существуют блочные методы шифрования не использующие операции XOR или OR?

В моем случае используется только + и -, в функции получения Раундового ключа : и *

Скорее всего тут не Вектор, а Гамма - которая после обработки ключом и складывается либо вычитается из входных данных. Так-как равна длине входного сообщения, хотя и для Виктора подходит, уфф

Интересно все это, сколько оказывается методов придуманно

Devill ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.