キーの秘密性とアルゴリズムの秘密性


8

それはよく知られている声明です

暗号化セキュリティは、秘密アルゴリズムではなく秘密鍵に依存する必要があります。」

詳細についてお伺いします。そして、それらの違いは何ですか?

マルチユーザーシステムの場合、すべてのユーザーペアに対して明確なアルゴリズムを生成するよりも、キーを生成する方が圧倒的に簡単であることは明らかです(ユーザーの1つのペアであっても、キーを更新する方が簡単であると主張できます)。

しかし、それは唯一の議論ですか?

つまり、定義すると

AlgorithmA = AlgorithmX + key A
AlgorithmB = AlgorithmX + key B

その場合、キーの変更はアルゴリズムの変更と変わりません。

私が見る唯一の違いは、新しいユーザー/キーのペアの場合です

  • 秘密鍵の場合、ほとんどのアルゴリズム構造は一定のままですが

  • 秘密のアルゴリズムの場合、ほとんどのアルゴリズム構造を変更する必要があります

しかし、限界はどこですか?「ほとんど」の意味?

この区別が通常言及される理由を理解するために、より多くの見解と手がかりを持ちたいと思います。


1
これはケルクホフスの原理として知られています。
Gilles 'SO-悪をやめる'

回答:


4

問題の定義

暗号化の目標は、それによってプロセスを近似することです

crypt(x)

xに関する情報を伝えませんが、次のようdecryptな関数が存在します

decrypt(crypt(x)) == x

解読と暗号化が同じプログラムの同じ実行でのみ行われた場合、隠し状態を使用してこれを完全に実装できます:

var map = {};  // A hidden hashmap.

function crypt(x) {
  var k = unique_unforgeable_value();
  map[k] = x;
  return k;
}

function decrypt(k) { return map[k]; }

しかし実際には、cryptdecrypt私たちは近似する必要があるので、異なるプログラムや、同じプログラムの異なる実行によって呼び出されcrypt、その出力はランダムビットと区別できない決定的関数を使用して-それがなければならない非圧縮性ので、そこ(シャノンコーディング意味で) xに関する情報を収集するために使用できる追加の構造ビットはありません。

アルゴリズムは高度に構造化されているため、圧縮可能です。したがって、必要な決定論を維持しながら、ランダム性を明らかにする方法が必要です。decryptcrypt=identity

回答

非圧縮性の秘密を持つ単純な圧縮性アルゴリズムをカリー化することによって

crypt = crypt_algo(secret)
decrypt = decrypt_algo(secret)

上記の目標を概算できます。 cryptdecryptはいえcrypt_algo、秘密の情報量が多いため、情報量がdecrypt_algo多く、情報量が少ない。

secretこれが機能するためには、攻撃者が近づかないようにする必要があります。このアルゴリズムは、カリー化された関数の情報コンテンツのごく一部を提供するだけなので、秘密にしておく必要はありません。

警告

「暗号化セキュリティは、秘密アルゴリズムではなく秘密鍵に依存する必要があります。」

一部ではなく同意します。

両方を秘密にしておくことである程度の多層防御を得ることができますが、テストcrypt_algoは難しいため、アマチュアが社内で開発した秘密のアルゴリズムは、攻撃を受けた場合、多数の人が注意深く検討したアルゴリズムよりもはるかに悪かったプロの暗号技術者。これが、覆い隠しによるセキュリティが当然のように悪い名前を得ている理由です。そこでの「あいまいさ」とは、キーを適切に保護する代わりに、アルゴリズムを秘密にしようとする試みを指します。


これは正解だと思います。アルゴリズムには構造があり、キーにはありません。それがキーです=)
Hernan_eche

5

キーと適切なアルゴリズムを区別したいのは、ほとんどの操作がどちらに含まれているかに基づくのではなく、複雑さがどこにあるかに基づいています。ここではアルゴリズムの複雑さについて話しているのではなく、日常的な意味の複雑さについて理解しています。

適切なアルゴリズムは複雑であり、推論するのが困難です。これは通常、任意に見えるビット操作、論理演算、算術演算、およびデータの一般的なシャッフル全体を実行します。これらのすべての操作が実際にどれだけのプライバシーを購入するか、そしてそれがどのような暗号解読に対して脆弱であるかを知ることは、素人や暗号学者にとってさえ非常に困難です。したがって、アルゴリズムのセキュリティに自信を持つための最良の方法は、アルゴリズムを公開して、専門家にできるだけ広くレビューしてもらうことです。公開する。

一方、キーは単純な概念です。ランダムである必要があるビットの束です。暗号の正確さを保証するためにキーを確認する必要はありません。どのキーも他のキーと同じくらい強力であると想定されています(これが当てはまらない場合は、原則として、キーではなくアルゴリズムを確認することで発見できます)。鍵を生成するために利用できるランダム性の品質は完全ではないことを知っているため、実際にはランダム性の欠如により一部の鍵は脆弱になる可能性がありますが、少なくとも誰もが専門家の暗号学者でなくても、作成する必要なく知ることができます優れたランダム性が優れた鍵につながるという鍵の分析が難しい。したがって、入手可能な最高のランダム性を使用してください。そうすれば、暗号を信頼するために、すべての人と鍵を共有する必要はありません(共有する必要はありません)。


これはコメントに値すると思います。私はあなたの答えを読みました、そしてあなたのポイントは理解しています、ある時点で正しいですが、私は@Mike Samuelの答えを選択しました。それは、アルゴリズムはキーよりも複雑ではないということです。アルゴリズムには構造があります(そして必要です)が、キーには(構造を持つ必要はない)からです。同意する。代わりに、あなたは言った:「一方で、キーは単純な概念です:それはランダムである必要があるビットの束です」、実際、単純な「概念」は単純な「データ」ではありません。「ランダム」データの複雑さは、可能な最大の複雑さです!
Hernan_eche 2012年

@Hernan_echeキーは、同じ長さの他のビット文字列と比べてコルモゴロフの複雑度が高い。しかし、概念的には、ランダムなビットの文字列であり、概念としては、優れた暗号アルゴリズムよりもはるかに理解しやすいです。
David Richerby 14

2

数年前に、暗号化の有名な専門家から同じ質問をしました。

ここでさらに興味深い点は、アルゴリズムのコードを含めるための鍵と、アルゴリズムが単純なUniversal Turing Machine(UTM)であると考えることができるということです。私たちがやりたいのは、アルゴリズムの実行ごとに変更されない暗号化タスクの固定アルゴリズムを持つことです。キーがアルゴリズムの一部であると考える場合、アルゴリズムは毎回変更する必要があります。安全であることを確認してください。固定アルゴリズムとランダムに選択されたキーを使用すると、その問題は発生しません。

前近代の暗号化について考えると、元の違いはより明確になります。敵がアルゴリズムがすべて失われたことを知っていた場合、それは役に立たないでしょう。アルゴリズムを維持することが不可欠でした。特定のケースでアルゴリズムがわかっていれば、将来の使用のためにすべてが失われます。現代暗号では、鍵がありませんアルゴリズムの一部、それが選択され、ランダムにキーが実行される暗号アルゴリズムを明らかに(さらに以前に使用したキー)将来のため、将来の用途のセキュリティを侵害しない、ちょうど別ランダムに選択された文字列であり、これによりセキュリティが付与されます。以前に使用されたキーは、新しい実行を中断するのに役立ちません。

では、UTMとランダムキーを考慮するとどうなりますか?キーが適切構造を持たない限り、アルゴリズムが安全であることを証明できません。たとえば、均一な分布からランダムに選択されたキーは機能しません。キーは、「本質的に」固定アルゴリズムとランダム文字列である必要があります。この場合、キーの固定アルゴリズム部分をUTMに移動することと実際には違いはなく、実行ごとに変化することはありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.