web-dev-qa-db-ja.com

GnuPGと同じ鍵で同じファイルを暗号化すると、同じ暗号文が生成されますか?

同じファイルをGnuPGで同じキーを使用して2回暗号化すると、同じ結果が得られますか?それともrsynccryptoのようなセキュリティを向上させるためにいくつかのランダム/ psudeo-ランダムセグメントを使用していますか?

41
Didi Kohen

一般的に、いいえ。同じキーで同じファイルを暗号化しても、次の3つの理由により、同じファイルは生成されません

  • OpenPGP形式 (GnuPGが実装)はハイブリッド暗号化を使用します:ランダムな対称鍵が受信者の公開鍵(RSAまたはElGamalタイプ)で暗号化されます。そして、その対称鍵自体が、対称暗号化アルゴリズムでメッセージ本文を暗号化するために使用されます。ハイブリッド暗号化が使用されるのは、非対称暗号化の範囲が非常に制限されており(たとえば、2048ビットのRSAキーは一度に245バイトを超える暗号化はできない)、オーバーヘッドが(CPUと結果のメッセージサイズの両方で)高いためです。対称キーは送信者側のどこにも保存されないため、毎回新しいランダムキーが作成され、圧倒的な確率で異なります。

  • 非対称暗号化自体はランダム化されています。たとえば、 [〜#〜] rsa [〜#〜] の場合、 padding にはランダムなバイトが含まれます。公開鍵は公開されているので誰でも知っているので、これは「一般に」必要です。暗号化が確定的である場合、攻撃者はメッセージに対して徹底的な検索 /を実行できます。これはOpenPGPの特定のケースでは問題になりません(メッセージはランダムキーであり、それ自体で徹底的な検索を無効にするのに十分な大きさです)。

  • 対称暗号化自体を行う場合、ランダムIVが使用され、呼び出しごとに(圧倒的な確率で)異なります。詳細は セクション5.7 を参照してください。

3番目のポイントは、パスワードベースの暗号化を行う場合にも適用されます(暗号化は、受信者の公開鍵ではなくパスワードで行われます)。パスワードベースの暗号化では、4番目のランダム化も追加されます。これは password-to-key変換の塩 です。

50
Thomas Pornin

GnuPG暗号化は確定的ではありませんしたがって、実行ごとに異なる出力を返します。 暗号化してから復号化するはもちろん決定論的であり、常に同じ内容を返します。

説明:

GnuPGは非対称暗号化を使用します。これは、大量のデータを暗号化するときに低速になります。このため、データを暗号化するために再び使用されるランダムブロック暗号を暗号化するために秘密鍵を使用します。

データを暗号化するたびに、新しいランダムブロック暗号が生成されるため、暗号化されたデータは異なって見えます。

同じドキュメントを2回暗号化し、各暗号化の後にMD5チェックサムを計算しました。

$ gpg --encrypt test.txt
$ md5 test.txt.gpg
MD5 (test.txt.gpg) = f2f6a07e0d7ae9899315d0471c2596bc
$ gpg --encrypt test.txt
$ md5 test.txt.gpg
MD5 (test.txt.gpg) = b57d4c360b1c3c6b2202ce6c3d32cdd8
22
Jens Erat