画像に秘密のテキストを隠す方法(ステガノグラフィ)
ステガノグラフィとは、メッセージを暗号のように読めなくするのではなく、そもそも「メッセージがそこにある」こと自体を隠す技術です。この記事では、普通の画像のピクセルに秘密のテキストを埋め込み、あとから取り出す方法を紹介します。ツールはすべて無料で、画像はどこにもアップロードされず、処理はあなたのブラウザの中だけで完結します。
仕組み
デジタル画像は小さな点、つまりピクセルの集まりです。ピクセルはそれぞれ赤・緑・青の明るさを0から255の数値で持っています。ここで使うのがLSB、つまり最下位ビット(一番右の桁)です。
たとえば赤の値が200なら、2進数で11001000です。これを201、つまり11001001に変えても、変わったのは一番小さい桁の1だけです。色の違いは256段階のうちのたった1段階なので、人間の目には同じ赤にしか見えません。この目立たない最下位ビットを、メッセージの中身で書き換えていきます。
文字にも数値が割り当てられています。「H」は72で、2進数では01001000です。この8つのビットを、8個のピクセルの最下位ビットに1ビットずつ順番に書き込みます。次の文字も同じように続けます。見た目はほぼ元のままなのに、画像の中に文章が一文字ずつ織り込まれていく、というわけです。
どれくらい隠せるか
1ピクセルの1チャンネルにつき1ビット隠せるので、容量は画像の大きさと、使うチャンネルの数で決まります。おおよその目安は次のとおりです。
| 画像サイズ | 赤チャンネルのみ | RGB(赤緑青) |
|---|---|---|
| 100 × 100 px | 約 1.2 KB | 約 3.6 KB |
| 1280 × 720 px | 約 115 KB | 約 345 KB |
| 1920 × 1080 px | 約 259 KB | 約 778 KB |
赤だけでなく緑と青も一緒に使えば、1ピクセルあたり3ビット書けるので容量は約3倍になります。エンコーダーでは、赤のみ、RGB、RGBAの3つから選べます。短いメモなら赤のみで十分ですし、長い文章を入れたいときはRGBを選ぶと余裕が出ます。
メッセージを隠す
下のエンコーダーに画像を読み込んで、隠したいテキストを入れるだけです。
手順はこうです。まず画像をアップロードし、隠したいメッセージを入力します。長めの文章を入れたいときは容量のためにRGBを選びます。他人に読まれたくないならパスワードを設定し、最後に「エンコード&ダウンロード」を押します。
出力されるファイルは必ずPNGです。JPEGは保存のたびに画像を非可逆で圧縮し、色の値をわずかに書き換えてしまいます。その過程で最下位ビットは容赦なく壊れ、隠したメッセージが消えます。だからこの手法では、ビットをそのまま保てるPNGだけを使います。
メッセージを取り出す
受け取ったPNGを下のデコーダーに入れると、隠れたテキストが読み出せます。
PNGファイルをドロップするだけで、埋め込まれたテキストが表示されます。パスワードで保護されていた場合は、そのパスワードを入力します。このデコーダーはpluri.tools独自の形式だけを読むわけではありません。チャンネルがR・RGB・RGBA・緑・青のどれか、長さを先頭に書く方式かnull終端か、ビットの並びがMSB順かLSB順か、といった組み合わせを自動で試して判別します。他のツールで作られた一般的なLSBステガノグラフィの画像も、多くはそのまま読めます。逆に、何も隠れていない普通の写真を入れると、厳格な検証によって空の結果を返すようになっています。
パスワードを付ける(暗号化)
パスワードを設定すると、メッセージは画像に書き込む前にAES-256-GCMで暗号化されます。パスワードそのものはPBKDF2で鍵に伸ばしてから使うので、短い言葉でも総当たりに強くなります。
この状態でパスワードを知らない人が画像を調べても、最下位ビットに並んでいるのは意味のないランダムなノイズにしか見えず、そこに何かが隠れていること自体が分かりません。仮に隠されていると勘づいてデコーダーにかけても、間違ったパスワードではGCMの認証によって復号が拒否され、何も出てきません。
ステガノグラフィは「メッセージが存在すること」を隠し、暗号化は「見つかっても中身が読めない」ようにします。役割が違うので、両方を組み合わせると守りがぐっと固くなります。
限界とよくある失敗
正直に書いておきます。この方法は可逆で保存されるPNGでしか機能しません。受け取った画像を一度JPEGで保存し直したり、画面をスクリーンショットで撮り直したりすると、ピクセルの値が変わって隠したビットが壊れます。
特に注意したいのが、多くのチャットアプリやSNSです。これらは投稿された画像を自動で再圧縮してファイルを軽くするため、その途中で秘密のメッセージが消えてしまいます。相手に確実に届けたいなら、画像を「表示」として送るのではなく、PNGファイルそのものを添付や共有で渡してください。再圧縮される経路を避けるのがコツです。
そしてこれはLSBステガノグラフィという一手法です。世の中にはJPEGのDCT係数に隠す方式など別の手法もあり、このデコーダーはそうしたあらゆる方式を検出できる万能の解析ツールではありません。
よくある質問
プライバシーは本当に安全ですか。
安全です。エンコードもデコードも、暗号化も、すべてあなたのブラウザ内でCanvas APIを使って処理されます。画像もメッセージもパスワードも、どこのサーバーにも送信されません。オフラインでも動きます。
どんな画像でも使えますか。
JPEGやPNGなど一般的な画像を読み込めますが、書き出しは必ずPNGになります。元がJPEGでも、埋め込み後はビットが壊れないPNGとして保存されるので問題ありません。ただし容量は画像の大きさに比例するので、小さすぎる画像には長い文章は入りません。
エンコード後の画像は見た目が変わりますか。
事実上変わりません。書き換えるのは各チャンネルの最下位ビットだけで、色の変化は256段階のうち1段階以下です。並べて見比べても人の目では区別できません。
パスワード無しでも他人に読まれますか。
パスワードを付けずに埋め込んだ場合、隠れていると気づいた人がLSB用のツールにかければ読めてしまう可能性があります。中身を確実に守りたいときはパスワードを設定してください。暗号化されていれば、パスワードを知らない限り読み出せません。
まずは手元の画像で試してみてください。ステガノグラフィ エンコーダーで秘密のテキストを隠し、ステガノグラフィ デコーダーで取り出す、この2つを行き来すれば仕組みが体感でつかめます。