web-dev-qa-db-ja.com

2つの参加者間でナンスを同期する方法は?

私は現在、暗号化にはナンスを必要とし、論理的には復号化にも必要な対称アルゴリズムを使用しています。

ただし、両方のクライアントでnonceを同期する方法について少し混乱しています。

私のナンスが0から始まり、両側でハードコーディングされているとしましょう。

次に、データを暗号化し、ナンスを増やして、再利用によるリークを回避します。暗号化された値がクライアントに送信され、データが復号化され、ナンスも増加します。これで、両方のパーティのナンスが1になり、次の暗号化/復号化サイクルに備えます。

予期しないことが起こっていない限り、これはうまく機能します。

サーバーがナンス5で暗号化しているとしましょう。ナンスは後でナンスを6に増やしますが、なんらかの理由で接続が失敗し、値が送信されません。他の参加者は更新を受信せず、ナンスは5のままです。

次に何かを暗号化するとき、エンクリプターはnonce 6を使用し、それを増やして値を送信します。ただし、復号化側は5のノンスのままなので、復号化は失敗します。

このサイクルから抜け出すにはどうすればよいですか? nonceを安全に同期させるにはどうすればよいですか。接続が少なくとも1回失敗すると完全な失敗を回避できますか?すべてのデータパッケージで現在のナンスを送信するだけで安全ですか?他のアプローチはありますか?

1
Sossenbinder

最も簡単な解決策は、各メッセージとともにナンスを送信することです。 nonceが秘密である必要はありません。実際、攻撃者が記述しているプロトコルでは、とにかくnonceを推測できる可能性があります。 nonceを送信するだけの場合、同期の必要はありません。サーバーが実行する必要があるのは、nonceを再利用しないことを保証することだけです。

文字通り完全なノンスを一緒に送信する必要はないことに注意してください。完全なノンスを再構築するために使用できる、送信可能な任意の値が送信されます。たとえば、nonceにカウンターを使用している場合、カウンターのコンパクトな可変長エンコーディングを使用しても問題ありません。

2人の参加者間の同期の必要性を減らすために検討する必要のある他のトリックがあります。たとえば、通信が全二重の場合(つまり、両方の参加者が送信者と受信者の役割を代替する場合)、次のいずれかを実行できます。

  1. 通信の方向ごとに別々のキーを使用する-アリスはキー#1を使用してボブへのメッセージを暗号化し、ボブはキー#2を使用してアリスへのメッセージを暗号化します。そうすれば、どちらかが他と同じナンスを誤って使用しても、異なるキーを使用するため問題はありません。
  2. 当事者にノンススペースの異なるサブセットを使用させる。たとえば、サーバーはメッセージを暗号化するときに偶数のカウンター値のみを使用し、クライアントは奇数のカウンター値のみを使用する場合があります。

これらの追加の提案は、質問とテーマを共有しています:同期への依存は危険です。理想的には、プロトコルの参加者が相手の状態を知らなくても安全に行動できることを確認する必要があります。あるいはさらに悪いことに、あなたは彼らに安全に行動してほしい相手が実際に敵であったとしても

2
Luis Casillas