9

正確に 2 つのキー (パスワードベースの可能性があります) を使用してデータ暗号化を実現し、データを復号化するには 2 つのキーのうちの 1 つ (いずれか 1 つ) のみを必要とするための基本は何ですか?

たとえば、データはユーザーのパスワードと会社のパスワードで暗号化され、ユーザーまたは会社はデータを復号化できます。どちらも他のパスワードを知りません。暗号化されたデータのコピーは 1 つだけ保存されます。

公開鍵/秘密鍵という意味ではありません。おそらく対称鍵暗号化を介しており、鍵を XOR して暗号化に使用するようなものかもしれません。

更新:キーの保存をまったく必要としないソリューションも見つけたいと思います。

4

5 に答える 5

21

これが通常行われる方法は、データを暗号化するための単一の対称キーを生成することです。次に、各受信者のキーまたはパスワードを使用して対称キーを暗号化し、受信者が自分で復号化できるようにします。S/MIME (実際には、S/MIME の基になっている暗号化メッセージ構文) は、この手法を使用します。

この方法では、暗号化されたメッセージのコピーを 1 つだけ保存する必要がありますが、そのキーの複数のコピーを保存する必要があります。

于 2008-09-02T05:04:02.670 に答える
6

一般的に言えば、ランダムに生成されたキーでデータを暗号化し、既知のすべてのキーで暗号化されたランダム キーのバージョンを追加します。そのため、有効な鍵を持っている人なら誰でも、データの暗号化に使用された「本物の」鍵を発見できます。

于 2008-09-02T05:01:35.843 に答える
0

より一般的なケースでは、シークレット(このアプリケーションではデータの復号化キー)を共有に分割して、シークレットを回復するためにこれらの共有のしきい値数が必要になるようにすることができます。これは、秘密共有またはn個の共有とtのしきい値、(t、n)しきい値スキームとして知られています。

これを行う1つの方法は、次数t-1の多項式を作成し、秘密を最初の係数として設定し、残りの係数をランダムに選択することです。次に、この曲線上のn個のランダムな点が選択され、共有になります。

于 2008-09-15T20:05:14.780 に答える
0

私はうまくいく解決策を考えたと思います:

D = data to encrypt
h1 = hash(userpassword)
h2 = hash(companyPassword)
k = h1 concat h2

E = function to encrypt
//C is the encrypted data
C = E_h1(h2) concat E_h2(h1) concat E_k(D)

次に、いずれかの人物が相手のハッシュを復号化し、それらを組み合わせて残りのデータを復号化できます。

おそらくこれよりも良い解決策がありますか?

于 2008-09-02T05:16:02.067 に答える