この記事では、鍵が与えられた学習用データを扱います。入力の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を復元する
- XOR計算ツールを開きます。
- 「データの形式」をHex、「鍵の形式」もHexにします。
- 鍵を
01、入力を40 43 42にして「変換する」を押します。 - 出力
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計算ツールで、入力と鍵の形式を揃えてバイト列の変化を確認してください。