Kompresować, a następnie szyfrować lub odwrotnie?

88

Piszę system VPN, który szyfruje (AES256) jego ruch w sieci (po co pisać własne, skoro 1000 000 innych już tam jest? Cóż, mój jest specjalny do konkretnego zadania, którego żaden inny nie pasuje).

Zasadniczo chcę przebiec obok ciebie, aby upewnić się, że robię to w odpowiedniej kolejności.

W tej chwili pakiety są po prostu szyfrowane przed wysłaniem, ale chcę dodać do nich pewien poziom kompresji, aby nieco zoptymalizować przesyłanie danych. Nie ciężka kompresja - nie chcę cały czas maksymalizować procesora, ale chcę się upewnić, że kompresja będzie tak wydajna, jak to możliwe.

Więc myślę, że powinienem kompresować pakiety przed szyfrowaniem, ponieważ pakiet nieszyfrowany będzie kompresował się lepiej niż pakiet zaszyfrowany? Albo na odwrót?

Prawdopodobnie będę używał zlib do kompresji.

Przeczytaj więcej na blogu Super User .

Majenko
źródło
4
Pisanie jako „programowanie”? W takim przypadku lepiej byłoby zastosować przepełnienie stosu.
Suma,
4
Gdybym pytał o programowanie, tak, ale nie jestem. Jest to ogólny kompres, a następnie zaszyfrowany lub zaszyfrowany, a następnie skompresowany pytanie, które można zastosować do pracy z zwykłymi plikami, jeśli chcesz. Strona programistyczna jest tylko kontekstem, dla którego zadaję pytanie.
Majenko,
Zobacz także: stackoverflow.com/questions/4676095 stackoverflow.com/questions/4399812
BlueRaja - Danny Pflughoeft 15.03.11
Prawdopodobnie pytanie najlepiej nadaje się do security.stackexchange.com
Jeff Ferland
1
Oni wiedzą o kompresji, prawda?
Majenko,

Odpowiedzi:

176

Jeśli szyfrowanie jest wykonane poprawnie, wynikiem są w zasadzie losowe dane. Większość schematów kompresji polega na znajdowaniu w danych wzorców, które można w jakiś sposób rozłożyć na czynniki, a dzięki szyfrowaniu nie ma ich obecnie; dane są całkowicie nieściśliwe.

Kompresuj przed zaszyfrowaniem.

Pan Alpha
źródło
41
Ważniejsze: kompresja dodaje entropię. Dodanie entropii jest dobre dla twojego szyfrowania (trudniejsze do złamania przy znanych atakach zwykłego tekstu).
Olli,
8
Ponadto szyfrowanie kosztuje zasoby, szyfrowanie mniejszego pliku zajmie mniej zasobów. Więc skompresuj przed szyfrowaniem.
GAThrawn
9
@ Olli - niekoniecznie, jeśli schemat kompresji dodaje znany tekst. W najgorszym przypadku wyobraź sobie, że umieściłby na przedniej stronie znany nagłówek 512 bajtów, a używasz szyfrowania w trybie blokowym.
Martin Beckett,
26
Nie jestem pewien, dlaczego komentarz @ Olli zostałby pozytywnie oceniony, ponieważ jest niepoprawny; jest nie tylko znacznie mniej ważne, ale w przypadku każdego na wpół przyzwoitego szyfrowania nie powinno być wcale ważne . Oznacza to, że siła szyfrowania powinna być całkowicie niezwiązana z entropią wiadomości.
BlueRaja - Danny Pflughoeft
8
Jeśli kompresujesz w ogóle, można to naprawdę zrobić tylko przed zaszyfrowaniem wiadomości, ale pamiętaj, że może to wyciec informacji o „ściśliwości” oryginalnej wiadomości, więc powinieneś rozważyć, czy są jakieś konsekwencje po tej stronie kanał. Rozważ plik o stałym rozmiarze, który jest albo zerami, albo wiadomością. Plik „0” spowoduje mniejszy ładunek w dowolnym rozsądnym schemacie kompresji. Prawdopodobnie nie występuje problem w tym konkretnym przypadku użycia.
Edward KMETT,
22

Kompresuj przed szyfrowaniem. Skompresowane dane mogą się znacznie różnić w przypadku niewielkich zmian w danych źródłowych, co bardzo utrudnia przeprowadzenie różnicowej kryptoanalizy.

Ponadto, jak zauważa Mr.Alpha, jeśli najpierw zaszyfrujesz, wynik jest bardzo trudny do skompresowania.

Juancho
źródło
12
Cóż, to prawda, ale został opublikowany 2 godziny przed opublikowaniem ... Entropy
Konerak
3

Nawet jeśli zależy to od konkretnego przypadku użycia, radziłbym Encrypt-then-Compress. W przeciwnym razie osoba atakująca może wyciec informacje z liczby zaszyfrowanych bloków.

Zakładamy, że użytkownik wysyła wiadomość na serwer i atakujący z możliwością dołączenia tekstu do wiadomości użytkownika przed wysłaniem (np. Przez javascript). Użytkownik chce wysłać pewne sensowne dane na serwer, a atakujący chce je uzyskać. Może więc spróbować dołączyć różne wiadomości do danych wysyłanych przez użytkownika na serwer. Następnie użytkownik kompresuje swoją wiadomość i dołączony tekst od atakującego. Zakładamy kompresję DEFLATE LZ77, więc funkcja zastępuje te same informacje wskaźnikiem do pierwszego pojawienia się. Jeśli więc osoba atakująca może odtworzyć zwykły tekst dziury, funkcja kompresji zmniejsza rozmiar zwykłego tekstu do oryginalnego rozmiaru i wskaźnika. Po szyfrowaniu atakujący może policzyć liczbę bloków szyfrów, dzięki czemu może zobaczyć, czy jego dołączone dane były takie same, jak dane wysłane przez użytkownika na serwer. Nawet jeśli ta sprawa wydaje się nieco skonstruowana, jest to poważny problem bezpieczeństwa w TLS. Pomysł ten jest wykorzystywany przez atak o nazwie CRIME do wycieku plików cookie w połączeniu TLS w celu kradzieży sesji.

źródło: http://www.ekoparty.org/archive/2012/CRIME_ekoparty2012.pdf

Tobias Braun
źródło
2

Moim zdaniem, kiedy kompresujesz komunikat, wyświetlasz go do niższego wymiaru, a zatem jest mniej bitów, co oznacza, że ​​skompresowany komunikat (zakładając bezstratną kompresję) zawiera te same informacje w mniejszej liczbie bitów (te, których się pozbyłeś, były zbędne! ) Więc masz więcej informacji na bit, a co za tym idzie więcej entropii na bit, ale taką samą całkowitą entropię, jak poprzednio, gdy wiadomość nie była kompresowana. Teraz losowość to kolejna sprawa i właśnie tam wzorce kompresji mogą rzucić klucz małpki.

Prof
źródło
1

Kompresję należy wykonać przed szyfrowaniem. użytkownik nie chce tracić czasu na przesyłanie danych, ale musi to zrobić natychmiast, bez marnowania czasu.

sqlchild
źródło
1

Kompresja przed szyfrowaniem, jak wskazano wcześniej. Kompresja szuka struktury, którą może skompresować. Szyfrowanie szyfruje dane, aby uniknąć wykrycia struktury. Kompresując najpierw, znacznie bardziej prawdopodobne jest, że będziesz mieć mniejszy plik, a tym samym mniejszą ładowność do przesłania. Szyfrowanie wykona swoje zadanie bez względu na to, czy jest skompresowane czy nie, i, jak już wspomniano wcześniej, prawdopodobnie trudniej będzie przeprowadzić różnicową kryptoanalizę w skompresowanym pliku.

Zawsze się uczę
źródło
To wydaje się być powtórzeniem przyjętych i drugich odpowiedzi. Każda odpowiedź powinna stanowić merytorycznie nowe rozwiązanie pytania.
fixer1234
0

Kompresja zmniejsza entropię informacji. Maksymalna kompresja powoduje, że entropia jest minimalna. Dla doskonale zaszyfrowanych danych (szumów) maksymalna i minimalna entropia jest taka sama.

AbiusX
źródło
2
Czekaj, nie masz tego do tyłu? Myślałem, że entropia wzrosła wraz ze spadkiem redundancji. Dlatego kompresja powinna zwiększyć entropię.
Zan Lynx,
Nie, mniej entropii = więcej wzorów. Losowość ma największą entropię.
AbiusX
1
Ale jest to entropia informacji, więc chodzi przede wszystkim o znaczenie. Losowość nic nie znaczy, więc nie ma zastosowania. W zdaniu angielskim litery mogą ulec zmianie i nadal oznaczają to samo, więc ma niską entropię. Skompresowane zdanie angielskie może być nieczytelne, jeśli zmieni się jeden bit, więc ma najwięcej. A przynajmniej tak mi się wydaje.
Zan Lynx,
Entropia nie polega na sensie i umiejętności czytania ani rozumienia, ale na wzorcach. Skompresowane pliki są pełne wzorców.
AbiusX 16.03.11
1
@AbiusX: Racja. Wzory Im mniej wzorów, tym więcej entropii. Co oznacza, że ​​kompresja, która zastępuje wszystkie powtarzające się wzorce pojedynczą kopią, zwiększa entropię.
Zan Lynx,