web-dev-qa-db-ja.com

圧縮および暗号化する場合、最初に圧縮するか、最初に暗号化する必要がありますか?

ファイルをAES暗号化してからZLIB圧縮する場合、最初に圧縮してから暗号化するよりも圧縮の効率は低下しますか?

つまり、最初に圧縮するか、最初に暗号化する必要がありますか、それとも重要ですか?

55
TachyonImpact

最初に圧縮します。ファイルを暗号化すると、ランダムデータのストリームが生成されますが、これは圧縮できません。圧縮プロセスは、データ内の圧縮可能なパターンを見つけることに依存しています。

61
Ferruccio

暗号化前の圧縮は確かにスペース効率が良くなりますが、同時に安全性は低下します。だから私は他の答えに同意しません。

ほとんどの圧縮アルゴリズムは「マジック」ファイルヘッダーを使用し、統計攻撃に使用される可能性があります。

たとえば、 CRIME SSL/TLS attack があります。

32
maxbublis

暗号化アルゴリズムが適切な場合(および適切な連鎖モードを備えたAESが適切な場合)、圧縮プログラムは暗号化されたテキストを圧縮できません。または、他の方法でそれを好む場合:暗号化されたテキストの圧縮に成功したら、暗号化アルゴリズムの品質に疑問を投げる時が来ました…

これは、暗号システムの出力が、決意のある攻撃者であっても、純粋にランダムなデータと見分けがつかないようにする必要があるためです。コンプレッサーは悪意のある攻撃者ではありませんが、より少ないビットで表現できる非ランダムパターンを見つけようとすることで機能します。圧縮プログラムは、暗号化されたテキストでそのようなパターンを見つけることができません。

したがって、最初にデータを圧縮する必要があります、次に結果を暗号化します。これは、たとえば OpenPGP形式 で行われます。

16
Thomas Pornin

最初に圧縮します。暗号化すると、データは(本質的に)ランダムビットのストリームになります。圧縮はデータ内のパターンを検索し、定義上、ランダムストリームにはパターンがないため、ランダムビットは圧縮できません。

7
Cameron Skinner

もちろん重要です。通常は、最初に圧縮してから暗号化する方が適切です。

ZLibは HuffmanコーディングとLZ77圧縮 を使用します。ハフマンツリーは、たとえばプレーンテキストで実行される場合、よりバランスが取れて最適になるため、圧縮率が向上します。

圧縮結果が「暗号化」されているように見える場合でも、圧縮後に暗号化が続きますが、ファイルは通常PKで始まるため、圧縮されていることが簡単に検出できます。

ZLibは暗号化をネイティブに提供しません。 ZeusProtection を実装したのはそのためです。ソースコードは github でも入手できます。

1
mehi

コンプレッサーはパターンが明確に定義されたデータセットでのみ動作するのは事実ですが、最初にデータを暗号化することで、時間の複雑さを抑えてコンプレッサーで処理できる適切に定義された非ランダムパターンを生成することができます。

0
meenakshi.H.N

実際的な観点からは、多くのファイルが事前に圧縮されているため、最初に圧縮する必要があると思います。たとえば、ビデオエンコーディングには通常、高圧縮が含まれます。このビデオファイルを暗号化してから圧縮すると、2回圧縮されます。 2回目の圧縮で圧縮率が低下するだけでなく、再度圧縮すると、大きなファイルやストリームを圧縮するために大量のリソースが必要になります。 Thomas Pornin および Ferruccio が述べているように、暗号化されたファイルのランダム性のため、暗号化されたファイルの圧縮はほとんど効果がありません。

最善かつ最も簡単なポリシーは、事前に必要に応じてファイルを圧縮し(ホワイトリストまたはブラックリストを使用)、それから暗号化することです。

0
Victor Stoddard