ステガノグラフィとは、メッセージがあること自体に誰も気づかないように、メッセージを隠す技術です。暗号化は、メッセージを読めないようにかき混ぜます。ステガノグラフィは、旅行の写真やボイスメモのような、ふつうのものの中にメッセージをしまい込み、誰も探そうと思わないようにします。この言葉は、ギリシャ語の「隠された書き物」に由来します。

デジタルのステガノグラフィは、主に画像が舞台です。写真には何百万もの数値があり、誰にも違いが分からないように少しだけずらせるからです。このガイドでは、実際にある方法を説明します。ピクセルの最後の1ビットを変えるものから、JPEGの圧縮の内側で作業するものまでです。さらに、「画像にファイルを隠す」方法の大半が、本当のステガノグラフィより単純なものである理由、メッセージアプリで写真を送ると隠した部分が消えることが多い理由、そして、隠されたデータを探す人たち(ステガナリストと呼ばれます)が何をしているのかを説明します。

ステガノグラフィとは

どのステガノグラフィのシステムにも、同じ3つの部分があります。ペイロードは、秘密そのものです。メッセージ、ファイル、フォルダです。キャリア(カバーとも呼びます)は、それを抱える無害なファイルです。PNG、JPEG、WAVの録音などです。その結果、ペイロードを中に入れたキャリアは、ステゴファイルまたはパッケージと呼ばれます。Wikipediaのこの項目は、役に立つ4つ目の用語を加えています。エンコード密度、つまりキャリアのうち変更された割合です。密度が低いほど、変更に気づかれにくく、入るデータは少なくなります。

暗号化に対する利点は、Wikipediaの言葉では、秘密が「精査の対象として注意を引かない」ことです。暗号化されたファイルは、何かが守られていることを知らせます。犬の写真は、何も知らせません。それは弱点でもあります。誰かがその写真を疑った時点で、ステガノグラフィだけでは何も守れません。そのため、本格的なツールは、ペイロードを先に暗号化し、あとで隠します。隠すことで得られるのは、人目につかないことです。見つかったときに中身を守るのは、暗号化です。

この考え方は、コンピュータより2,500年古いものです

最も古い話は、物理的なものです。ヘロドトスは、使者の剃った頭にメッセージを入れ墨し、髪が伸びてから送り出したことを書いています。のちの世紀には、熱で浮かび上がる見えないインクが使われ、20世紀には、マイクロドットが、1ページの文章を、印刷された句点の大きさまで縮めました。この言葉自体は、1499年に、ヨハンネス・トリテミウスの『Steganographia』に初めて現れます。魔術の本に見せかけた、暗号とステガノグラフィの論文です。

デジタル版は、同じ論理のまま、頭皮をファイル形式に置き換えたものです。キャリアに必要なのは、2つの性質だけです。一部を、人間が気づかないように変えられること、そして、どこを見ればよいか知っているプログラムが、その変更を読み戻せることです。画像には、その両方がたっぷりあります。

LSBステガノグラフィは、各色の最後の1ビットを変えます

教科書的な方法は、最下位ビット(LSB)の埋め込みです。一般的な画像のピクセルは、赤、緑、青を、0から255の数値で保存し、それぞれが8ビットで書かれます。最後のビットは、ちょうど1段階分の価値です。それを反転すると、赤の値200が201になります。どんな画面も、どんな目も、その違いを示せません。

赤200、緑117、青54の1つのピクセルを2進数で示した図。各値の最後のビットを、メッセージのビット1、0、1に置き換えると、201、116、55になる。2つの色見本は、同じに見える。
1つのピクセルに、メッセージの3ビットを保存します。各値が動くのは、255段階のうち、多くても1段階です。

これを画像のすべての値で繰り返すと、容量は積み上がります。1,200万画素の写真には、3,600万の色の値があるので、1つにつき1ビットなら、3,600万ビット、理論上は約4.5 MBです。実際のツールは、はるかに少なくします。目立たないようにするためと、パスワードから導いた疑似乱数の順序でビットを散らすために、ペイロードが画像の上にきれいなブロックとして出ないようにするためです。

LSBが使えるのは、PNGやBMPのような、すべてのピクセルの値を正確に保存する、可逆の形式だけです。同じ画像をJPEGで保存すると、圧縮が値を丸めてしまい、最後のビットと、一緒にメッセージもかき消されます。

また、これは、ステガナリストが最もよく理解している方法です。自然な写真の下位ビットには、特徴的なノイズのパターンがあり、それを、完全にランダムに見える暗号化されたデータで上書きすると、パターンが変わります。WestfeldとPfitzmannは2000年にLSB埋め込みへの統計的攻撃を発表し、Fridrich、Goljan、Duは2001年に、カラー画像では、埋め込みによって「非常に近い」色のペアの数が増えることを示しました。Wikipediaは、LSBだけの変更が「場合によっては、1%という低いエンコード密度でも、妥当な信頼性で検出できる」と報告していますが、この数字には出典がありません。Hacker Newsでは、あるコメント投稿者が、もっとはっきり述べていました。素朴なLSB置換が生むノイズは、「検出するのが非常に簡単」だと。

JPEGのステガノグラフィは、圧縮の内側で作業します

スマートフォンやウェブの写真の大半はJPEGなので、ツールは、JPEGの丸めを生き延びる方法を見つける必要がありました。答えは、丸める前ではなく、丸めたあとにデータを隠すことです。

JPEGのエンコーダは、画像を8×8ピクセルのブロックに切り、離散コサイン変換(DCT)という変換で、各ブロックを64個の周波数係数にします。ブロックの平均の明るさを表す1つの数値と、粗い細部と細かい細部を表すほかの数値です。それから、その係数を品質のテーブルで割って丸めます。ここで損失が生じます。JPEGのステガノグラフィは、丸めたあとの係数自体を編集するので、その後にエンコーダが何をしても、メッセージが丸められて消えることはありません。

初期のツールは、これを素朴に行いました。JStegとJPHideは、ProvosとHoneymanが2001年に検証したプログラムの2つで、係数の下位ビットを、全体のヒストグラムが変わるように変更するので、統計的な検定に見つかります。Niels Provosが1999年に書いたOutGuessは、疑似乱数の係数にビットを埋め込み、そのあと、ほかの係数を調整して、全体のヒストグラムを元と一致させます。カイ二乗検定による攻撃を、まさに破るためです。

それは長続きしませんでした。2002年のFridrich、Goljan、Hogeaによる攻撃が、JPEGのブロックの境界にわたる「ブロック性」を測定して、OutGuessを破り、隠したメッセージの長さまで推定しました。最も有名なコマンドラインのツールであるsteghideは、JPEGと音声には、別の道をとります。パスフレーズで選んだ値のペアを入れ替えるので、各色やサンプルの数は変わりません。作者たちは、これを、「一次の統計的検定」に耐えると述べています。

その軍拡競争が、今もこの分野の形です。Fridrich、Pevny、Kodovskyは2007年に、統計的に検出不能なJPEGのステガノグラフィを、「行き止まり」だらけの研究課題と呼びました。2012年には、ステガナリシスは、何千もの画像の特徴で訓練した機械学習の分類器に移っていました。オンラインで目にする、ステガノグラフィは「検出が簡単」だという主張と、「検出が難しい」という主張は、どちらも正しいものです。分かれ目は、考え方ではなく、アルゴリズムです。

「画像に隠したファイル」の大半は、本当のステガノグラフィではなく、追加されたデータです

YouTubeで、画像にファイルを隠す方法を検索すると、最もよくある実演は、LSBではまったくありません。Windowsの1行のコマンドです。

  1. 写真とzipアーカイブを、同じフォルダに置きます。
  2. コマンドプロンプトでcopy /b photo.jpg + archive.zip combined.jpgを実行します。macOSやLinuxでは、cat photo.jpg archive.zip > combined.jpgで同じことができます。
  3. combined.jpgを開くと、写真が表示されます。名前を.zipに変えると、多くのアーカイブツールが、中のファイルを開きます。

これが機能するのは、形式の終わり方のためです。JPEGは終端マーカーで終わり、PNGは、PNGの仕様が「PNGデータストリームの最後のチャンク」と定義するIENDというチャンクで終わります。画像ビューアはそこで読むのをやめ、その後ろにあるものを無視します。一方、zipの読み取りは、ファイルの終わりでアーカイブのディレクトリを探し、そこから後ろ向きに進みます。2つの別のプログラムが、それぞれ有効だと読めるファイルは、ポリグロットと呼ばれ、r/Steganographyのあるユーザーが「古いRARの手口」と呼んだこのやり方が、最もよくある例です。

ファイルにデータを隠す3つの方法の図。画像データの内側でピクセルの下位ビットを変える。終端マーカーのあとにバイトを追加する。形式が許す追加のレコードを、終端マーカーの前に加える。
隠したデータが置かれうる、3つの場所です。画像自体を変えるのは、最初のものだけです。

その2つの間に、3つ目の種類があります。ほとんどの形式は、ラベルの付いたブロックの入れ物で、独自のブロックを追加する方法を定義しています。PNGには補助チャンク、JPEGにはアプリケーションセグメント、MP4にはユーザー定義のボックス、PDFにはコメントが許されます。認識できないブロックを、ビューアは飛ばすので、ファイルは完全に有効なままで、どこでもふつうに開きます。容量は大きく、ビデオなら数ギガバイトで、画像は何も変わりません。

この最後の2つは、厳密な意味でのステガノグラフィではありません。どちらも、ピクセルには触れず、統計的に自然に見せようともしないからです。ファイルが、画像に必要なより多くのものを運んでいるだけです。最近のr/Steganographyのサンプルで最も支持された投稿は、BMPの走査線のパディングのバイトにデータを隠しており、コメントした人たち自身が、その手がかりを見つけました。1人は容量の計算をし、別の1人は、「pngやjpg以外の画像を送られたら、すぐに怪しむ」と述べました。追加されたデータや挿入されたデータは、画像を見る人からは隠れます。ファイル全体を読むプログラムからは隠れず、ファイルは、同じ大きさのふつうの写真より、目に見えて大きくなります。

写真を共有すると、ペイロードが壊れることがよくあります

隠したデータが残るのは、まさにそのバイトが残る場合だけで、人が写真を共有する方法の多くは、それを保ちません。

メッセージアプリ、ソーシャルネットワーク、画像ホスティングは、写真を受け取ると、送られたファイルを保存しないことがよくあります。画像をピクセルにデコードし、しばしばサイズを変え、帯域を節約するために、まったく新しい圧縮ファイルを書き出します。ピクセルの中のLSBのビットは、新しい圧縮でかき混ぜられます。係数レベルのJPEGのペイロードは、品質が変わると丸められて消えます。追加されたバイトや形式の追加のレコードは、たいていコピーされません。アプリが、ピクセルだけから新しいファイルを書くからです。

フロー図。隠したデータのある画像を、USBドライブ、クラウドドライブ、メールの添付、ドキュメントとして送信でファイルとしてコピーすると、変わらずに届き、データは残る。写真として送ると、アプリがデコードし、サイズを変え、新しいファイルを書くので、ピクセルのビットはかき混ぜられ、追加のバイトやレコードは書かれない。
隠した部分が届くのは、ファイルがバイト単位でそのままコピーされる場合だけです。

今日、どのアプリがこれをするのかについて、確かな公開テストはなく、動作はバージョンや、「写真」と「ドキュメント」の送信モードによって変わるので、共有はすべて、証明されるまでは損失があるものとして扱ってください。逸話は、すべて同じ方向を指しています。r/Steganographyのユーザーは、あるツールのペイロードが、RedditからのPNGのダウンロードでだけ残り、Redditが配信するWebP版では残らないことを見つけました。Hacker Newsのコメント投稿者は、以前の試みを思い出しています。「ほとんどの画像ホストは、最適でないエンコードを検出して、親切にも修正するほど賢かった」。安全な習慣は単純です。ファイルをファイルとして送り、元を削除する前に、届いたコピーがまだ開けることを確認します。

ステガナリシスは、隠されたデータを見つける技術です

Wikipediaは、ステガナリシスを、暗号解読の対になるものとして、「ステガノグラフィで隠されたメッセージを検出する研究」と定義しています。目標は3段階です。怪しいファイルを見つける、ペイロードがあるかを判断する、可能なら取り出す。最初の2つは、統計とファイルの検査です。3つ目は、たいていパスワードが必要で、隠し方が見破られたあとでも、暗号化が重要な理由です。

最も有名な現地調査は、3つ目の段階が、実際にどれほど難しいかを示しています。2001年に、Niels ProvosとPeter Honeymanは、eBayのオークションの200万枚の画像をスキャンしました。検出器は約17,000枚にフラグを立てましたが、それらへの辞書攻撃では、隠されたメッセージは1つも見つかりませんでした。Wikipediaの項目は、ステガナリシスだけに基づいて行動するのは、「ペイロードが完全に取り出されて復号されない限り、非常に危ういこと」だと警告しています。そうでなければ、分析者の手元にあるのは、「ファイルが変更された可能性を示す統計」だけだからです。検出がどのようなもので、その限界がどこにあるかの全体像は、隠した写真は見つかる?にあります。両側のツールの、古さと弱点は、ステガノグラフィのツール比較で比べています。

HideFileでできること

ステガノグラフィを検索する人の大半は、秘密の通信路を必要としているわけではありません。他人が手に取るスマートフォンやノートパソコンで、数枚の非公開の写真やファイルが、目立たなくなればよいのです。その目的には、従来のツールは扱いにくいものです。steghideが入れられるのは、JPEGとWAVの小さなペイロードで、LSBのツールにはPNGが必要で、どれも、ブラウズできるギャラリーは与えてくれません。

HideFileは、上の図の3つ目のやり方をとります。最近のブラウザならhidefile.appで、ふつうの写真、ビデオ、PDFをカバーとして選び、非公開のファイルを追加して、パスワードを設定します。HideFileは、ブラウザの中でファイルを暗号化し、ファイル形式が許すレコードとして保存するので、カバーは、ほかの場所では、ふつうの画像、ビデオ、書類として開きます。hidefile.appでパスワードを入れて開くと、ファイルが表示されます。HideFileのサーバには何もアップロードされず、インストールするものもありません。

これは、隠すことと暗号化の組み合わせで、どちらが働いているのかについて、率直です。HideFileは、ピクセルを変えませんし、統計的な検定をだまそうともしません。専用のツールを使えば、カバーにデータが追加されたことは分かります。できないのは、パスワードなしで中身を読むことです。そのため、デバイスをブラウズする人から物を遠ざけておくには向いていますが、訓練を受けた調査官、国境での検査、法的な圧力には、適したツールではありません。

パスワードの復旧はできず、写真を再エンコードするアプリは、隠した部分を失わせることがあるので、カバーは、ファイルとして保管し、共有してください。さまざまな隠し方が誰をだませるかの全体像は、ファイルを人目につく場所に隠す方法を、写真の金庫アプリとの比較は、写真の金庫アプリは安全?をご覧ください。

出典