私は暗号化のキーとしてカラー写真を使用する暗号システムに取り組んでいます。ブルートフォース攻撃の実現可能性を見つけるために、私の暗号システムのキーサイズを推測しようとしています。私の暗号システムは、任意のサイズM x NのRGB画像を使用します。
画像はまた、初期値に敏感なカオスアトラクタによって生成されるため、生成される画像はそれぞれ異なります。これらの写真は一例です:
同じ計算をしようとする論文はまだ見つかりません。鍵のサイズについて何か考えはありますか?
最新の編集は、写真が手続き的に生成されていることを示しているため、キーサイズは、画像の生成に必要な状態の量によって制限されます。あなた パラメータ化されているようです 初期条件(および固定出力画像サイズ、カメラの位置、ポイントライトの位置、収束条件など)の4つの浮動小数点数。
これらの128ビットの状態は、提供された状態のみに依存するアルゴリズムによって画像に変換されるため、画像の「キー」に128ビットを超える情報を含めることはできません。実際、初期値のクラス全体が同じ出力を生成すると思います(たとえば、4つの浮動小数点数がすべて非常に小さい場合)。したがって、イメージの「キー」サイズは厳密に128ビット未満になります。
キーのサイズを小さくするだけの場合は、128ビットの状態をイメージに変換して(そして何らかの形で元に戻す)、128ビットの状態に触れることには実際にはメリットはありません。
画像が大きすぎて暗号化キーとして直接使用できないため、最初に [〜#〜] kdf [〜#〜] で実行する必要があります。
それが有用であるのに十分なエントロピーを持っているかどうかも、画像に完全に依存します。真っ白な1000x1000の画像を作成することもできますが、エントロピーが含まれていないため、キーとしては役に立ちません。カメラからの画像は下位ビットにかなりのエントロピーを持っている傾向があるため、問題はないかもしれませんが、ユーザーはどの画像も良い鍵ではないことを理解する必要があります。
キーとしての写真は、一般的に素晴らしいアイデアではありません。写真は通常、共有するために撮影され、鍵は誰にも見せたくないものです。キーとして画像を使用することも、それが セキュリティによる不明瞭さ に依存している可能性があるように聞こえます(つまり、コンピューター上にある何千もの画像を使用するだけですが、それは事実上非常に低いエントロピーです)非常に多くの写真がない限り、20ビット未満です)。
学習のためにこれを開発し続けてもかまいませんが、暗号化について十分に理解するまでは、この種のことは専門家に任せた方がよいでしょう(参照 なぜ私たち自身でロールすべきではないのですか? =)。
暗号システムには、128、192、および256のキーサイズを持つキーサイズが必要です エントロピーのビット セキュリティレベル。
質問があなたに戻ってきました:これらの画像はどこから来て、どのくらいのエントロピーが含まれていますか?それらが画像として解釈されている完全にランダムなビットストリームである場合、(非可逆圧縮コーデックによるエントロピー損失を無視して)log_base2(256x256x256) = 24 bits of entropy per pixel
を取得するため、それぞれに6/8/11ピクセルが必要になります128/192/256ビットのセキュリティ強度。
完全にランダムな画像を生成せず、代わりに人々が写真などを使用できるようにする場合、それらの1つでエントロピーの量を推定し始める方法すら私にはわかりません。
ボトムライン:キー素材として画像を使用することは本当に奇妙なことのように思われ、キー素材は暗号からの完全にランダムなデータであるという一般的な慣習と矛盾します-強度RNG。
また、あなたの質問の情報から、ブルートフォースがあなたが心配する必要がある攻撃であると私は確信していません。私は「彼らのラップトップにアクセスし、彼らのハードドライブ上のすべての画像を試す」攻撃についてもっと心配するでしょう。
画像から、キーのサイズが画像のサイズよりも大幅に小さいことがわかります(それ以外の場合、それらのほとんどはランダムな色の静的のように見えるためです)。
キーサイズは、カオスアトラクタプログラムが生成できるさまざまな画像の総数の2を底とする対数以下です。*
これは、キーサイズがカオスアトラクタプログラムへのすべての入力を指定するのに必要なビット量以下(おそらく、それ以下)であるという別の言い方です。
画像をハッシュして暗号化キーとして使用する場合、キーのサイズはハッシュのサイズ以下になります。
*暗号化アルゴリズムが「画像の各ビットとプレーンテキストの対応するビットのXOR」のような場合の正確な鍵サイズです(メッセージの一部がグレーで覆われているため、重要な秘密、BTWにはそのアルゴリズムを使用しないでください。画像内の領域を解読するのは非常に簡単です)。
tl; dr-128ビットを変換する キーストレッチングアルゴリズム を提案していますはるかに大きなキーへの入力。 必要に応じてではありませんが、128ビットの入力ほど弱いわけではありませんが、これは同じサイズのはるかに大きいキーを単に使用するほどには良くありません。とはいえ、ビットマップは非常に秩序立っているように見えます。これは、ランダムに生成されたビットマップよりもはるかに弱いことを強く示唆しています。
@ Blenderの答え によると、画像の生成に128ビットを使用しているだけです。私は、画像自体を、それを生成したアルゴリズムに入れた128ビットよりも大きいキーとして数えることを望んでいると思います。そして、それはmightです。
具体的には、128ビットの入力をはるかに大きなキーにストレッチしようとする key-stretching algorithm を作成しようとしています。これは必ずしも無意味なことではありませんが、次のことに注意する必要があります。
キーストレッチアルゴリズムは、入力の総当たり攻撃に対して脆弱になる可能性があります。たとえば、誰かが画像生成アルゴリズムをリバースエンジニアリングできなかったとしても、可能な$ 2 ^ {128} $のすべての入力を試し、可能なすべての$ 2 ^ {128} $の可能な画像を生成してから、それぞれを試すことができます。これを防ぐには、そのような攻撃を実行するには画像生成アルゴリズムが高すぎることを確認する必要があります。
あなたの写真は、ローカルスケールではランダムではありません。これは、それのいくつかのピクセルを見ている人はおそらく、成功する確率がランダム以上の隣接ピクセルを推測できるからです。つまり、画像生成アルゴリズムをリバースエンジニアリングできない攻撃者に対しても、このアルゴリズムは疑似ランダムではありません。
あなたの写真は、グローバルなスケールでランダムではありません。これは、表示された形状がグローバルジオメトリを持っていることに加えて、正常に動作する背景で画像がピクセルを浪費していることです。これにより、疑似ランダム性が再び大幅に弱まり、完全に破るのは簡単かもしれないことを示唆している可能性があります。
同じデータの他の表現とは対照的に、画像を生成するキーストレッチアルゴリズムには実際の利点はありません。確かに、引き伸ばされたキーは画像のように見えますが、そのかわいさは、ランダムに生成されたビットマップに対する脆弱性を反映しているにすぎません。
このWebサイト は、指定されたサイズのランダムな白黒のビットマップを生成するようです。たとえば、次は$ 250\times 250 $ピクセルのビットマップです。
。
このビットマップはランダムです(想定されています)。そのピクセルの任意の組み合わせを見る攻撃者は、別のピクセルが何であるかを推測する確率が偶数を超えるべきではありません。
残念ながら、このサイトではMathJaxが有効になっていないため、奇妙に見えずに直接質問に答えることは困難です。ここでは、MathJaxが利用可能であったとしても、応答を記述します。
指定された長さと幅のランダムに生成されたRGBイメージのセットには、$$ {\ left(n_\text {Red} \、n_\text {Green} \、n_\text {Blue}\right)} ^ {が含まれますn_\text {width} \、n_\text {height}} \、\ text {members}\、、 $$ここで:
$ n_\text {Red} $は、ピクセルの "red"寸法の可能な値の数です。
$ n_\text {Green} $は、ピクセルの "green"寸法の可能な値の数です。
$ n_\text {Blue} $は、ピクセルの "blue"寸法の可能な値の数です。
$ n_\text {width} $は幅のピクセル数です。そして
$ n_\text {length} $は、長さのピクセル数です。
次に、エントロピーは$\log_2 {\ left(n_\text {members}\right)}なので、$$$\begin {align}\left [\ text {entropy}\right]&〜=〜\log_2 {\ left({\ left(n_\text {Red} \、n_\text {Green} \、n_\text {Blue}\right)} ^ {n_\text {width} \、n_\text { height}}\right)}\[5px]&〜=〜{n_\text {width} \、n_\text {height}} \、\ log_2 {\ left(n_\text {Red} \、n_\text {緑} \、n_\text {青} \右)} \、。\ end {align} $$
白黒画像の場合:
$ n_\text {Red} = 2、$は、赤のチャネルに2つの可能な値があるためです。
$ n_\text {Green} = n_\text {Blue} = 1、$緑と青のチャネルの値は赤のチャネルと等しくなるように定義されているため(すべてのピクセルが黒または白になるように;
したがって、エントロピーは$$\left [\ text {entropy}\right]〜=〜{n_\text {width} \、n_\text {height}} \、\ log_2 {\ left(2\times 1\times 1\right)}〜=〜{n_\text {width} \、n_\text {height}}\,. $$
したがって、キーサイズが小さすぎて損失が多すぎることに伴う初期の問題を回避し、後でKDFを使用できる場合は、これらのキーを認証に使用するとメリットがあります。
そのようなものの生成には、従来のハッシュとの関係で永遠にかかる必要があるため、初期パラメーターをパスワードのように扱うと、パスワードの攻撃時間が遅くなります。
しかし、それを実現する簡単な方法があります。 bcrypt()
とその仲間たちはスケールアップします。