一部のデータを暗号化して、2人または3人がプライベートシークレットを使用してデータを復号化した場合にのみ読み取れるようにしたい。
複数人の復号化を達成するための最良/最も近代的な方法は何ですか?
私が考えているいくつかの考え
X人には、X * N文字の長さのN文字のパスワードがあります
PGPまたは一部のPKI/RSAなどでメッセージを再暗号化する
上記の混合...
私が防止したい脅威は、すべての当事者が存在しない状態での暗号化されたメッセージの強制的な復号化または変更です。
Shamirの秘密の共有 はありますが、PKIは関係しません。むしろ、シークレットのロックを解除するためにすべてのパスワードを含める必要があることを保証するようなものです。秘密は、この場合、単一の(秘密または対称)鍵である可能性があります。
Googleからのトップヒットを除けば、このスキームの広く受け入れられている実装については知りません。
短い答え
実際の暗号化キーとして複数のキーのXORを使用します。それらのキーのそれぞれを当事者に渡します。それらを復号化するには、それぞれがキーを公開する必要があります、XORすべての値をまとめて、復号化します。
長い回答
このスキームの問題は、X-1人が集まった場合、N文字(シェアの最後の部分)をブルートフォースするだけでよいことです。パラメータによっては、これが可能になる場合があります。
あなたが本当に望んでいるのは、X未満の人が解読しようとする場合、彼らが秘密の暗号化キーに関する追加情報を持っていない方法です。これを実現する簡単な方法は、Xパーティのそれぞれに完全にランダムなX * N文字列を与えることです。次に、秘密の暗号化キーをこれらの文字列のXOR=に設定します。X-1パーティが復号化を試みる場合、X * N文字のランダムな文字列をブルートフォースする必要があります。パラメータを正しく設定します(たとえば、X * Nは128ビット長で、暗号化にはAES-128を使用します)。
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の場合に機能しますが、私が概説した方法ほど単純ではないことに注意してください。