web-dev-qa-db-ja.com

データの暗号化と圧縮

送信中に暗号化と圧縮の両方が必要な場合、最も好ましい順序は何でしょうか。

  1. 暗号化してから圧縮
  2. 圧縮して暗号化
48
Ali Ahmad

暗号化する前に圧縮する必要があります。

暗号化は、データを高エントロピーデータに変換します。通常、ランダムストリームと区別がつきません。圧縮は、サイズを縮小するためにパターンに依存しています。暗号化はそのようなパターンを破壊するため、暗号化データに適用すると、圧縮アルゴリズムはサイズを大幅に(もしあれば)削減できません。

攻撃者が圧縮されていない平文のみを制御できる場合、暗号化前の圧縮は、差分暗号解析(およびその他の特定の攻撃)に対する実際の抵抗をわずかに増加させます。

編集:インタラクティブな場合、このアドバイスは実際には不十分なので、私はこの数年後に編集しています。ほとんどの場合、暗号化する前にデータを圧縮しないでください。 「圧縮Oracle」と呼ばれるサイドチャネル攻撃手法を使用すると、攻撃者が対話的に文字列を未知のプレーンテキストデータストリームに配置できる場合に、プレーンテキストデータを推測できます。 CRIMEやBREACHなどのSSL/TLSへの攻撃は、この例です。

65
Polynomial

暗号化の後に圧縮し、その圧縮がうまくいく(つまり、長さが無視できないほど短くなる)場合、暗号化を破棄できますが、それは非常に弱いです。暗号化されたテキストはランダム性と区別できないはずです。暗号化が不十分なデータであっても、通常は圧縮できません。

したがって、暗号化する前に圧縮してください。これが、暗号化を処理するプロトコルが通常圧縮などのサポートを含む理由です。 OpenPGP (セクション5.6)および SSL/TLS 。一部のシナリオでは、圧縮により機密データに関する情報が漏洩する可能性があります(圧縮によってデータの長さが短縮され、暗号化された長さが平文の長さにほぼ一致するため);これが新しい SSL/TLSに対するCRIME攻撃 の背後にある考え方です。


フリンジ例外:メッセージをOpenPGPで暗号化し、結果を「ACSII鎧」にした場合、つまりBase64でエンコードすると、このエンコードによりデータが34%拡大されます。3バイトが4文字になります(奇数の改行)。 [〜#〜] deflate [〜#〜] による圧縮は、この拡大をキャンセルするのに効果的です(ハフマンコードのおかげです)。これは、暗号化後の圧縮の有用性の例ですが、実際には、暗号化よりもBase64よりも圧縮率が高くなります。

25
Thomas Pornin

最初にデータを圧縮してから暗号化することをお勧めします。

  1. 圧縮アルゴリズムは、データ構造の知識から利益を得る可能性があり、その構造は暗号化によって偽装されます。例としては、サウンドデータのみを圧縮できるmp3があります。

  2. より少ないデータを暗号化する必要があります。一方、最初に暗号化してから圧縮すると、速度は向上しません。

8
Raphael Ahrens

どちらでもない:両方を安全に実行するように設計された暗号化ツールを使用して、暗号化を圧縮中にGPG/OpenPGP など。

これは基本的に Thomas Porninの答え より直接的なものなので、急いでいる読者は、Thomas Porninが彼の答えで説明していることの微妙な点を誤解しないでください。質問は誤った二分法を表しています。 OP(およびリーダー)が最初のステップと2番目のステップをgzipgpgのような2つの異なるツールの実行であると考えている場合:

  1. 最初に暗号化する場合、圧縮はあまり効果がありません。また、Base64 34%の「ASCIIアーマー」のインフレーションを絞り出すだけでなく、 @ ThomasPornin と述べています。

  2. 最初に圧縮すると、暗号化の安全性が低下し、@ ThomasPorninが言及した the ones のような攻撃に対して脆弱になります。

2
hobs

暗号化後の圧縮では、サイズが大幅に縮小されないため、データを圧縮する実際の機能が実行されない場合があります。ただし、圧縮後の暗号化はサイズを縮小しますが、CRIMEなどの攻撃が発生する可能性があるため、暗号化が正しく機能しません。

Webリクエストの例として、ヘッダーには秘密のWeb Cookieが含まれているため、暗号化する前にヘッダーを圧縮すると、これらの秘密情報が外部に公開されます。

したがって、ページ内の非秘密データのみを圧縮する選択的圧縮を行うことをお勧めします。その後、暗号化が意味をなし、秘密情報の抽出を防ぎます。

1
user466720