web-dev-qa-db-ja.com

メッセージを読むために2つまたは3つの秘密鍵が必要な暗号化スキームはどれですか。

一部のデータを暗号化して、2人または3人がプライベートシークレットを使用してデータを復号化した場合にのみ読み取れるようにしたい。

複数人の復号化を達成するための最良/最も近代的な方法は何ですか?

私が考えているいくつかの考え

  • X人には、X * N文字の長さのN文字のパスワードがあります

  • PGPまたは一部のPKI/RSAなどでメッセージを再暗号化する

  • 上記の混合...

私が防止したい脅威は、すべての当事者が存在しない状態での暗号化されたメッセージの強制的な復号化または変更です。

4

Shamirの秘密の共有 はありますが、PKIは関係しません。むしろ、シークレットのロックを解除するためにすべてのパスワードを含める必要があることを保証するようなものです。秘密は、この場合、単一の(秘密または対称)鍵である可能性があります。

Googleからのトップヒットを除けば、このスキームの広く受け入れられている実装については知りません。

6
logicalscope

短い答え
実際の暗号化キーとして複数のキーのXORを使用します。それらのキーのそれぞれを当事者に渡します。それらを復号化するには、それぞれがキーを公開する必要があります、XORすべての値をまとめて、復号化します。

長い回答

  • X人には、X * N文字のN文字のパスワードがあります

このスキームの問題は、X-1人が集まった場合、N文字(シェアの最後の部分)をブルートフォースするだけでよいことです。パラメータによっては、これが可能になる場合があります。

あなたが本当に望んでいるのは、X未満の人が解読しようとする場合、彼らが秘密の暗号化キーに関する追加情報を持っていない方法です。これを実現する簡単な方法は、Xパーティのそれぞれに完全にランダムなX * N文字列を与えることです。次に、秘密の暗号化キーをこれらの文字列のXOR=に設定します。X-1パーティが復号化を試みる場合、X * N文字のランダムな文字列をブルートフォースする必要があります。パラメータを正しく設定します(たとえば、X * Nは128ビット長で、暗号化にはAES-128を使用します)。

  • PGPまたは一部のPKI/RSAなどでメッセージを再暗号化する

PKIをバルク暗号化(長いメッセージの暗号化)に使用しないでください。 PKIは通常、(このシナリオでは)キーの配布に使用されます。

これを変更して、代わりにPKIを使用して長さX * NのX秘密鍵を配布するとします(上記と同じ)。次に、C = E(K1、E(K2、E(... E(Kn、M))))を送信します。これは機能しますが、nが大きい場合、計算のオーバーヘッドはかなり大きくなります。 2人または3人の場合は、これで十分でしょう。

しきい値復号

上記は、復号化のためにすべてのX人が存在する必要がある場合にのみ有効です。 Xからのtが必要となるようなものだけが必要な場合はどうでしょうか。これは、Shamir Secret Sharingを使用できるときです(logicalscopeの回答を参照)。

Shamirシークレット共有はt == Xの場合に機能しますが、私が概説した方法ほど単純ではないことに注意してください。

5
mikeazo