ファイルをAES暗号化してからZLIB圧縮する場合、最初に圧縮してから暗号化するよりも圧縮の効率は低下しますか?
つまり、最初に圧縮するか、最初に暗号化する必要がありますか、それとも重要ですか?
最初に圧縮します。ファイルを暗号化すると、ランダムデータのストリームが生成されますが、これは圧縮できません。圧縮プロセスは、データ内の圧縮可能なパターンを見つけることに依存しています。
暗号化前の圧縮は確かにスペース効率が良くなりますが、同時に安全性は低下します。だから私は他の答えに同意しません。
ほとんどの圧縮アルゴリズムは「マジック」ファイルヘッダーを使用し、統計攻撃に使用される可能性があります。
たとえば、 CRIME SSL/TLS attack があります。
暗号化アルゴリズムが適切な場合(および適切な連鎖モードを備えたAESが適切な場合)、圧縮プログラムは暗号化されたテキストを圧縮できません。または、他の方法でそれを好む場合:暗号化されたテキストの圧縮に成功したら、暗号化アルゴリズムの品質に疑問を投げる時が来ました…
これは、暗号システムの出力が、決意のある攻撃者であっても、純粋にランダムなデータと見分けがつかないようにする必要があるためです。コンプレッサーは悪意のある攻撃者ではありませんが、より少ないビットで表現できる非ランダムパターンを見つけようとすることで機能します。圧縮プログラムは、暗号化されたテキストでそのようなパターンを見つけることができません。
したがって、最初にデータを圧縮する必要があります、次に結果を暗号化します。これは、たとえば OpenPGP形式 で行われます。
最初に圧縮します。暗号化すると、データは(本質的に)ランダムビットのストリームになります。圧縮はデータ内のパターンを検索し、定義上、ランダムストリームにはパターンがないため、ランダムビットは圧縮できません。
もちろん重要です。通常は、最初に圧縮してから暗号化する方が適切です。
ZLibは HuffmanコーディングとLZ77圧縮 を使用します。ハフマンツリーは、たとえばプレーンテキストで実行される場合、よりバランスが取れて最適になるため、圧縮率が向上します。
圧縮結果が「暗号化」されているように見える場合でも、圧縮後に暗号化が続きますが、ファイルは通常PKで始まるため、圧縮されていることが簡単に検出できます。
ZLibは暗号化をネイティブに提供しません。 ZeusProtection を実装したのはそのためです。ソースコードは github でも入手できます。
コンプレッサーはパターンが明確に定義されたデータセットでのみ動作するのは事実ですが、最初にデータを暗号化することで、時間の複雑さを抑えてコンプレッサーで処理できる適切に定義された非ランダムパターンを生成することができます。
実際的な観点からは、多くのファイルが事前に圧縮されているため、最初に圧縮する必要があると思います。たとえば、ビデオエンコーディングには通常、高圧縮が含まれます。このビデオファイルを暗号化してから圧縮すると、2回圧縮されます。 2回目の圧縮で圧縮率が低下するだけでなく、再度圧縮すると、大きなファイルやストリームを圧縮するために大量のリソースが必要になります。 Thomas Pornin および Ferruccio が述べているように、暗号化されたファイルのランダム性のため、暗号化されたファイルの圧縮はほとんど効果がありません。
最善かつ最も簡単なポリシーは、事前に必要に応じてファイルを圧縮し(ホワイトリストまたはブラックリストを使用)、それから暗号化することです。