次の設定があります: A、A '、A' 'を異なるモバイルデバイスとする。彼らは秘密のメッセージMをC、C '、C' 'のすべて(または一部)に送信したいと考えています。メッセージは、しばらくの間それを保管するBに渡され、別のCに渡されます。
現在、Aがメッセージを暗号化し、別のCだけがメッセージを復号化できるような暗号化スキームを探しています。
私の最初のアイデアは、異なるCの公開鍵を単に使用することでした。ただし、Bはしばらくの間、暗号化されたメッセージを保存し、異なる秘密鍵で暗号化されたメッセージの多くのコピーを持っているため、これは効率的ではありません。ストレージ。
私の次のアイデアは、AとCに共通の鍵を使用することでした。これにより、メッセージはこの秘密鍵で暗号化され、この鍵を持たないBに渡されます。ただし、この場合、Bを介してのみ通信するこれらすべての参加者間で秘密鍵を生成する方法、および新しいAまたはCが参加する状況を処理する方法の問題があります。
もう1つのアイデアは、可換暗号化を使用することです。ただし、この場合、AとCはBの信頼性に依存します。AがBのキーでメッセージを暗号化すると、Bはそれを暗号化して保存します。次に、Cの公開鍵で暗号化し、独自の秘密鍵で復号化します。 Bは実際にメッセージを見たことはありませんでしたが、それは可能でした。
すべてのキーマテリアルを簡単に更新し、デバイスに簡単に参加させ、秘密のメッセージの暗号化されたバージョンを1つだけ保存して、Bが読み取れないようにする最も簡単な方法は何ですか?キーマテリアルを簡単に処理できる効率的なマルチパーティ暗号化スキームはありますか?
私はすでにシグナルスキームと呼ばれていました。しかし、私は彼らが使用するアルゴリズムの量に夢中になっています。また、すべての通信がBを通過する必要があるため、私の設定でのキー更新プロセスはより複雑になると思います。
誰かが私の紛らわしい説明を理解し、私がこれをどのように解決できるかについていくつかのアイデアを持っている場合、どんな助けやヒントも非常に高く評価されます!
ではごきげんよう、
ルカ
WhatsAppグループメッセージングと同じ方法を使用できます。
非常に単純化しすぎて、これはあなたができることです:
各メンバーは、_Sender key
_と呼ばれる独自の対称鍵を生成します。
すべてのメンバーは、1対1の暗号化スキームを使用して、送信者キーを互いに共有します。あなたのケースでは、公開鍵で暗号化することでこの鍵を共有できます。したがって、n
のメンバーがいる場合、各メンバーは送信者の鍵を_n-1
_回、個人の公開鍵で暗号化して送信します。鍵交換の総数はn(n-1)
になります。
参加者の公開鍵は、鍵配布サーバーとして機能するBから取得できます。
Aが他のメンバーにメッセージを送信したい場合、Aは自分の送信者キーでメッセージを暗号化し、Bに送信します。
Bは、受信者の数に等しいAのメッセージのコピーを作成し、これを彼らに転送します。これはserver side-fanoutと呼ばれます。
受信者はすでにAの送信者キーを知っているため、Aのメッセージを復号化できます。
誰かが参加すると、彼は自分の送信者キーを生成し、同じ方法で他の人と共有します。他のメンバーも以前と同じように彼と鍵を共有します。キー交換の総数は、新しいメンバーを含むn
メンバーの2(n-1)
になります。
誰かが去った場合、すべてのメンバーが古い送信者キーをクリアし、新しいキーを生成して、再びキーを共有します。グループ内の既存のメンバーn
のキー交換の総数はn(n-1)
になります。
悪意のあるメンバーが他のメンバーになりすますのを防ぐため、各メンバーは秘密鍵を使用してメッセージに署名します。署名を検証するパブリックコンポーネントは、Bから取得できます。
1対1のメッセージングを実装する方法は、これを使用して送信者キーを共有し、マルチパーティ暗号化を初期化できます。 Diffie-Hellmanを使用して送信者キーを共有することもできますが、n
メンバーがある場合は_n-1
_回実行する必要があります。
マルチパーティ暗号化のキーの配布を減らすことについての良い記事はここにあります: Better Encrypted Group Chat