圧縮してから暗号化、またはその逆ですか?


88

私は、ネット上のトラフィックを暗号化する(AES256)VPNシステムを書いています(すでに他に1,000,001人がいるのに自分で書くのはなぜでしょうか?

基本的には、あなたの考えを実行して、正しい順序でこれを行うようにします。

現時点では、パケットは送信前に暗号化されていますが、ある程度の圧縮を追加して、データの転送を少し最適化したいと思います。重度の圧縮ではありません-常にCPUを最大限に使いたくはありませんが、圧縮が可能な限り効率的になるようにします。

だから、私の考えでは、暗号化されていないパケットは暗号化されたパケットよりも圧縮されるため、暗号化するにパケットを圧縮する必要がありますか?またはその逆ですか?

おそらく圧縮にはzlibを使用するでしょう。

詳細については、スーパーユーザーブログをご覧ください。


4
「プログラミング」として書く?スタックオーバーフローにより適しています。
スマ

4
私はそれのプログラミングについて尋ねていたら、はい、しかしそうではありません。これは一般的な圧縮であり、暗号化または暗号化してから質問を圧縮します。これは、必要に応じてプレーンファイルでの作業にのみ適用できます。プログラミング側は、なぜ私が質問をしているのかについてのコンテキストにすぎません。
マジェンコ



1
彼らはそこで圧縮について知っていますか?
マジェンコ

回答:


176

暗号化が適切に行われた場合、結果は基本的にランダムなデータになります。ほとんどの圧縮スキームは、何らかの方法で除外できるデータのパターンを見つけることで機能しますが、暗号化のおかげで現在は何もありません。データは完全に非圧縮性です。

暗号化する前に圧縮します。


41
さらに重要なのは、圧縮によりエントロピーが追加されることです。エントロピーの追加は、暗号化に適しています(既知のプレーンテキスト攻撃では解読が困難です)。
-Olli

8
また、暗号化にはリソースのコストがかかり、小さなファイルを暗号化するとリソースの消費が少なくなります。暗号化する前に圧縮してください。
-GAThrawn

9
@Olli-圧縮スキームが既知のテキストを追加する場合は必ずしも必要ではありません。最悪の場合、データの先頭に既知の512バイトのヘッダーを配置し、ブロックモード暗号化を使用していると想像してください。
マーティンベケット

26
@Olliのコメントが間違っているので、なぜそれが支持されるのかわかりません。重要度が大幅に低いだけでなく、半分まともな暗号化ではまったく重要ではないはずです。つまり、暗号化の強度は、メッセージのエントロピーとはまったく無関係である必要があります。
BlueRaja-ダニーPflughoeft

8
圧縮すると、メッセージを暗号化する前にしか実行できませんが、元のメッセージの「圧縮性」に関する情報が漏洩する可能性があることに注意してください。チャネル。すべて0またはメッセージである固定サイズのファイルを検討してください。すべて0のファイルは、適切な圧縮スキームの下でペイロードが小さくなります。ただし、この特定のユースケースでは問題になりません。
エドワードKMETT

22

暗号化の前に圧縮します。圧縮されたデータは、ソースデータのわずかな変更によって大きく変化する可能性があるため、差分暗号解析を実行することは非常に困難です。

また、Mr.Alphaが指摘しているように、最初に暗号化した場合、結果を圧縮するのは非常に困難です。


12
まあ、これは正しいですが、投稿する2時間前に投稿されました... エントロピー
コネラック

3

特定のユースケースに依存する場合でも、Encrypt-then-Compressをお勧めします。そうしないと、攻撃者は暗号化されたブロックの数から情報を漏らす可能性があります。

ユーザーがサーバーにメッセージを送信し、攻撃者が(javascriptなどを使用して)送信する前にユーザーメッセージにテキストを追加する可能性があると想定します。ユーザーは、適切なデータをサーバーに送信し、攻撃者はこのデータを取得したいと考えています。そのため、ユーザーがサーバーに送信するデータに異なるメッセージを追加しようとすることができます。次に、ユーザーは自分のメッセージと攻撃者からの追加テキストを圧縮します。DEFLATE LZ77圧縮を想定しているため、関数は同じ情報を最初の外観へのポインターに置き換えます。したがって、攻撃者がホールプレーンテキストを再現できる場合、圧縮機能はプレーンテキストのサイズを元のサイズとポインターに縮小します。暗号化後、攻撃者は暗号ブロックの数を数えることができるため、追加されたデータがユーザーがサーバーに送信したデータと同じかどうかを確認できます。このケースは少し構築されているように聞こえますが、TLSの重大なセキュリティ問題です。この考え方は、セッションを盗むためにTLS接続でCookieをリークするCRIMEと呼ばれる攻撃で使用されます。

出典:http : //www.ekoparty.org/archive/2012/CRIME_ekoparty2012.pdf


2

私の見解では、メッセージを圧縮すると低次元に投影されるため、ビット数が少なくなります。つまり、圧縮されたメッセージ(ロスレス圧縮を前提とする)は同じビット数の情報を持ちます(削除したものは冗長でした! )したがって、ビットあたりの情報が多くなり、結果としてビットあたりのエントロピーが増えますが、メッセージが圧縮されなかったときと同じ合計エントロピーになります。さて、ランダム性は別の問題であり、圧縮のパターンがモンキーレンチを投げることができる場所です。


1

暗号化の前に圧縮を行う必要があります。ユーザーはデータの転送を待つことに時間を費やしたくありませんが、時間を無駄にせずにすぐにそれを行う必要があります。


1

前に指摘した暗号化前の圧縮。圧縮は、圧縮できる構造を探します。暗号化は、構造が検出されないようにデータをスクランブルします。最初に圧縮することにより、ファイルが小さくなり、転送するペイロードが少なくなります。暗号化は、圧縮されているかどうかに関係なく機能しますが、前述したように、圧縮ファイルで差分暗号化分析を実行することはさらに困難です。


これは、受け入れられた回答と2番目の回答の繰り返しのようです。各回答は、質問に対する実質的に新しい解決策を提供する必要があります。
fixer1234

0

圧縮により、情報エントロピーが削減されます。最大圧縮によりエントロピーが最小になります。完全に暗号化されたデータ(ノイズ)の場合、最大エントロピーと最小エントロピーは同じです。


2
ちょっと待ってください。冗長性が低下するとエントロピーが増加すると考えました。したがって、圧縮によりエントロピーが増加するはずです。
ザンリンクス

いいえ、エントロピーが少ない=パターンが多い。ランダムネスには、ほとんどのエントロピーがあります。
AbiusX

1
しかし、それは情報エントロピーであるため、意味がすべてです。ランダム性は何も意味しないため、適用されません。英語の文は文字を変更できますが、それでも同じことを意味するため、エントロピーが低くなります。圧縮された英語の文は、単一のビットが変更された場合に読めなくなる可能性があります。またはそう思う。
ザンリンクス

エントロピーは、パターンの読み取りと理解の感覚と能力ではありません。圧縮ファイルにはパターンがいっぱいです。
AbiusX

1
@AbiusX:そうです。パターン。そして、パターンが少ないほど、エントロピーが大きくなります。つまり、繰り返されるすべてのパターンを単一のコピーに置き換える圧縮により、エントロピーが増加します。
ザンリンクス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.