「暗号化の仕組みを学んでいたらXORが出てきた」「マルウェア解析でXOR難読化と書いてあった」「プログラミングで^演算子が出てきたけど、これはXORのこと?」——コンピューターサイエンス・セキュリティの世界で頻繁に登場する基本的な演算が「XOR(排他的論理和)」です。
XOR(Exclusive OR:排他的論理和)とは、2つのビット(または論理値)を比較して、両方が異なる場合に1(真)・両方が同じ場合に0(偽)を返すビット演算です。「どちらか一方だけが真であれば真を返す(両方真は偽)」という性質を持つことから「排他的」論理和と呼ばれます。
暗号化・ハッシュ関数・チェックサム・エラー検出・マルウェアの難読化など、セキュリティ分野の多くの技術でXORが重要な役割を果たしています。
XOR(排他的論理和)とは?
XOR(Exclusive OR:排他的論理和)とは、2つの入力が「異なる」場合に1(真)・「同じ」場合に0(偽)を返すビット演算です。

XORの真理値表
| 入力A | 入力B | A XOR B | 意味 |
|---|---|---|---|
| 0 | 0 | 0 | 両方同じ(0)→ 偽 |
| 0 | 1 | 1 | 異なる → 真 |
| 1 | 0 | 1 | 異なる → 真 |
| 1 | 1 | 0 | 両方同じ(1)→ 偽 |
AND・OR・NOTとの違い
| 演算 | 記号 | 意味 | 0,0 | 0,1 | 1,0 | 1,1 |
|---|---|---|---|---|---|---|
| AND(論理積) | & / ∧ | 両方が1のとき1 | 0 | 0 | 0 | 1 |
| OR(論理和) | | / ∨ | どちらか1つが1なら1 | 0 | 1 | 1 | 1 |
| XOR(排他的論理和) | ^ / ⊕ | どちらか一方だけが1なら1 | 0 | 1 | 1 | 0 |
| NOT(否定) | ~ / ¬ | 0→1、1→0(入力1つ) | 入力が1つのため比較不可 | |||
ORは「両方1でも1(真)」ですが、XOR(Exclusive OR)の「Exclusive(排他的)」は「両方1の場合を除外する」という意味です。「どちらか一方だけ」という排他的な条件がXORの特徴です。
XORの重要な性質
XORには暗号化・プログラミングで広く活用される重要な数学的性質があります。
自己逆元性(XORを2回行うと元に戻る)
XORの最も重要な性質が「同じ値でXORを2回行うと元の値に戻る」という自己逆元性です。
A XOR B XOR B = A
例:
5 XOR 3 = 6(0101 XOR 0011 = 0110)
6 XOR 3 = 5(0110 XOR 0011 = 0101)
暗号化(A XOR 鍵)した後、同じ鍵で再度XORすると元の平文Aに戻ります。
これがXORを暗号化の基本演算として使える理由のひとつです。
交換法則・結合法則
- 交換法則:A XOR B = B XOR A
- 結合法則:(A XOR B) XOR C = A XOR (B XOR C)
- 自己消去:A XOR A = 0(同じ値でXORすると必ず0)
- 0との演算:A XOR 0 = A(0とXORしても変化しない)
ビット演算でのXORの実例
1バイト(8ビット)のXOR演算
例:0x41(’A’のASCIIコード)XOR 0xFF(鍵)
0100 0001(0x41 = 65 = ‘A’)
⊕ 1111 1111(0xFF = 255 = 鍵)
= 1011 1110(0xBE = 190 = 暗号文)
復号:
1011 1110(0xBE = 暗号文)
⊕ 1111 1111(0xFF = 鍵)
= 0100 0001(0x41 = 65 = ‘A’) ← 元に戻る
XORを使ったスワップ(変数の交換)
XORの性質を使うと、一時変数なしに2つの変数の値を交換できます。ただし、現代のプログラミングでは可読性やコンパイラ最適化の観点から、実務では一時変数や言語標準のスワップ機能を使う方が一般的です。
a = 5(0101), b = 3(0011)
a = a XOR b → a = 0110(6)
b = a XOR b → b = 0101(5) ← 元のa
a = a XOR b → a = 0011(3) ← 元のb
結果:a=3, b=5(交換完了)
セキュリティ分野でのXORの応用
ストリーム暗号・ブロック暗号のモード
XORは、多くの対称暗号や暗号利用モードで重要な演算として使われます。
- ストリーム暗号:鍵ストリーム(疑似乱数列)と平文をビット単位でXORして暗号文を生成する
- AES-CTRモード:カウンター値を暗号化して生成したキーストリームと平文をXORして暗号化する
- AES-CBCモード:各ブロックの平文をIV(初期化ベクトル)または直前の暗号文ブロックとXORしてから暗号化する
- AES-GCMモード:CTRモードをベースに、XORを使った暗号化と認証処理を組み合わせる
ワンタイムパッド(理論上強力な暗号方式)
ワンタイムパッド(One-Time Pad:OTP)は、条件を満たせば情報理論的安全性(完全秘匿性)を実現できる代表的な暗号方式です。
- 仕組み:平文と同じ長さの完全にランダムな鍵を生成し、平文とXORして暗号化する
- 復号:同じ鍵でXORすると元の平文に戻る(XORの自己逆元性)
- セキュリティ:鍵が完全にランダムで一度しか使われない場合、暗号文から平文の情報を得ることが極めて困難になる
- 実用上の問題:鍵が平文と同じ長さ必要・鍵を安全に共有する必要・鍵の再利用厳禁(再利用するとTwo-Time Pad攻撃に脆弱)
ハッシュ関数・チェックサム
XORはデータの整合性確認やハッシュ関数の内部処理でも使われます。
- CRCチェックサム:多項式除算に基づく誤り検出方式で、内部処理でXOR演算が使われる
- 単純なXORチェックサム:データの各バイトをXORして簡易的なエラー検出に使う方式。ただし検出能力は限定的
- ハッシュ関数の内部演算:SHAやMD5などのハッシュ関数では、XORを含む複数のビット演算が組み合わされる
RAIDのパリティ計算
RAID 5・RAID 6のパリティ(冗長データ)の計算にもXORが使われます。複数のディスクのデータをXORして得られるパリティから、ディスク障害時に元のデータを復元できます。
XOR暗号の弱点と攻撃手法

既知平文攻撃(Known-Plaintext Attack)
XOR暗号(固定鍵でデータ全体をXORする単純な暗号化)は、既知平文攻撃に脆弱です。
攻撃の仕組み:
暗号文 = 平文 XOR 鍵
↓
鍵 = 平文 XOR 暗号文
攻撃者が平文の一部を知っている場合、知っている部分の「平文 XOR 暗号文」を計算すると鍵や鍵の一部が得られる可能性があります。
その結果、同じ鍵で暗号化された他のデータも復号されるおそれがあります。
頻度分析攻撃
同じ鍵、または短い鍵の繰り返しでXOR暗号化した場合、英語テキストなどでは文字の出現頻度が暗号文にも反映されることがあります。たとえば、英語ではスペース文字(0x20)が多く出現するため、頻度分析によって鍵を推測される可能性があります。
Two-Time Pad攻撃(鍵の再利用)
同じ鍵ストリームを2つの異なる平文の暗号化に再利用した場合、Two-Time Pad問題が発生します。
C2 = P2 XOR KeyC1 XOR C2 = P1 XOR P22つの暗号文をXORすると鍵が打ち消され、P1 XOR P2が得られます。
一方の平文が既知または推測可能であれば、もう一方の平文も復元されるおそれがあります。
この問題は、AES-CTRやAES-GCMモードで同じ鍵・同じIV/Nonceを再利用した場合にも関係します。XORそのものが危険なのではなく、同じ鍵ストリームを再利用する設計が危険です。
マルウェアでのXOR難読化
マルウェア開発者は、XOR演算を使って悪意あるコード・文字列・URL・ペイロードを難読化し、セキュリティ対策ツールによる検出を回避しようとします。
XOR難読化の仕組み
// 概念例:文字列を1バイト鍵でXOR難読化する
byte key = 0x3E;
// 実際のマルウェアでは、このような文字列やURLが難読化されることがある
byte[] encoded = { /* XOR済みのバイト列 */ };
byte[] decoded = new byte[encoded.Length];
for (int i = 0; i < encoded.Length; i++) {
decoded[i] = (byte)(encoded[i] ^ key);
}
// decodedには、実行時に復号された文字列やコマンドが入る
セキュリティアナリストのXOR難読化の解析方法
- xortool:XOR難読化されたバイナリから鍵の長さや鍵を推測するツール
- CyberChef:XOR演算・各種エンコード・復号を視覚的に行えるWebツール
- IDA Pro・Ghidra:逆アセンブラでXOR演算のパターンを解析し、鍵と難読化されたデータを特定する
- 頻度分析:難読化されたバイト列の頻度を分析し、最頻出バイトから鍵を推測する
プログラミング言語別のXOR記法
| 言語 | XOR演算子 | 記述例 |
|---|---|---|
| Python | ^ | result = a ^ b |
| Java・C# | ^ | int result = a ^ b; |
| C・C++ | ^ | int result = a ^ b; |
| JavaScript | ^ | let result = a ^ b; |
| Visual Basic | Xor | result = a Xor b |
| SQL | ^(MySQL)/ XOR(一部) | SELECT a ^ b FROM table; |
| アセンブリ(x86) | XOR命令 | XOR EAX, EBX |
アセンブリ言語では「XOR EAX, EAX」(同じレジスタ同士のXOR)がレジスタをゼロクリアする定番の命令です。A XOR A = 0の性質を利用しており、「MOV EAX, 0」より少ないバイト数でゼロ初期化できるため広く使われます。マルウェア解析でも頻繁に登場します。
XORに関連する被害・注意事例2選
事例1:XOR難読化によるマルウェアの検出回避
XORは、マルウェアの難読化でよく使われる演算です。攻撃者は、マルウェア内部の文字列、URL、コマンド、ペイロードなどをXORで変換し、ファイル上にそのまま現れないようにします。これにより、単純なシグネチャ検出や文字列検索を回避しようとします。
サイバーセキュリティ.comのクリプター解説では、マルウェアをアンチウイルスソフトから隠すために、暗号化や難読化を行うプログラムが使われることを説明しています。また、アンチ・アナリシスでは、マルウェアのコードや文字列を分かりにくくして解析を困難にする手法が紹介されています。
XOR難読化そのものは単純な手法ですが、攻撃者は複数の難読化、パッキング、暗号化、実行時復号、サンドボックス回避などと組み合わせて検出を難しくします。そのため、静的なシグネチャだけでなく、EDRやサンドボックスによるふるまい検知、マルウェア解析が重要です。
事例2:WEPの鍵ストリーム再利用とXORの弱点
XORの弱点を理解するうえで代表的なのが、無線LAN暗号方式WEPの問題です。WEPでは、RC4によって生成した鍵ストリームと平文をXORして暗号文を作ります。しかし、WEPで使われるIVは24ビットと短く、同じIVが再利用されやすいという問題がありました。
同じ鍵ストリームが複数の通信で再利用されると、暗号文同士をXORすることで鍵ストリームが打ち消され、平文同士の関係が漏れる可能性があります。これは、ワンタイムパッドで鍵を再利用した場合に起こるTwo-Time Pad問題と同じ考え方です。
WEPの事例は、「XOR自体が危険」なのではなく、「同じ鍵ストリームを再利用する設計が危険」であることを示しています。現在ではWEPは安全な無線LAN暗号方式とは見なされておらず、WPA2またはWPA3の利用が推奨されます。
よくある質問(FAQ)
Q. XORはなぜ暗号化に使われるのですか?
XORの「同じ鍵で2回XORすると元に戻る(自己逆元性)」という性質が、暗号化と相性がよいためです。暗号化(平文 XOR 鍵 = 暗号文)と復号(暗号文 XOR 鍵 = 平文)を同じXOR演算で実現できます。また、高速なビット演算であるため、大量データの暗号化処理にも向いています。
Q. XOR暗号は安全に使えますか?
固定鍵での単純なXOR暗号(XOR cipher)は非常に弱く、現代の暗号化には使用すべきではありません。頻度分析や既知平文攻撃で容易に破られる可能性があります。
ただし、XORはAESやChaCha20などの安全な暗号化アルゴリズムや暗号モードの内部演算として重要な役割を果たしています。安全な暗号化には、AES-GCMなど標準的で十分に検証された暗号方式を使用してください。
Q. XOR演算は遅いですか?
XOR演算はCPUの基本的な命令の1つで、非常に高速です。現代のCPUではAND・OR演算と同様に高速に処理できます。ストリーム暗号やチェックサムなどでXORが多用される理由の一つは、この高速性です。
Q. プログラミングでXOR演算子を使う実用的な場面は?
いくつかの実用的な用途があります。たとえば、フラグのトグル(特定ビットの反転)、簡易チェックサム、ハッシュ処理の一部、暗号処理、アセンブリでのゼロクリアなどです。
一方で、XORを使った変数交換のようなテクニックは、現代では可読性が低くなりやすいため、実務では一時変数や標準ライブラリの機能を使う方が一般的です。
Q. マルウェアがXORを使う理由は何ですか?
マルウェアがXORを難読化に使う主な理由は、実装が簡単で、文字列やURL、コマンドをファイル上にそのまま残さずに済むためです。これにより、単純なシグネチャ検出や文字列検索を回避しようとします。
ただし、単純なXOR難読化はxortool、CyberChef、Ghidraなどで解析できる場合が多いため、攻撃者はパッキング、暗号化、実行時復号、アンチ・アナリシスなど複数の手法と組み合わせることがあります。
まとめ
XOR(排他的論理和)とは、2つの入力が異なる場合に1、同じ場合に0を返すビット演算です。「同じ値で2回XORすると元に戻る(自己逆元性)」という性質があり、暗号化、チェックサム、ハッシュ関数、RAIDのパリティ計算、マルウェア難読化など、さまざまな分野で使われています。
ワンタイムパッドは、平文と同じ長さの完全にランダムな鍵を一度だけ使う場合、情報理論的安全性を実現できる代表的な暗号方式です。一方で、固定鍵での単純なXOR暗号は、頻度分析や既知平文攻撃で破られやすいため、現代の暗号化には使用すべきではありません。
また、同じ鍵ストリームを再利用すると、Two-Time Pad問題が発生します。この問題は、WEPのような古い無線LAN暗号方式や、CTR/GCM系の暗号モードでIV/Nonceを再利用した場合にも関係します。XOR自体が危険なのではなく、鍵や鍵ストリームを再利用する設計が危険です。
マルウェアはXOR演算を使って、文字列、URL、コマンド、ペイロードを難読化することがあります。セキュリティアナリストは、CyberChef、xortool、Ghidraなどを使ってXOR難読化を解析します。XORはシンプルな演算ですが、暗号化とマルウェア解析の両方を理解するうえで重要な基礎知識です。

























![中小企業の情報瀬キィリティ相談窓口[30分無料]](/wp-content/uploads/2023/07/bnr_footer04.png)



「どちらか一方だけが当たり」のたとえ
XORは「コイントス2回で、どちらか一方だけが表なら当たり、両方表または両方裏はハズレ」というゲームのようなものです。
「どちらか一方だけが真(1)のときだけ真になる」というのがXORの本質です。