5

私はJava(私の好みのプログラミング言語)でいくつかの基本的な暗号化技術を試してきましたが、2つのクライアントペア間で共有秘密を生成するためにべき乗剰余を使用する簡単な例があります。

しかし、共有シークレットが与えられた場合、このシークレットを実際に使用して、ネットワーク経由で送信されるデータを暗号化/復号化またはスクランブル/スクランブル解除するための、実装が簡単な(まだ安全な)方法は何ですか?

たとえば、文字列がある場合:

"So long, and thanks for all the fish"

そして共有秘密(BigInteger):

1110278255331388386297296974141977

共有シークレットがないと仲介者が解釈できないようにしながら、クライアントがお互いを理解できるように文字列をネットワーク経由で送信するにはどうすればよいでしょうか。

私は完成した実装を求めているのではなく、使用できるアルゴリズム/技術へのアイデアや参照だけを求めています。また、これは私自身の教育目的の単なる副次的なプロジェクトであるため、既存のプログラムまたはAPI(公開/秘密鍵など)に依存することも避けています。

4

1 に答える 1

3

あなたが求めていることを行う標準的な方法があり、それはパスワードベースの鍵導出と呼ばれます。安全な対称暗号化アルゴリズムを使用する必要があります。もちろん、RSAのような非対称のものを選ぶこともできますが、共有秘密を使用すると、冗長になります。

ただし、共有シークレットを直接使用することは望ましくありません。

  1. 共有シークレットのサイズがキーとして使用するには不適切である可能性があります。たとえば、AESは、適切な選択として、128ビットと256ビットのキーを受け入れますが、共有シークレットは適切に一致しない場合があります。
  2. 選択する対称アルゴリズムの鍵は十分に安全である必要があります。つまり、共有秘密にはない安全なレベルのランダム性が必要です。

これはまさに、PBKDF2(パスワードベースの鍵導出関数2)のようなアルゴリズムが発明された場合です。PBKDF2はすでに標準のJavaに実装されており、使用することができます。この場合は単に共有秘密である「パスフレーズ」に基づいて、任意のサイズの安全なキーを生成します。これらのアルゴリズムファミリーには、キーを導出するためにハッシュ関数が適用される回数を示す反復パラメーターがあります。必ず数千のような高い数値に設定してください。

ただし、この場合のセキュリティ(送信データの機密性と整合性)は、共有秘密が実際に秘密であることに依存していることに注意してください。どのように生成しているかはわかりませんが、プロセスが安全であることを確認する必要があります。Diffie-HellmanKeyExchangeが良い例です。これに慣れていない場合は、プロセスが安全であることを確認するために何が行われているのかを確認することをお勧めします。

コメントですでに述べられているように、実用的なアプリケーションのために暗号化を革新する必要はありません(また、そうすべきではありません)。すでに実装され、安全であることが証明されている必要なものはすべて見つかります。しかし、私の最後の文を一粒の塩で取ってください。

于 2012-10-29T23:33:39.060 に答える