"gpg2"に同じ入力に対して常に同じ出力を生成させるにはどうすればよいですか?

"gpg2"に同じ入力に対して常に同じ出力を生成させるにはどうすればよいですか?

同じ文字列をgpg2複数回暗号化すると、暗号鍵が同じであっても結果が異なります。

$ echo "secret message" | gpg2 --batch --passphrase-file /tmp/key --output - --symmetric > /tmp/r
$ xxd r
00000000: 8c0d 0409 0302 49c1 3718 910a c1ca f3d2  ......I.7.......
00000010: 4401 85a4 6885 26ef 7d4f c403 984d 6c03  D...h.&.}O...Ml.
00000020: 8c68 9ba9 4ea6 b214 2e9c 474a 0666 be52  .h..N.....GJ.f.R
00000030: 5d79 53cd d24b 387f 56e1 3a22 4401 a407  ]yS..K8.V.:"D...
00000040: 881b c641 8b10 b1e7 6662 aaee 3382 7151  ...A....fb..3.qQ
00000050: 565b 172e 74                             V[..t
$ echo "secret message" | gpg2 --batch --passphrase-file /tmp/key --output - --symmetric > /tmp/r
$ xxd r
00000000: 8c0d 0409 0302 dde5 397c 8bfa 4c29 f3d2  ........9|..L)..
00000010: 4401 ca3d bba8 8259 b9e9 7a18 4031 9e86  D..=...Y..z.@1..
00000020: 4861 ddca 8bf3 dbff f4c7 c40e be3f 4092  Ha...........?@.
00000030: 5dec 4dab ef31 3712 1fa3 76e1 4381 ed6f  ].M..17...v.C..o
00000040: bb0d ca49 be0d 4256 9049 2468 07da 3ba7  ...I..BV.I$h..;.
00000050: c338 74e8 d4                             .8t..

gpg2このようなことが起こる理由は走るたびに2つのランダムブロックを使用します。ストリームの先頭に。

gpg2同じ入力に対して常に同じ出力が生成されるようにするにはどうすればよいですか?


なぜこんなことが必要なのかと思う方もいらっしゃるでしょう。実際、私はgpg2バックアップのためにファイルをオフサイトに送信する前にファイルを暗号化します。

ネットワークの問題、リモートサーバーのクラッシュなど、何らかの理由で中断された場合は、大容量ファイルのバックアップを復元できるようにしたいです。決定的な暗号化を使用すると簡単です。アップロードされたバイト数(暗号化されたコンテンツ)を取得し、ファイルを再暗号化してハッシュを確認してください。窒素バイトを保存し、一致する場合は残りのバイトを処理し続けます。ただし、暗号化の結果がわからない場合はアップロードを再開できません。

答え1

あなたはできません。最も一般的に認識されているセキュリティ定義(セマンティックセキュリティと適応型選択暗号文セキュリティなど)は、決定論的暗号化を許可しません。

理由を調べるために、私はあなたに2つのYes / No質問をし、あなたが事前に共有したキーを使って私の答えを決定的に暗号化しているとしましょう。決定論的な暗号化を使用すると、すべての盗聴者は両方の質問に対する答えが同じであることを知ることができます。

もちろん、ニッチなユースケースを狙った安全性の低い暗号化もあります(集約暗号化など)。ただし、gpgなどの一般的な暗号化ツールは汎用目的で使用されるため、より安全なセキュリティを提供する必要があります。

修正する参照が必要な場合は、GPGソースコードをから見ることができますagent/protect.c。 IVが設定されていることがgcry_create_nonceわかり、以下から履歴を見つけることができます。libgcrypt マニュアルように:

いっぱいバッファーそして長さ予測できないバイトです。これはしばしば乱数と呼ばれ、ベクトルとパディングを初期化するためにも使用できます。これは、3つの理由で他のランダム関数とはほとんど独立した追加機能です。一般的なランダムジェネレータの内部状態をよりよく保護し、より良いパフォーマンスを提供し、貴重なエントロピープールを消費しません。

関連情報