画像に隠すメッセージの XOR 暗号化

LSB steganography に XOR 暗号化でセキュリティレイヤーを追加する方法を解説。XOR 暗号の仕組み、鍵の拡張、埋め込み前の暗号化が抽出を防ぐ理由を説明します。

Techniques

詳細な説明

暗号化レイヤーの追加

LSB steganography は「隠すことによる秘匿」を提供しますが、誰かがデータの存在に気づけば、生のビットを抽出して直接読み取れます。XOR 暗号化は第二のレイヤーを追加します — ビットが抽出されても、正しい鍵なしでは無意味なノイズに見えます。

XOR 暗号化の仕組み

XOR(排他的論理和)演算は、2つのビットを比較し、異なれば 1、同じなら 0 を出力します:

0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

重要な性質は、XOR がそれ自身の逆関数であることです:

平文      XOR 鍵 = 暗号文
暗号文    XOR 鍵 = 平文

暗号化プロセス

  1. ユーザーがパスワードを入力(例: "s3cret")。
  2. パスワードを循環的に繰り返してメッセージ長に合わせて拡張。
  3. メッセージの各バイトを拡張された鍵の対応バイトと XOR 演算。
メッセージ: H   e   l   l   o       (72, 101, 108, 108, 111)
鍵:         s   3   c   r   e       (115, 51, 99, 114, 101)
XOR結果:    ;   V   \x0f \x1e \x0a  (59, 86, 15, 30, 10)

結果のバイト列 3B 56 0F 1E 0A はランダムデータに見えます。鍵 "s3cret" を知らない攻撃者が LSB を抽出してもノイズしか見えません。

JavaScript での実装

function xorEncrypt(messageBytes, key) {
  const keyBytes = new TextEncoder().encode(key);
  const result = new Uint8Array(messageBytes.length);
  for (let i = 0; i < messageBytes.length; i++) {
    result[i] = messageBytes[i] ^ keyBytes[i % keyBytes.length];
  }
  return result;
}

復号には同じ関数を使います — 同じ鍵で XOR すると操作が反転します。

セキュリティ上の注意点

繰り返し鍵による XOR は現代の暗号基準では強力ではありません。既知平文攻撃、頻度分析、鍵の再利用に対して脆弱です。しかし steganography の文脈では、攻撃者がまず steganography の使用を発見し、次に正しいビットストリームを抽出し、最後に XOR 暗号を解読する必要があるため、実用的な保護を提供します。

より高いセキュリティが必要な場合は、このツールを使用する前にペイロードを AES-256 で暗号化し、XOR パスワードを追加のスクランブルレイヤーとして扱うことを検討してください。

ユースケース

機密情報を埋め込むユーザーが、ツールの XOR 暗号化オプションとその制限を理解し、より強力なアルゴリズムで事前にペイロードを暗号化すべきか判断するため。

試してみる — Invisible Watermark

フルツールを開く