Wolfram言語でのスパイ行為、または写真に何かを隠す方法







Jon McLooneの投稿「 Doing Spy Stuff with Mathematica 」の翻訳。

記事のコードはここからダウンロードできます

翻訳に協力してくれたKirill Guzenko KirillGuzenkoに感謝します。
前述のように、最近逮捕されたロシアのスパイのIT問題について読んだ。 彼らは最も信頼性の高いデジタルステガノグラフィツール( wiki )を使用しなかったと言われていました。 そして、 最下位ビット挿入として知られる方法を使用して、 Mathematicaのデジタル画像を通じてステガノグラフィをどれだけ迅速に実装できるか疑問に思いました。



ステガノグラフィのアイデアは、他の情報にメッセージを隠すことに基づいているため、誰もコミュニケーションの事実に気付かないようになっています。 単語自体は、「秘密の文章」を意味するラテン語とギリシャ語の組み合わせに由来しています。 この用語は、人のb頭に秘密のメッセージを適用するプロセスと呼ばれ、髪の毛が成長し、それによってメッセージが隠されました。 デジタルステガノグラフィの場合、すべてが数学を通じて行われます。



まず最初にすべきことは、何らかの罪のない外観の画像を選択して、おそらく何らかのオンラインフォーラムを通じてスパイボスに伝えることです。 この写真は、養鶏に関するディスカッションサイトに投稿する場合、疑念を引き起こすことはありません。











しかし、驚いたことに、この画像に別のより大きなフルカラー画像を埋め込み、 Mathematicaで数十行のコードでそれを取得することができます。



重要な考え方は、情報が隠される場所として、各ピクセルの各カラーチャネルの最下位ビットを使用することです。 これらのすべてのビットに値0を割り当てて、バイナリワード11111110Andを介して各バイトに適用することから始めます。



デフォルトではるかに正確な色空間で動作するため、 Mathematicaにチャネルごとに厳密に8ビット使用するように強制する必要があります。つまり、コードのいくつかの場所で「Byte」サービスワードを使用します。







複雑な画像では、人間の目は情報の損失を検出できません。 つまり、1つのピクセルの一部のカラーチャネルが1/256より前に暗くまたは明るくなっているという事実を検出することは、単に不可能です。











オリジナルから切り捨てバージョンを差し引いて差分値のみを表示しても、非常に鋭い視線と非常に優れたモニターを使用している場合を除き、何も表示されません。











そして、コントラストを最大限に緩めた場合にのみ、差がゼロに等しくないことがわかります。











次に、秘密のメッセージをビットシーケンスに変換し、イメージキャリアのゼロ化されたビットに挿入する必要があります。 チャンネルごとに1ビットずつ、つまりRGB画像の場合はピクセルごとに3ビットずつ判明します。



ASCIIで文字を対応する数字にエンコードするには、 ToCharacterCode関数を使用します。











次に、必要に応じて先頭にゼロを追加して、数値ごとに8ビットに耐えるバイナリ表現を取得します(そうしないと、1バイトが終了して別のバイトが開始する場所がわかりません)。











次に、情報を非表示にするピクセルチャンネルの総数(幅*画像の高さ* 3 RGBチャンネル)に合わせて、リストにゼロを追加します 。 適切なビット数が得られたので、画像の解像度に応じてデータを変換し、クリアされたビットで画像キャリアに追加します。



これらすべての操作を一緒に示します。







逆のプロセスを実行するには、各ピクセルチャネルから最下位ビットを取得し、それらを8ビットのワードにグループ化してから、テキストに変換し直す必要があります。







テストしてみましょう:











そして逆のプロセス:











元の画像サイズで、PNGなどのロスレス形式に画像をエクスポートします。 JPGなどの非可逆形式への変換、またはスケールの変更は、秘密メッセージを格納する下位ビットの情報を破壊します。



マチルダの鶏の画像は450 * 450ピクセルで構成され、3つのカラーチャンネルがあります。 これは、450 * 450 * 3/8文字を送信できることを意味します。 75,000以上。不思議の国のアリスの冒険の全文を伝えるのに十分すぎるほどです。



削除する以外の情報は追加できません。 ファイルは同じサイズであり、視覚的にはまったく同じです。



実際、ピクセルチャネルの平均半分は元の画像と同じ意味を持ち、約4分の1のピクセルチャネル値が元の画像よりも1ビット小さく、1ビットだけ約4分の1、つまり、切り捨てられたバージョンよりも元の画像に近くなります。



















8ビットASCIIエンコードで表現できる情報を送信するためのソリューションが得られます。 このようなタスクのMathematicaはツールのセットが含まれているため、より豊富な文字セットで構成されるメッセージを送信するには、次のようにします。















ASCII変換を使用して、特殊な形式のファイルまたはデータを挿入できます。 たとえば、画像を挿入できます。 ここでは、PNGファイルをインポートし、ASCII JPG形式の文字列に変換します。







JPG圧縮のおかげで、この行には32,000文字しか含まれておらず、 Aliceに関するテキストが少し少なくなっています。画像全体を非表示にするのは驚くほど簡単です。 画像を損失なく任意の形式にエクスポートできます。 唯一の重要なことは、秘密の画像がJPGでエンコードされていることであり、これはデコードおよび解釈の際に考慮する必要があります。











ホストイメージはまだ同じように見えますが、エージェントHとエージェントBの秘密のイメージは非表示になりました。











上記のいずれも暗号化に対して安全ではありません。 これは、情報をシームレスに伝えるための単なる方法です。 暗号化方法は、イメージキャリアに挿入する前に、最も秘密のメッセージに適用する必要があります。 もちろん、受信者、監視下にある可能性のある受信者、またはFBIエージェントアンダーカバーにラップトップを監視するように「十分に賢い」受信者がわからない場合、これは役に立ちません。



All Articles