Должен ли я сначала сжимать или шифровать при сжатии и шифровании? - PullRequest
55 голосов
/ 13 января 2011

Если бы я AES-шифровал файл, а затем ZLIB-сжал его, было бы сжатие менее эффективным, чем если бы я сначала сжал, а затем зашифровал?

Другими словами, я должен сначала сжать или зашифровать, или это имеет значение?

Ответы [ 7 ]

60 голосов
/ 13 января 2011

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

32 голосов
/ 24 апреля 2015

Сжатие перед шифрованием, безусловно, более эффективно, но в то же время менее безопасно.Вот почему я не согласен с другими ответами.

Большинство алгоритмов сжатия используют «магические» заголовки файлов, которые могут использоваться для статистических атак.

Например, существует CRIME SSL/ TLS атака .

16 голосов
/ 13 января 2011

Если ваш алгоритм шифрования хорош (а AES с надлежащим режимом цепочки хорош), то ни один компрессор не сможет сжать зашифрованный текст.Или, если вы предпочитаете это наоборот: если вам удается сжать какой-то зашифрованный текст, тогда самое время поставить под сомнение качество алгоритма шифрования ...

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

Поэтому сначала следует сжать данные, , а затем зашифровать результат, а не наоборот.Это то, что делается, например, в формате OpenPGP .

7 голосов
/ 13 января 2011

Сжатие первым.Если вы шифруете, то ваши данные превращаются (по существу) в поток случайных битов.Случайные биты несжимаемы, потому что сжатие ищет шаблоны в данных, а случайный поток по определению не имеет шаблонов.

1 голос
/ 17 октября 2012

Конечно, это важно. Обычно лучше сначала сжать, а затем зашифровать.

ZLib использует кодирование Хаффмана и сжатие LZ77 . Дерево Хаффмана будет более сбалансированным и оптимальным, если оно выполняется, например, на простом тексте, и поэтому степень сжатия будет лучше.

Шифрование может следовать после сжатия, даже если результат сжатия выглядит как «зашифрованный», но его легко обнаружить как сжатый, поскольку файл обычно начинается с PK.

ZLib изначально не обеспечивает шифрование. Вот почему я реализовал ZeusProtection . Исходный код также доступен на github .

0 голосов
/ 14 августа 2014

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

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

0 голосов
/ 20 августа 2012

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

...