Здравствуйте! Интересует такой вопрос: возможно ли зашифровать данные, при этом чтобы энтропия осталась не высокой (скажем в перделах 6.00)?
пределах - уже не в тему флудишь. - извините, забыл пояснить - биты ( с точностью до сотых). Да, уже понял, что можно разбавить чем-нить. А может есть какой-нить такой (хитрый!) алгос, шифрующий так, чтобы не зашкаливала энтропия?
ну я полагаю, энтропия измеряется исключительно по криптованным данным. А алгоритм ее подсчета один единственный например?
Вариант 1. Перестановочные шифры. Они слабже подстановочных, но при таких оригинальных требованиях с твоей стороны, возможно, это то, что тебе подойдет. Вариант 2. Если входной текст имеет "энтропию 6.00" за счет каких-то определенных битов, например, двух-трех старших, то можно шифровать и подстановочным шифром (например, проще всего в режиме гаммирования), но только "изменяющуюся" часть бит. То есть в данном примере младшие 5-6 бит. Вариант 3. Берем английский или русский словарь с лексиконом в 65536 слов. Шифруем данные обычным блочным шифром, затем результат разбиваем на 16-битные блоки и заменяем словами из словаря. Бред получится, но уж зато к энтропии не придерешься. Можно еще заглавные буквы и точки вставлять в среднем раз в 5 слов.
С точки зрения теории - все просто. Есть сообщение, в нем есть полезная информация, и избыточная информация. И та и друга информация определяет энтропию сообщения. При этом обладая априорными знаниями о сообщении, мы можем выделить полезную информацию, отбросив избыточную информацию, при этом общая энтропия уменьшится. Например в сообщении 5 байт, но мы априори знаем, что в сообщении будет либо "true" либо "false", тогда мы можем понизить энтропию сообщения с 5 бит/символ до 0.2бит/символ. С точки зрения практики - сообщение надо заархивировать, удалив избыточность, лучше специальным архиватором, знающим свойства сообщения.
да, а так еще нормальный вариант, конечно, написать алгос разбавления покриптованных данных каким нить однородным мусором. Товарищ interpol тоже писал про эту тему.
Энтропия и ее нормализация Что такое энтропия применительно к программному коду можно найти в гугле и на васме. Вкратце - числовая оценка эффективности использования информационного объема. Измерять ее будем в битах на 1 байт [0..8] с точностью до сотых. В этом нелегком деле нам поможет PEiD который можно скачать известно где. Итак, запускаем PEiD, кидаем на него, к примеру, невинного AcroRd32.exe, жмем " > > > >" и в появившемся диалоге вычисляем значение Entropy тыканием по соответствующей кнопке. Вот у меня, к примеру получилось 5.06 и рядом в скобках вердикт (Not packed). А теперь проделываем ту же операцию с чем-нибудь упакованным тем же UPX'ом - и получаем 7.82 (Packed) Собственно к чему весь этот бред: раз утилита может на основе математической оценки предположить, упакован файл или нет, то почему бы этим не воспользоваться и антивирусу? В данном деле особо отличился лидер по проверке PE-файлов на валидность "антивирус" Avira Antivir. Их последний генерик - ZPack.Gen (по аналогии с XPack.Gen) по наблюдениям выдается исключительно на основе анализа энтропии секции. Т.е. если пакер не определен но энтропия необычно высока - получите клеймо. Логичное решение в виде выжигания напалмом конторы дятлов представляется не слишком эффективным - они не первые и наверняка не последния. Ну а поскольку надо быть на шаг впереди, подумаем о симметричном ответе. Раз не нравится наша энтропия - надо ее улучшить. Т.е. нам надо "разбавить" наш экзе таким образом, чтобы эффективность хранения данных уменьшилась, или, другими словами, добавить большое количество однотипных данных. Просто добавив кусок nop'ов в секцию, мы долго не протянем и вызовем апдейт генерика до уровня удаления однотипного повторяющегося мусора. В таком случае нам надо сделать такой мусор, который никаким описанием с наскока не удалить. В идеале картина, представленная взгляду в Hiew должна выглядеть как равномерно-распределенный код. (Кстати рекомендую провести некоторое время просто разглядывая картинки экзешников в hex-редакторе) И нам определенно не надо выглядеть как архив или как код со вставками в виде архивов или зашифрованных кусков. Т.е. энтропия должна быть по возможности одинакова в различных отдельно взятых кусках кода/файла. Достичь этого достаточно просто - надо все включаемые куски зашифрованных данных "разбавить" мусором (в виде последовательности 00h например) по псевдослучайному алгоритму до тех пор, пока он не будет выглядеть (иметь значение энтропии) как обычный код. Экспериментально установлено что оптимальное значение тут лежит в пределах 6.1-6.8. Сам экзе при запуске будет инициализировать псевдослучайный генератор так, чтобы последовательность чисел, определяющая места вставки мусора, повторилась один-в-один. В итоге весь наш мусор будет удален и можно будет расшифровать блок с секретными данными.
Это бред сивой кобылы. Авира смотрит десятки параметров, на энтропию не обращает внимания (по крайней мере это не решающий фактор). ЗПАК авира выдает по результатам сравнения размеров секций и проверки импорта. Так что цитата блога как минимум не в тему - автор же спрашивает не как разбавить мусором данные, а как шифровать уже с пониженной энтропией на выходе.
//офтоп сам же и говоришь - десятки параметров - так вот скорее сумма их и есть зпак, и в том числе энтропия. Я к тому, что она вполне может быть и решающей.