問題の定義
暗号化の目標は、それによってプロセスを近似することです
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]; }
しかし実際には、crypt
とdecrypt
私たちは近似する必要があるので、異なるプログラムや、同じプログラムの異なる実行によって呼び出されcrypt
、その出力はランダムビットと区別できない決定的関数を使用して-それがなければならない非圧縮性ので、そこ(シャノンコーディング意味で) xに関する情報を収集するために使用できる追加の構造ビットはありません。
アルゴリズムは高度に構造化されているため、圧縮可能です。したがって、必要な決定論を維持しながら、ランダム性を明らかにする方法が必要です。decrypt∘crypt=identity。
回答
非圧縮性の秘密を持つ単純な圧縮性アルゴリズムをカリー化することによって
crypt = crypt_algo(secret)
decrypt = decrypt_algo(secret)
上記の目標を概算できます。 crypt
とdecrypt
はいえcrypt_algo
、秘密の情報量が多いため、情報量がdecrypt_algo
多く、情報量が少ない。
secret
これが機能するためには、攻撃者が近づかないようにする必要があります。このアルゴリズムは、カリー化された関数の情報コンテンツのごく一部を提供するだけなので、秘密にしておく必要はありません。
警告
「暗号化セキュリティは、秘密アルゴリズムではなく秘密鍵に依存する必要があります。」
一部ではなく同意します。
両方を秘密にしておくことである程度の多層防御を得ることができますが、テストcrypt_algo
は難しいため、アマチュアが社内で開発した秘密のアルゴリズムは、攻撃を受けた場合、多数の人が注意深く検討したアルゴリズムよりもはるかに悪かったプロの暗号技術者。これが、覆い隠しによるセキュリティが当然のように悪い名前を得ている理由です。そこでの「あいまいさ」とは、キーを適切に保護する代わりに、アルゴリズムを秘密にしようとする試みを指します。