Как я могу победить RC4-подобное запутывание? - PullRequest
2 голосов
/ 02 декабря 2010

Я пытаюсь прочитать файлы данных, сгенерированные программой, изначально написанной на Visual Basic 6 (а затем переписанной на Java), чтобы я мог обработать их, используя свои собственные инструменты.

Рассматриваемая программа является общественным достоянием, созданным правительством США; нет лицензионного соглашения, запрещающего это. Я не могу упомянуть название программы или ссылку на ее веб-сайт, потому что программист, вероятно, изменит запутывание в версии следующего года, и мне придется повторить мои усилия по обратному инжинирингу.

Основной формат файла данных основан на тексте, а запутывание - это некий потоковый шифр с жестко закодированным ключом. Я могу объединить файлы данных XOR, чтобы получить некоторые данные (заполнив одно из строковых полей повторяющимся символом ASCII), но я хотел бы избежать встраивания всего потока ключей в мою программу.

Поиск в файле .exe выявляет вызов подпрограммы с именем RC4ini и строку, которая, как я считаю, является ключом (она нигде не отображается в пользовательском интерфейсе). Я нашел, что может быть исходным кодом для этой библиотеки шифрования на Исходный код планеты , внес корректные изменения в работающую реализацию RC4 (в JavaScript, поскольку это язык программирования, на котором я в основном работаю), и попробовал его использовать.

Я пытался искать зашифрованные данные при каждом смещении в файле, но мне не удалось расшифровать. Почему это происходит?

Ответы [ 2 ]

2 голосов
/ 02 декабря 2010

Если они используют RC4, у вас есть несколько вариантов.

Один из вариантов - выяснить, когда они вызывают RC4, и сбросить ключ или текстовое сообщение. Это легко сделать с помощью отладчика, такого как Windbg или, возможно, ollydbg. По сути, они нарушают криптовалюту, и все DRM потерпят неудачу из-за этого свойства.

Другая атака состоит в том, что если один и тот же ключ используется для 2 сообщений, если вы знаете простой текст одного сообщения, то вы можете зашифровать его соответствующим текстом шифра, чтобы показать поток PRNG. Этот поток PRNG может затем быть XOR'ом с зашифрованным текстом неизвестного сообщения для получения его соответствующего открытого текста. Естественно, если ключ отличается для каждого сообщения (например, использование IV), то эта атака не будет работать.

0 голосов
/ 30 мая 2012

При поиске подозрительного ключа шифрования в Google я обнаружил, что разработчик позже (возможно, даже в том же месяце) открыл исходный код Java, который четко идентифицирует строку, которую я нашел в качестве ключа шифрования. Впоследствии он преобразовал ключ в отдельный класс, который он вставил в svn:ignore (и предположительно изменил его; я еще не проверял.)

Оказывается, моя программа дешифрования не совсем соответствовала реализации исходного кода планеты. Вот описание Википедии RCGA PRGA:

i := 0
j := 0
while GeneratingOutput:
    i := (i + 1) mod 256
    j := (j + S[i]) mod 256
    swap values of S[i] and S[j]
    K := S[(S[i] + S[j]) mod 256]
    output K
endwhile

В Visual Basic и Java-коде пропущены первые две строки (i: = 0 и j: = 0).

...