プチメタ3.0

刺激を受けた物事に対する感想や考察、資産運用や英語学習、自己成長に関することなど。


XOR演算を使った暗号化の仕組み


保存したデータを特定の人にしか見せたくない場合は
「暗号化」する必要がある。


インターネット上で扱う個人情報ももちろんだが、
ゲームに同梱されたデータがユーザーに読まれたり改ざんされると
楽しんでプレイする機会を奪うことになるので
暗号化しておくに越したことはない。


また、暗号化したものは元に戻せる(複合化)必要があるので
パスワードの管理で利用する「ハッシュ化」とは少し異なり、
可逆変換になっていなければならない。


暗号化については数学的な理屈も絡むので奥が深いが、
個人で自作できるレベルの簡単な理屈を紹介してみる。

文字は番号で管理されている

文字をデータとして管理するため、
文字にはそれぞれ番号が割り振られている。
これを「文字コード」と呼ぶ。


たとえば「A」の文字コードは65、
「B」の文字コードは66に定められている。
数字を表す文字にも文字コードがあり、「1」の文字コードは49だ。



今回は説明の都合上、
実際の文字コードとは異なるもので説明していく。

文字コードをズラす暗号方式

一番単純な暗号化は文字コードをズラす方式だ。
足し算と引き算は可逆演算なので、
例えばデータを構成する文字コードに適当な数を加算するのだ。



仮にそれぞれを1ずつ加算した場合、
「WORLD」という言葉は「XPSME」と変換される。
これでデータが暗号化されたわけだ。


逆に「XPSME」の文字コードを1ずつ減らせば元の単語に戻る。
どれだけズラしたかがわかれば複合できるので
「ズラした量」が暗号化キーとなる。
暗号化キーはなんらかの手段で相手に伝えたり
データファイルに埋め込んだりする。


昔作ったタイピングゲーム「喰人王」の出題文は
この方法で簡潔に暗号化してある。

2進数

1→2→3 …… 9→ 10 → 11 …… 19 → 20 → 21 …… 98 → 99 → 100 ……


普段、我々が使用している数字は
ひとつの桁を0~9の10種類で表現し、
10ごとに桁が上がるので10進数と呼ばれる。


コンピューターの場合は微妙な電圧を表現するのが困難なので
「電流が流れている」「電流が流れていない」の
2種類の状態だけで判別できるよう2進数が使われている。



0→1→ 10 → 11 → 100 → 101 → 110 → 111 → 1000 → 1001 ……


つまり、ひとつの桁(ビット)を0と1の2種類で表現し、
2ごとに桁が上がるわけだ。
コンピューターが「0と1の世界」と表現される所以である。


人間の手には2種類の状態を表せる指が5本あるので
2進数なら片手で31まで数えることができる。

論理演算

この2進数を使って行う計算が論理演算(ビット演算)だ。
ここでは2つの値に対して1つの結果を出すものを紹介する。



0 AND 0=0
0 AND 1=0
1 AND 0=0
1 AND 1=1


AND(論理積)演算は
2つの値がともに1であるときだけ1になる。



1111 AND 0010=0010
0011 AND 1100=0000
1001 AND 1100=1000


演算は桁ごとに個々に行われるため、
複数の桁を持つ値同士でも同様に計算できる。



0 OR 0=0
0 OR 1=1
1 OR 0=1
1 OR 1=1
1111 OR 0010=1111
0011 OR 1100=1111
1001 OR 1100=1101


OR(論理和)演算は
2つの値のどちらかさえ1なら1になる。



0 XOR 0=0
0 XOR 1=1
1 XOR 0=1
1 XOR 1=0
1111 XOR 0010=1101
0011 XOR 1100=1111
1001 XOR 1100=0101


XOR(排他的論理和)演算は少し変わっていて
2つの値が異なる内容の場合のみ1になる。

XORを使った暗号方式


前述した文字コードは単なる数値なので
それぞれ2進数でも表現できる。


そこで暗号化したいデータを2進数で表現し、
同じく2進数で表現した暗号キーとXOR演算を行う。



「WORLD」と「CANDY」をXOR演算すると「UOcIb」という結果になる。
「CANDY」という暗号化キーを使って「WORLD」を暗号化したわけだ。


面白いのは複合化の作業だ。
文字コードをズラす方式では暗号化するために加算した数字を
逆に減算することで複合化していたが、
XORを使った暗号化は再度同じ作業をするだけで元に戻る。




暗号化されたデータ「UOcIb」と「CANDY」をXOR演算すると
元のデータである「WORLD」になるのだ。


つまり「A XOR B=C」となる場合、「C XOR B=A」が成立する。
入力データが変わるだけなので、暗号化も複合化も
同一のプログラムで行えるというわけだ。

まとめ

暗号化のアルゴリズムはそれだけで学問になるほど奥が深く、
とにかく強固な暗号をかけたいなら
すでに洗練された既存の暗号化ライブラリを使う方が安全だ。


ただ、何かの理由で自作したいとか
どういう原理なのかを知っておきたいなら
上記のような理屈を理解しておくのも悪くないだろう。

総アクセス数