次のように機能する強力な(AESなどの)暗号化機能があるかどうか疑問に思います。
- 対称
- 2つのキー:プレーンテキスト-> 2キー->暗号化されたテキスト。ただし、キーの順序は重要ではありません。
Key1(Key2(plaintext))== Key2(Key1(plaintext))例:「可換」(復号化にも必要です。2つのキーが必要です。順序は関係ありません)
ありがとう
次のように機能する強力な(AESなどの)暗号化機能があるかどうか疑問に思います。
Key1(Key2(plaintext))== Key2(Key1(plaintext))例:「可換」(復号化にも必要です。2つのキーが必要です。順序は関係ありません)
ありがとう
これは、任意のブロック暗号化アルゴリズムをCTRモードにすることで簡単に実行できます。単一のキーを使用するCTRモードは次のようになります。
ciphertext = plaintext XOR cipher(key, counter)
カウンターはIVに初期化され、ブロックごとにインクリメントされます。復号化はまったく同じ操作です。そのため、2つのキーを使用して2回CTR暗号化すると、次のようになります。
ciphertext = plaintext XOR cipher(key0, counter) XOR cipher(key1, counter)
また、XORは可換であるため、どちらの順序でも逆にすることができます。
これには、すべてのキーを同じ場所に配置する必要がないという優れた特性があります。考えてみてください。アリス、ボブ、チャーリーは、チャーリーがアリスとボブの両方のデータを二重暗号化するプロトコルに参加しています(このプロトコルは、すべてのポイントツーポイント通信が通常のSSLのようなチャネルを介して保護されていることを前提としています)。
後で、復号化するには:
ここで署名されたタプルとDH交換の目的は、アリスとボブが別のIVを送信することによって、間違ったストリームを解読するようにだまされないようにすることです。これは、使用シナリオには関係ない場合があります。また、チャーリーの役割は、実際の実装ではアリスまたはボブによって演じられる場合があります。
CTRモードの潜在的なセキュリティリスクが心配な場合、もう1つのオプションは、セッションキーでCTRモード暗号化を使用することです。これは、CBCなどのより通常のモードで暗号化するために使用されます。あれは:
sessionkey = RANDOM
IV_0 = RANDOM
IV_1 = RANDOM
enc_sessionkey = sessionkey XOR cipher(key0, IV_0) XOR cipher(key1, IV_0)
ciphertext = enc_sessionkey + IV_0 + IV_1 + cipherCBC(IV_1, sessionkey, plaintext)
他のいくつかの投稿者は秘密共有についてコメントしていますが、復号化に必要なのはキーのサブセットのみであるというプロパティが必要ない場合、これはやり過ぎです。つまり、秘密共有を使用すると、3つのキーで暗号化できますが、必要なのは2つだけです。復号化。すべてのキーを要求したい場合、秘密共有スキームは実際には必要ありません。
これは可換暗号化ではありませんが、秘密共有のための十分に証明されたアルゴリズムがあります(これは「鍵共有」と同じものではないことに注意してください)。
最もよく知られている方法の2つは、ShamirとBlakleyです。一般に、これらのアルゴリズムは秘密を取り、多くの「共有」を生成します。しきい値に達するのに十分なシェアが利用可能になると、シークレットを回復できます。最も単純なケースでは、2つの共有が必要ですが、しきい値はもっと高くなる可能性があります。
シャミールの方法を簡単に説明するために、グラフ上の線について考えてみましょう。ライン上の2つのポイントを知っている場合は、ラインに関するすべてを知っています。対称暗号の暗号化キーのようなバイトの文字列は、基数256の単なる大きな数値です。Shamirのアルゴリズムは、この秘密を線の「y切片」(x = 0の場合の線のy座標)として扱います。次に、線の勾配がランダムに選択されます。x = 1、x = 2、x = 3、…での線のy座標が計算され、各ポイントが異なる株主に与えられます。
これらの株主のいずれか2人が集まった場合、2つのポイントを介してy軸に戻る線を引くことができます。軸と交差する場所のy座標が元の秘密です。ただし、各株主には1つのポイントしかありません。彼ら自身では、元の秘密について何も推測できません。
しきい値は、多項式の次数を増やすことで増やすことができます。たとえば、線の代わりに放物線を使用する場合、2つではなく3つの共有が必要です。
モジュラー演算の使用など、実際の実装にはさらに多くのことがありますが、これがその背後にある概念です。Blakleyのアプローチは似ていますが、平面の交差を使用して秘密をエンコードします。
Shamirのメソッドの実装をオンラインで試すことができます。
可換暗号化アルゴリズムを作成できますが、暗号化方法は可換演算に限定する必要があります。これにより、使用できる暗号化方式が大幅に減少するため、暗号化機能の強度が制限されます。したがって、ハッカーがアルゴリズムを破りたいと思っていて、それが可換である場合、試行する必要のある復号化方法が減るため、アルゴリズムを破る可能性が大幅に向上します。ただし、予想されるハッキングの量によっては、目的に応じて問題がない場合があります。
また、atkが述べたように、「秘密の分割」があなたの目的であるかどうかはわかりません。簡単に見てきましたが、暗号化/復号化アクションを実行するには両方のキーを一緒に提供する必要があるため、(少なくとも基本的なケースでは)操作を個別に実行することはできません。つまり、1人のキーで暗号化を呼び出して、2番目のキーで暗号化を呼び出すことができる結果を取得することはできません。ただし、両方のキーを同時に使用できる場合は、これを試すのが良い方法かもしれません。
あなたは秘密の分裂について話している。はい、それについて多くの研究がありました。ウィキペディアは良い出発点になるでしょう。