会う:ハッシュステガノグラフィ。 非常に遅いが最高の秘密

はい、親愛なる読者、あなたは正しく読む: トップシークレット 。 さらに、最も厳密な数学的意味では完全に秘密であることに注意してください。Cachenよると完全に秘密です 。なぜなら、私の数学的な構造におけるカルバック-ライブラー距離はゼロになるからです。 さらに、「ほぼゼロ」ではなく、「無限小」やその他の下品な近似のない些細なゼロです!

どうやって? しかし、それは非常に簡単です- ステゴコンテナに何も散りばめません。 確かに、私たちが何も点在しない場合、空のコンテナは stegocontainer 区別できませんよね?

「待って、でも何も散らばらないなら何も送らない!!!」-読者は私に反論するだろう。

絶対に正しい! 散らばらない! ただし、コンテナを歪めることなく、情報を送信する方法があります。 どうやって?

図式ハッシュステガノグラフィɔ⃝
次のように表すことができます。


カットの下の写真の説明文。



ハッシュステガノグラフィ



アイデアはとてもシンプルです。 大量の写真を撮ります。 現代の世界では、過剰なガジェット、自撮り、受信した写真を保存するための安価なメモリ、大量の写真の生成は特別な問題ではないと思います...
生成するのが面倒な場合、膨大な数の写真(およびその他の写真)を提供するサイトが多数あります。
Pythonで簡単なスクリプトを作成し、データをアップロードします。

今、私たちはいくつかの良いハッシュ関数を取ります 。 ハッシュ関数の「良さ」のすべてのプロパティのうち、等確率にのみ関心があります。 つまり、(暗号化の観点から)最適なハッシュ変換(たとえば、国民の信頼を正しく失ったMD5 )を取得することさえできません。

すべての写真をハッシュ関数で実行し、データをテーブルに入力します。
写真->ハッシュ

例:


特定の整数nを修正します。
たとえば、 n = 2です。

ハッシュから最初(または最後)のn ニブル(ニブル)を選択して、新しいプレートを作成します。
この例では:


定義を省くことができないため、 ハッシュコードの概念を導入します
ハッシュコードは、イメージハッシュの最初のn個のニブルです。
計算関数はH(...)で示されます
例: H(cat1.jpg)= 0xd1; H(cat2.jpg)= 0x55

テーブルにハッシュ インデックスを作成ます。 これは、 ハッシュコードによってデータベース内の目的の行を十分にすばやく(つまり、 O(log(M) 、Mはデータベース内の画像の数)見つけることができるようにするために必要です

メッセージ(16進数)を送信したいとします: 55d134237598n個のニブルで分割します。 例として、 n = 2を選択しました。これは、メッセージ55d134237598を2つのニブルに分割する必要があることを意味します。 スペースを「分割」すると、 55 d1 34 23 75 98のようになります。 それぞれがn個のニブルを含む結果の「ピース」は、 ワードと呼ばれます 。 つまり、合計で6ワードになりました。

次に、次のことを行います。
  1. 言葉を取りましょう。 ハッシュコードが 単語と一致する写真を探しています。 そのような写真が複数ある場合は、いずれかを撮影します。
  2. 画像をチャンネルに転送
  3. 2番目の単語を取り、2番目の単語に一致するハッシュコードを探します
  4. 画像をチャンネルに転送
  5. 3番目の単語に進みます...など


もう一度、理解するために、3つの単語を送信する原理を示すGIFを見てみましょう: 55 d1 34


データベース内の画像をランダムに取得する場合、その確率は
そのハッシュコード(1/2 ^(4 * n))に等しい任意の指定された単語と一致しますええ、なぜLaTeXがまだハブにないのか )。

n = 1の場合、この値は1/16で、 n = 2の場合、この値はすでに1/256です。
この確率が低いほど、ステガノグラフィーのニーズを満たすためにデータベースに入れる必要がある写真が増えます。

一方、 nが大きいほど、コード高速になります
残念なことに、 nを増やすと速度は直線的に増加しますが、写真の枚数の必要性は指数関数的に増加します。

このため、ハッシュステガノグラフィは非常に低速です。 ただし、ショートメッセージの送信については、まったく問題ありません。

正式な説明



それでは、ステゴシステムの正式な説明をしましょう。

ステゴシステムを一連のオブジェクトIとして定義します
単語のセットSを定義する
関数H(i)を定義します。これは、 Iのiに対してSの単語s 関連付けます
この関数をハッシュコードと呼びます

メッセージs1、s2、s3、...、smを送信するには、そのようなi1、i2、i3、...、imを見つける必要があります。
H(i1)= s1、H(i2)= s2、...、H(im)= sm

それが数学モデル全体です。 ご覧のとおり、複雑なことは何もありません。

H( i )がsに等しくなるまで、各単語sが写真を反復しないようにするため
十分な数の画像を選択し、ハッシュコードを事前に計算し、データベースに書き込み、ハッシュコードを使用してインデックスを作成するのが妥当です。

99.999%の確率で長さmの任意のメッセージs1、s2、s3、...、smを送信できるように、いくつの画像が必要ですか? この番号をMで示します。

この質問は私に開かれています... mnからMを計算するためにモンテカルロ法を使用する以外の方法はありません。

アップグレード



ハッシュステガノグラフィは典型的な純粋なステガノグラフィであるため、データ自体を暗号化することをお勧めします。 たとえば、ストリーム暗号を使用できます。 この場合、希望するstegoメッセージをstegosystemの入力に送信する前に、特定の範囲で合計する必要があります。 例えば、所望のメッセージ55 d1 34 23 75 98はバーナム暗号で暗号化でき、暗号化されたシーケンスはステゴシステムの入力に送信できます。

別の、私の意見では、重要なアップグレードは、使用後にデータベースから画像を削除することです。 画像を使用した後、再利用しないでください。

また、システムの確率と信頼性を試すこともできます。 たとえば、 単語 0x55を渡したいが、 ハッシュコード 0x55の画像がデータベースですでになくなっている場合はどうなりますか?
これまでに2つのオプションがあります:エラー付きで送信するか、 ハッシュコード0x55に等しいものが少なくとも1つあることを期待して、何らかの方法で多くの新しい写真を生成します...

ただし、別のオプションを使用できます: ノイズレスコーディングを使用します。 その後、いくつかの間違いを犯す機会があり、ECCがそれらを修正します。

もちろん、それをニブルに分割することはできませんが、バイト、ビット、任意の数字システムの任意の数字に分割することはできません。

また、チャネルに関する説明も必要です。 チャンネルとは、言葉の最も一般的な意味での抽象化を意味します。 最も重要なことは、次の単語を次々に追跡する順序を設定することです。 原則として、ファイルに番号を付けることで、ファイルをフォルダにまとめて入れることができます。 この場合、ファイルのあるフォルダーがチャネルになります。




ハッシュステガノグラフィの特定の実装の例をいくつか示します。
  1. 特定のシーケンスでのソーシャルネットワークでの画像の公開。
  2. 必要なシーケンスでのBitTorrentプロトコルを介したデータ転送(必要なワードを送信するために必要なハッシュコードを取得するため)
  3. プロトコルXが異なる方法で同じデータをエンコードする能力を持っている場合、このエンコード方式を選択して目的の単語を送信します 。 たとえば、ZIPプロトコルが適しています
  4. 適切なハッシュコードを取得するまでの、人間の言語における完全に任意の意味のある置換。 たとえば、「森に行って灰色オオカミを見た」という文は、「森に行って灰色オオカミを見た」という同様の意味のある文に置き換えることができます。 意味は同じですが、ハッシュコードは異なる場合があります。 目的のハッシュコードが得られるまで、置き換える必要があります。


まとめると



ポイントについて。
  1. ハッシュステガノグラフィは、コンテナデータを歪めません。 したがって、それは最高の秘密です(Cachenによると)
  2. ハッシュステガノグラフィはかなり遅いです。 nが増加すると、速度は直線的に増加し、複雑度は指数関数的に増加します。
  3. ハッシュステガノグラフィは、コンテナデータの影響を受けません。 MP3にはLSBはありません。JPEGのプロにはステガノグラフィを適用できません...ハッシュステガノグラフィでは、データがデジタルで表現可能であることが重要です。
  4. 請求項1、請求項2、請求項3の理由により、ハッシュステガノグラフィはショートメッセージを送信するための優れたソリューションとなります。
  5. ハッシュステガノグラフィは純粋なステガノグラフィ(キーレスステガノグラフィ)であるため、データを保護するには暗号化が必要です
  6. ハッシュステガノグラフィは、別のステガノグラフィアルゴリズムの「サブアルゴリズム」になります。 確かに、この場合、 完璧を犠牲にする必要があります。 たとえば、LSBでは、画像をU部分に分割できます。 パーツを取得し、その中の1ビットのデータを変更し、このパーツのハッシュコードを計算します 。 それが単語と一致するなら、次の部分に行って、次の単語を取ってください。 そうでない場合は、データの別のビットを変更してみてください。 したがって、合計Uデータビットを変更しましたが、 4 * U * nデータビットを送信しました。 nUを増やすことで、非常に良い結果が得られます。

Source: https://habr.com/ru/post/J272935/


All Articles