Специалиста по реверс-инжинирингу Анжа Альбертини (Ange Albertini) из компании Corkami в шутку спросили: можно ли сгенерировать картинку JPEG, которая после обработки шифром AES опять превратится в валидный JPEG. Анж принял вызов, а по результатам исследования опубликовал презентацию с объяснением, как это делается с разными форматами.
«Не нужно даже знать AES или JPEG, это слишком сложно, — пишет Альбертини. — мы просто поиграем с кубиками Lego».
AES — это блочный шифр, который полностью меняет шифротекст в результате изменения хотя бы одного байта в оригинальном тексте. Кажется, что никак нельзя контролировать содержимое шифротекста.
Файл определённого формата обычно начинается с сигнатуры (для JPG используется сигнатура xFF или xD8), после которой следуют несколько разделов, среди них есть необходимые разделы, а есть необязательные, затем следует маркер окончания файла. После маркера можно добавлять произвольный контент (junk).
У блочного шифра есть несколько режимов (CBC, OFB, CFD и др.), для которых действует параметр IV, предусматривающий выбор внешних данных для использования в процессе шифрования. Хотя эти данные предполагаются как случайные, но на практике мы можем подсунуть такие данные, что фрагмент А в начале исходного текста всегда будет превращаться во фрагмент B в шифротексте. Таким образом, мы можем контролировать содержимое первого блока, то есть сигнатуру формата файла.
Также мы можем применить функцию decrypt для дешифрования произвольного текста. Tсли нам нужен шифротекст определённого вида (определённая картинка), то мы просто предварительно дешифруем его ключом X, а затем результат будем шифровать тем же самым ключом X, чтобы получить нужный текст. Эти данные внедрим в junk после маркера окончания файла.
Алгоритм действий выглядит примерно таким образом.
Альбертини сумел таким методом зашифровать PDF в PDF и JPG в JPG, PNG в PNG и FLV в FLV, а также ZIP в PNG. Соответствующие примеры файлов и код см. здесь.
Автор: alizar