この記事では、鍵が与えられた学習用データを扱います。入力のHexが 40 43 42、鍵のHexが 01 なら、XOR後のバイト列は 41 42 43、UTF-8の出力は ABC です。鍵を見つける手順ではなく、分かっている鍵を正しい形式で適用する方法を確認します。

XORの真理値表

XOR(排他的論理和)は、対応する2つのビットを比較し、異なる場合に1、同じ場合に0を返します。

入力A 入力B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

1バイトの例では、40 は2進数で 01000000、鍵 01 は 00000001 です。最下位ビットだけが変わり、結果は 01000001、つまりHexの 41 になります。

同じ鍵で元へ戻る理由

鍵のビットが0の位置では、入力は変わりません。鍵のビットが1の位置では、入力の0と1が入れ替わります。同じ位置をもう一度入れ替えると元に戻るため、(データ XOR 鍵) XOR 鍵 = データ となります。

ABC をUTF-8のバイト列にすると 41 42 43 です。各バイトに鍵 01 を適用すると、順に 40 43 42 になります。同じ鍵を再適用すれば 41 42 43 に戻ります。XORでは計算と復号の演算自体は共通です。

既知の鍵01でABCを復元する

  1. XOR計算ツールを開きます。
  2. 「データの形式」をHex、「鍵の形式」もHexにします。
  3. 鍵を 01、入力を 40 43 42 にして「変換する」を押します。
  4. 出力 ABC と「Hexのバイト列」 41 42 43 を確認します。

逆方向を試すには、データの形式をUTF-8に切り替えて ABC を入力します。鍵はHexの 01 のままにすると、文字出力は @CB、Hex表示は 40 43 42 です。元へ戻す際は、このHex表示をHexモードで入力すると形式の取り違えを避けられます。

Hexの鍵とUTF-8の鍵は別のデータ

画面に同じ 01 と書いても、鍵の形式で意味が変わります。

設定 実際の鍵バイト バイト数
Hexの 01 01 1
UTF-8の 01 30 31 2
UTF-8の A 41 1

1つ目は数値1のバイト、2つ目は文字 0 と文字 1 のバイトです。「同じ鍵を入れたのに結果が違う」場合は、値より先に形式を確認してください。文字とバイトの対応はHex・UTF-8の解説でも確認できます。

繰り返し鍵と開始位置

Tools Hubでは鍵が入力より短い場合、鍵のバイト列を先頭から繰り返します。データ 41 42 43 と鍵 01 02 なら、適用される鍵は 01 02 01 で、結果は 40 40 42 です。

データの途中だけをコピーして計算すると、元の処理と鍵の開始位置がずれることがあります。このツールでは常に入力の先頭と鍵の先頭を合わせます。課題の仕様が別の方式なら、その条件に対応する必要があります。

出力が読めない場合

XORの結果はバイト列なので、文章になるとは限りません。Tools HubはUTF-8として無効な出力に警告を出し、バイト列をHexで表示します。例えば入力 ff と鍵 00 では、結果は ff のままですが、UTF-8の文字としては読めません。

鍵、形式、繰り返し方法、開始位置を確認しても読めない場合は、出力がファイルや別形式のデータではないか、元の問題文を確認します。読めないことだけで鍵が誤りだと断定しないでください。

このツールは未知の鍵を自動で求めるものではありません。短い鍵の繰り返しXORは秘密情報の保護にも適しません。XOR計算ツールで、入力と鍵の形式を揃えてバイト列の変化を確認してください。