Стискати, а потім шифрувати чи навпаки?


88

Я пишу систему VPN, яка шифрує (AES256) свій трафік через мережу (Чому пишу мою власну, коли вже є 1 000 001 інших? Ну, моя спеціальна для конкретного завдання, яке не підходить жодному з інших).

В основному я хочу провести своє мислення повз вас, щоб переконатися, що я роблю це в правильному порядку.

На даний момент пакети просто шифруються перед надсиланням, але я хочу додати до них певний рівень стиснення, щоб трохи оптимізувати передачу даних. Не сильне стиснення - я не хочу постійно збільшувати процесор, але хочу переконатися, що стиснення буде максимально ефективним.

Отже, на мій погляд, я повинен стискати пакети перед шифруванням, оскільки незашифрований пакет буде стискати краще, ніж зашифрований? Або навпаки?

Я, ймовірно, буду використовувати zlib для стиснення.

Детальніше читайте в блозі Super User .


4
Писати як "програмування"? Тоді краще підходить для Stack Overflow.
Сума

4
Якби я питав про програмування цього, так, але я ні. Це загальний компрес, потім зашифруйте або зашифруйте, а потім стисніть запитання, яке може стосуватися просто роботи з простими файлами, якщо ви хочете. Сторона програмування - це просто контекст, чому я задаю це питання.
Маєнко


Напевно, питання, найкраще призначене для security.stackexchange.com
Джефф Ферланд

1
Вони знають про стиснення?
Majenko

Відповіді:


176

Якщо шифрування виконано належним чином, результат в основному є випадковими даними. Більшість схем стиснення працюють, знаходячи у ваших даних шаблони, які можна певним чином врахувати, і завдяки шифруванню зараз їх немає; дані є абсолютно нестислимими.

Стисніть перед шифруванням.


41
Ще важливіше: стиснення додає ентропії. Додавання ентропії добре для шифрування (важче зламати з відомими атаками прямого тексту).
Оллі

8
Крім того, шифрування ресурсів витрат, шифрування меншого файлу потребуватиме менше ресурсів. Тому стискайте перед шифруванням.
GAThrawn

9
@Olli - не обов'язково, якщо схема стиснення додає відомий текст. У гіршому випадку уявіть, якби він розмістив відомий 512-байтний заголовок на передній частині даних, і ви використовували шифрування блочного режиму.
Мартін Бекетт

26
Я не впевнений, чому коментар @ Оллі буде сприйнятий, оскільки він невірний; Мало того, що це суттєво менш важливо, для будь-якого напівпристойного шифрування воно має бути зовсім не важливим . Тобто, сила шифрування повинна бути абсолютно не пов'язана з ентропією повідомлення.
BlueRaja - Danny Pflughoeft

8
Якщо ви стискаєте його взагалі, це можна зробити справді лише перед шифруванням повідомлення, але майте на увазі, це може просочити інформацію про «стисливість» вихідного повідомлення, тому ви хочете врахувати, чи є наслідки для цієї сторони канал. Розглянемо файл фіксованого розміру, який є або всіма 0 або повідомленнями. Усі 0 файли призведуть до меншої корисної навантаження за будь-якої розумної схеми стиснення. Хоча це не проблема в цьому конкретному випадку використання.
Едвард КМЕТТ

22

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

Крім того, як зазначає містер Альфа, якщо шифрувати спочатку, результат дуже важко стиснути.


12
Ну, це правильно, але було розміщено за 2 години до того, як ви опублікували ... Ентропія
Конерак

3

Навіть якщо це залежить від конкретного випадку використання, я б радив Encrypt-then-Compress. В іншому випадку зловмисник може витікнути інформацію з кількості зашифрованих блоків.

Ми передбачаємо, що користувач надсилає повідомлення серверу та зловмиснику з можливістю додавати текст до повідомлення користувача перед відправкою (через javascript, наприклад). Користувач хоче надіслати деякі розумні дані на сервер, а зловмисник хоче отримати ці дані. Тож він може спробувати додати різні повідомлення до даних, які користувач надсилає на сервер. Потім користувач стискає своє повідомлення та доданий текст від зловмисника. Ми припускаємо стиснення LZ77 DEFLATE, тому функція замінює ту саму інформацію покажчиком на першу появу. Отже, якщо зловмисник може відтворити простий текст з отворами, функція стиснення зменшує розмір простого тексту до початкового розміру та покажчика. А після шифрування зловмисник може порахувати кількість блоків шифрів, щоб він міг бачити, чи були його додані дані такі, як дані, які користувач надсилав на сервер. Навіть якщо цей випадок здається трохи побудованим, це серйозна проблема безпеки в TLS. Ця ідея використовується атакою під назвою CRIME для витоку файлів cookie у TLS-з'єднанні для крадіжки сеансів.

джерело: http://www.ekoparty.org/archive/2012/CRIME_ekoparty2012.pdf


2

На мою думку, коли стискаєш повідомлення, ти проектуєш його на менший вимір, і для цього є менше біт, а це означає, що стиснене повідомлення (якщо вважати компресію без втрат) має ту саму інформацію в меншій кількості біт (ті, яких ти позбувся, були зайвими! ) Отже, у вас є більше інформації за біт і, отже, більше ентропії на біт, але така ж загальна ентропія, як і раніше, коли повідомлення не було стиснене. Тепер випадковість - інша справа, і саме там шаблони стиснення можуть кинути мавповий ключ.


1

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


1

Стиснення перед шифруванням, як було зазначено раніше. Стиснення шукає структуру, яку вона може стиснути. Шифрування розшифровує дані, щоб уникнути виявлення структури. Спершу стискаючи, ви набагато більше шансів на те, що у вас буде менший файл і, таким чином, менше завантаження. Шифрування виконає свою роботу незалежно від того, стиснуте це чи ні, і, як уже було зазначено раніше, швидше за все буде складніше виконати диференціальний криптоаналіз на стисненому файлі.


Здається, це повторення прийнятої та другої відповідей. Кожна відповідь повинна сприяти принципово новому вирішенню питання.
fixer1234

0

Стиснення зменшує ентропію інформації. Максимальне стиснення робить ентропію мінімальним. Для ідеально зашифрованих даних (шуму) максимальна та мінімальна ентропія однакові.


2
Зачекайте, чи це у вас немає назад? Я думав, що ентропія збільшується, коли зменшується надмірність. Тому стиснення повинно посилювати ентропію.
Зан Лінкс

Ні, менша ентропія = більше моделей. Випадковість має найбільшу ентропію.
AbiusX

1
Але це інформаційна ентропія, тому мова йде про значення. Випадковість нічого не означає, тому вона не застосовується. У англійському реченні може бути змінено літери і все ще означати те саме, що має низьку ентропію. Стиснене англійське речення може бути нечитабельним, якщо один біт змінюється, щоб його було найбільше. Або так я думаю.
Зан Лінкс

Ентропія - це не про сенс і здатність читати чи розуміти, все про закономірності. Стислі файли рясніють шаблонами.
AbiusX

1
@AbiusX: Правильно. Візерунки. І чим менше моделей, тим більше ентропії. Що означає, що стиснення, яке замінює всі повторювані шаблони однією копією, збільшує ентропію.
Зан Лінкс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.