【えっくすおーある】

XOR とは?

最終更新:
💡 同じなら0、違えば1。桁ごとに比べる

2つのビットが異なれば1、同じなら0を返す排他的論理和。複数ビットには桁ごとに適用し、同じ値で2回XORすると元へ戻ります。この性質だけでは暗号の安全性を保証できません。

📌 このページのポイント
XOR:同じなら0、違えば1ABA XOR B000011101110桁ごとに比べる4ビットの例1010 XOR 1100 = 01100110 XOR 1100 = 1010同じ値で2回XORすると元へ戻るこの性質だけで暗号の安全性は保証しない
上は1ビットの真理値表、下は4ビットの計算例です。暗号として使う場合は鍵の再利用や改ざん検出などを別に確認します。
ひよこ ひよこ
XORは何をする?
ペンギン先生 ペンギン先生
入力の2ビットが違えば1、同じなら0を返す演算だよ。0と0なら0、0と1なら1、1と0なら1、1と1なら0。ORと違うのは、両方1の場合に0になるところだね。
ひよこ ひよこ
数値にも使える?
ペンギン先生 ペンギン先生
各桁のビットに適用できる。たとえば2進数の1010と1100をXORすると0110になるよ。数値の大きさを比べる演算ではない。記号は⊕やXOR、言語によっては^などを使うけれど、^が累乗を表す言語もあるので確認しよう。
ひよこ ひよこ
同じ値で元に戻るのはなぜ?
ペンギン先生 ペンギン先生
同じビット同士のXORは0、0とのXORは元のビットになるからだよ。(A XOR B) XOR B=A。この性質で、一方のデータとXORした結果からもう一方を復元できるんだ。
ひよこ ひよこ
それだけで安全に暗号化できる?
ペンギン先生 ペンギン先生
できないよ。ストリーム暗号では鍵から生成したキーストリームと平文をXORするが、その生成方法と使い方が重要。同じキーストリームを2つの平文に使うと、暗号文同士のXORから平文同士のXORが得られる。改ざん検出もXORだけではできないので、検証された暗号方式とライブラリを使うんだ。
ひよこ ひよこ
重複しない値を探せる?
ペンギン先生 ペンギン先生
ほかの整数がすべて2回ずつ出現し、1つだけ1回出現するなどの条件なら、全体をXORしてその値を得られる。ペアが0になるからだよ。ただし任意の重複回数や浮動小数点の配列にそのまま使える方法ではないんだ。
ひよこ ひよこ
JavaScriptでは注意がある?
ペンギン先生 ペンギン先生
Number同士の^は32ビット整数へ変換されるので、大きな整数の上位ビットは失われる。BigInt同士ならBigIntとして演算するが、Numberと混ぜるとTypeErrorになる。論理値の比較とは分けて、データの型と幅を確認しよう。
もっと詳しく知りたい人へ

キーの再利用は何が漏れる?

C1=P1 XOR K、C2=P2 XOR Kなら、C1 XOR C2=P1 XOR P2です。Kが打ち消されるため、単にキーを秘密にしているだけでは十分ではありません。ChaCha20-Poly1305などの方式でも鍵・nonceの使い方と認証タグの検証を守る必要があります。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「XOR」って出てきたら「同じビットなら0、違うビットなら1になる演算」と思えばだいたいOK!
📖 おまけ:英語の意味
「Exclusive OR」 = 排他的論理和
💬 どちらか一方だけが真の場合に真になる演算です。両方が真の場合も真になるORと区別します。

参考資料

← 用語集にもどる