複数の受信者で公開鍵暗号を使用する

Nov 26 2020

複数の受信者に送信したいメッセージがあります。

受信者の公開鍵ごとにメッセージを個別に暗号化してから、暗号化されたメッセージをそれぞれの受信者に送信できますか?

攻撃者がすべての暗号化されたメッセージを取得し、それらすべてが同じコンテンツを持っているが異なるキーで暗号化されていることを知っている場合、それは攻撃を容易にしますか?

攻撃者がメッセージの1つを復号化した場合、または他の方法でプレーンテキストを取得した場合、他の秘密鍵のいずれかが危険にさらされるのはどうでしょうか。

このシナリオで他の暗号化よりもうまく機能する非対称暗号化の形式はありますか?

回答

10 kelalaka Nov 26 2020 at 14:30

ただし、通常の方法は、純粋ではなく、公開鍵暗号方式で暗号化、に基づいていない、分析するためにあなたの方法の詳細を指定しませんでしたハイブリッド暗号対称鍵は、公開鍵暗号方式で転送され、鍵となります対称鍵暗号で使用されます。

RSAを使用

メッセージを送信したいとしましょう $m$$n$ パーティーはそれぞれ持っています $pub_i$ そして $prv_i$ キー(OAEPでRSAを使用)。

次に、均一なランダムAES256キーを生成します $k$ メッセージをAES-GCMで暗号化し、

$$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$

今暗号化 $k$ 一人一人のために $$\bar k = \operatorname{RSA-OAEP-Enc}(pub_i,k)$$ 各ユーザーを送信します $(\bar k, c, IV, tag)$。これで、各ユーザーは個別にキーを取得できます$k$ メッセージを復号化します。

弱点は、オブザーバーがあなたがすべての人に同じメッセージを送信したことを確認できることです。これを軽減するには、必要に応じて、ユーザーごとに異なるIVを使用します。これにより、暗号化時間が長くなることに注意してください。

他の候補者

RSA-KEM

上記はRSAの直接使用です。通常、RSA-KEMを使用できます(以下に簡単に説明します。詳細はこちら)。

  • ランダムを生成する $r \in [1,n-1]$ HKDFを使用してキーを導出します。
  • 派生キーを使用して、AES-GCMでメッセージを暗号化します
  • を送信します $r$ 教科書付き-RSAと $(c,tag)$

NaCL

NaClにはこれに対する既存の解​​決策があります。認証された暗号化

統合暗号化スキーム(IES)

統合暗号化スキーム(IES)には、乗法バージョンと楕円曲線バージョンもあります。

楕円曲線バージョンECIESでは、最初に、

  • 楕円曲線パラメータ $(q,n,b,G,n,h)$
  • 鍵導出関数(KDF)
  • HMAC-SHA256のようなメッセージ認証コード(またはAES-GCMまたはChaCha20-Poly1305を直接使用)
  • 各ユーザーは $x_i$ 秘密鍵と公開鍵として $P_i = [x_i]G$

その後、メッセージは次のように送信できます

  1. 送信者はランダムな整数を生成します $r \in [1,n-1]$ とセット $R = [r]G$

  2. しましょう $P=(x(P),y(P)) = [r]P_i$ そしてそれを確認してください $P \neq \mathcal{O}$

  3. しましょう $S = x(P)$

  4. 暗号化AES256キーを取得します$$k = \operatorname{HKDF}(S)$$

  5. AES-GCMまたはChaCha20Poly1305で暗号化します。

    $$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$

  6. 送信 $(R,c,IV,tag)$

復号化側

  1. 計算する $P = [x_i]R$ のため $$P = [x_i]R=[x_i r]G =[r x_i] G = [r]P_i $$ 準備された通り
  2. しましょう $S = x(P)$
  3. 暗号化AES256キーを取得します$$k = \operatorname{HKDF}(S)$$
  4. 復号化 $$(m,\perp) = \operatorname{AES-GCM-Dec}(k,IV,c,tag)$$間違ったタグを絶対に受け入れないで、停止してください $(\perp)$

WhatsApp

WhatsAppは同様のアイデアを使用しています。


注:可能であれば、NaCLを使用します

3 user10216038 Nov 26 2020 at 16:30

このシナリオ他の暗号化よりもうまく機能する非対称暗号化の形式はありますか?

昔ながらのGPGはすでにこの機能をサポートしています。

---受信者名パラメータはいくつでも追加できます。すでにGPGに組み込まれていることを除けば、kelalakaで説明されている方法と同じように機能します。

2 Ángel Nov 27 2020 at 01:54

複数の受信者に送信したいメッセージがあります。

罰金

受信者の公開鍵ごとにメッセージを個別に暗号化できますか?

実際、公開鍵を使用してメッセージを暗号化することについて話すとき、それは単純化であり、混合暗号化を使用します。メッセージは、ランダムキーを使用した対称アルゴリズム(AESなど)を使用して暗号化され、そのキーが公開キーで厳密に暗号化されたものになります。

次に、このように暗号化されたメッセージをそれぞれの受信者に送信しますか?

はい。同じランダムキーを使用してすべての受信者に暗号化することも(これにより、ファイルの1つのコピーを全員に送信できるようにする)、完全に再暗号化されたファイルをそれぞれに暗号化できることに注意してください。

攻撃者がすべての暗号化されたメッセージを取得し、それらすべてが同じコンテンツを持っているが異なるキーで暗号化されていることを知っている場合、それは攻撃を容易にしますか?

いいえ(明らかに、適切なアルゴリズムを想定しています)

攻撃者がメッセージの1つを復号化した場合、または他の方法でプレーンテキストを取得した場合、他の秘密鍵のいずれかが危険にさらされるのはどうでしょうか。

そして、いいえ。公開鍵/秘密鍵暗号のポイントは、正確に、公開鍵の知識がプライベート1を損なわないこと。攻撃者は、それらすべての人々に独自の暗号化されたメッセージを作成している可能性があることに注意してください。したがって、平文が知っている無限のメッセージです。

このシナリオで他の暗号化よりもうまく機能する非対称暗号化の形式はありますか?

あんまり。実際にはハイブリッド暗号化が必要ですが、それが適切なものであれば、正確なアルゴリズムは実際には重要ではありません。楕円曲線暗号を使用することをお勧めします。これは、必要なキーとメッセージが短いためですが、RSAは大きいだけでなく、問題ありません。

2 RogerLucas Nov 27 2020 at 22:18

CMS(Cryptographic Message Syntax)は、これを標準でサポートしています。データはランダム対称鍵で暗号化され、この鍵は、メッセージの送信先の受信者の公開鍵ごとに1回暗号化されます。

OpenSSLユーティリティはこれを実装します。メッセージを受信できるようにする受信者ごとに証明書が必要です。

source.bin3人の受信者に安全に送信したいファイルがある場合は、次のようにすることができます。

openssl cms -encrypt -in source.bin -out encrypted.cms -recip friend1.cert -recip friend2.cert -recip friend3.cert 

あなたはそれらを送りますencrypted.cms

あなたの「友達1」は次のことができます。

openssl cms -decrypt -in encrypted.cms -recip friend1.cert -inkey friend1-private.pem -out source.bin

「Friend2」と「Friend3」は、それぞれのキーで同じことを行うことができ、元のデータを取得することもできます。

必要に応じて、データに署名して、自分からのものであることを認証することもできます。

見る: https://www.openssl.org/docs/man1.1.1/man1/cms.html

インターネット上にはOpenSSLとCMSの例とガイダンスがたくさんあります(Stack Exchange / Overflowでもその一部です!:-))