Данная история произошла давно, а началась еще раньше. Играл я как-то в одну браузерную игру, где типа пошаговая стратегия с элементами ПвП, в основном юниты с героев меча и магии, хоть и переделаны некоторые. Но там есть такой аспект как рулетка(на игровые деньги, вывод игровых денег не предусмотрен). И как уважающая себя рулетка - там есть система проверки "честности". На некоторых сайтах в этих целях публикуют хеш "соленного" выпадения, и перебрать все варианты(выпадение+соль) за разумное время не получится. Но в то же время можно после публикации выпадения и соли - проверить что игра "честная".
Но тут прибегли к RAR архивам. Которые до сих пор генерируются и публикуются вручную, что поделать. Но система такая - заранее можно скачать запароленный архив с текстовым файликом выпадений за месяц! и по истечении месяца опять же надо ждать пароль, открыть архив скачанный заранее(чтобы админы не перезалили архив), промотать текстовый файл до нужного времени и сравнить число из файла с выпавшим ранее. Муторно, и никто не проверяет. Сам пароль длинный, и состоит из разных символов, цифр букв - перебрать - не вариант.
Но есть одно НО. Точнее было. Они использовали старенький WinRAR 3.0 без опции шифрования метаданных. Это такая опция которая шифрует не только содержимое файлов, но и сам список файлов, их название, размер, и т.д. и т.п. а самое главное CRC32 оригинального файла. К счастью для чайников, в 5-ой версии винрара, есть защита от дураков, и даже без этой опции - контрольная сумма будет изменена в зависимости от пароля.
А без этой опции, получалось:
список файлов, в данном случае только 1, размер, сжатый размер, имя файла а также Checksum=2EDD73BB. Путем нехитрого перебора хешей с такой длинной и соответственно хешей самого файла(для проверки использовал архивы с уже известным паролем) выяснил что это самый обычный CRC32. Но все еще есть около 130Кб данных, которых никак не получить из контрольной суммы.
Теперь сам файл. Выглядит примерно так:
опять же ничего сложного. Номер "спина" - последовательный - можно нарисовать заранее.
Год-месяц-день время - минута - опять же можно нарисовать заранее.
И выпадения. Их слишком много чтобы перебрать. Но можно отключить жадность и перебрать лишь несколько спинов. А остальные - собирать автоматическим скриптом(на VPS, скрипт на пару строк, кидаешь в cron - и вуаля). Потом грубый перебор всех вариантов, в самом конце месяца. Хочешь 1 спин - 38 вариантов. Хочешь 2 спина - 1444. Мой старенький комп осилил 5 спинов минуты за 3, и уже для некоторых тестовых месяцев выдавал коллизии (т.е. два варианта файлов с разницей лишь в конце последних 5-и строк - но с тем же CRC). Тут еще помог тот факт что CRC считывает файл от начала и до конца по 1 блоку, т.е. можно считать промежуточный CRC до последней известной строки, и потом инициализировать CRC с этим значением для расчета финальной суммы. Которая сравнивается с известным Checksum-ом. Совпадение - идем срывать куш.
Это в теории. На практике игру выключили на 20 минут(2 спина) и в истории игр эти выпадения не были. То есть надо было перебрать еще 2 строки, которые дают правильную, но на фиг никому не нужную информацию. С этим скрипт тоже справился. Поднял кончено немного игровых денег(которых при усиленной игре я бы может за год заработал - и то не факт), а потом администрация по тихому "пофиксила" баг:
> В конце файла генерируется случайная строка => взлом по контрольной сумме уже невозможен
> Начали шифровать метаданные => саму контрольную сумму даже не узнать
> Перешли на последнюю версию винрара, чтобы нечаянно не забыть поставить галочку(там еще размер ключа AES поменялся, но это несущественно)
P.S. У меня нет идей как возможно взломать RAR 5.x, даже зная большую часть содержимого. Там еще такая фишка есть, что тот же файл, с тем же паролем и алгоритмом на выходе даст разные(при двоичном сравнении) файлы, видимо добавляют шумы которые убираются при дешифровке, или каждый раз генерируется случайный вектор инициализации для генерации ключей например. Но так или иначе - грубый перевод паролей вряд ли поможет.