わかる人にしかわかってほしくない、そんな情報を扱うための技術が暗号です。
本記事では暗号技術の基礎である、排他的論理和による暗号・復号について簡単に説明します。
排他的論理和とはなにか
排他的論理和について述べる前に、それとよく似た性質をもつ正負の掛け算について復習します。
正負の掛け算、より具体的には、集合\( \left\{ 1,-1\right\}\)で定義された\(\times \)という演算は、次のような性質を持っています。
\begin{array}{ccccc}
1&\times &1&=&1\\
1&\times &(-1)&=&-1\\
(-1)&\times &1&=&-1\\
(-1)&\times &(-1)&=&1
\end{array}
\]
排他的論理和はこの正負の掛け算によく似た演算です。
排他的論理和\( \oplus\)は、集合\( \left\{ 0,1\right\}\)で定義された演算で、以下の性質を満たすもののことです。
0\oplus 0&=0\\
0\oplus 1&=1\\
1\oplus 0&=1\\
1\oplus 1&=0
\end{split} \end{equation}
排他的論理和の性質
この演算には結合法則が成り立ちます。つまり、どんな\( a,b,c\in\left\{ 0,1\right\}\)に対しても
(a\oplus b)\oplus c=a\oplus (b\oplus c)
\end{split} \end{equation}
また、自分自身との排他的論理和は常に0になります。つまり、どんな\( a\in\left\{ 0,1\right\}\)に対しても
a\oplus a=0
\end{split} \end{equation}
さらに、0との排他的論理和は、もとの数を変化させません。つまり、どんな\( a\in\left\{ 0,1\right\}\)に対しても
a\oplus 0=0\oplus a=a
\end{split} \end{equation}
2進数の排他的論理和
2進数は各桁の取りうる値が0か1のどちらかになります。したがって、各桁に対して排他的論理和をとるという演算によって、2進数の排他的論理和も定義できます。
例えば、私たちが普段よく使う10進数の2と11は、2進数ではそれぞれ10と1011と表されます。桁を揃えるために、2を0010と表すことにします。
このふたつの数の排他的論理和\( 0010\oplus 1011\)を計算してみましょう。
2進数の排他的論理和は各桁の排他的論理和を取れば良いので
\mbox{1桁目}~~0\oplus 1&=1\\
\mbox{2桁目}~~1\oplus 1&=0\\
\mbox{3桁目}~~0\oplus 0&=0\\
\mbox{4桁目}~~0\oplus 1&=1\\
\end{split} \end{equation}
排他的論理和による暗号
排他的論理和は暗号に用いることが出来ます。
先ほど10進数の2と11を2進数に変換し排他的論理和を計算しました。この「2」という数字が、機密情報だったとしましょう。
2という数字をそのまま相手に送ると、通信を傍受されたときに秘密が漏れてしまいますから、なんとかしてこれを隠したいと考えます。これが暗号です。
2という数字をそのまま送りたくないので、2と適当な数字、たとえば11の排他的論理和をとってから送ってみます。2と11を2進数に変換し排他的論理和をとって得られる数は9でしたから、もとの2という数は秘匿されています。
排他的論理和をとるのに使った11という数字が漏れなければ、機密情報の2という数字は相手に伝わりません。つまり「11」という鍵が漏れなければ、「2」という機密情報は暗号化されるのです。
排他的論理和による復号
もちろん、暗号化した9という数からもとの2という数を復元(復号)出来なければ意味がありません。
しかし実は復号はとても簡単です。
排他的論理和の定義から、\( a,r\in\left\{ 0,1\right\}\)について以下の等式が成り立ちます。
\left(a\oplus r \right)\oplus r=a\oplus\left( r\oplus r\right)=a\oplus 0 =a
\end{split} \end{equation}
この式は「数\( a\)に対して、同じ数\( r\)について排他的論理和を二度とると、元の数\( a\)にもどる」ことを意味しています。
\( r\)との排他的論理和をとるという操作を暗号と解釈すると、もう一度\( r\)との排他的論理和をとるという操作が復号になります。
先ほど、秘密にしたい数2(2進数では0010)に対して、隠匿のための11(2進数では1011)という数との排他的論理和をとって、1001という2進数を得ました。この数に対してもう一度1011との排他的論理和をとって、秘密にしたかった0010が復元できるか確かめてみます。
\mbox{1桁目}~~1\oplus 1&=0\\
\mbox{2桁目}~~0\oplus 1&=1\\
\mbox{3桁目}~~0\oplus 0&=0\\
\mbox{4桁目}~~1\oplus 1&=0\\
\end{split} \end{equation}
と計算できますから、たしかに復号できています。
参考文献
本記事はこちらの書籍を参考にしました。
暗号に関するさらに発展的な内容は、以下の書籍が詳しいです。私も読み進めています。
2進数と10進数の変換についてはこちらのサイトを利用しました。
2進数、8進数、10進数、16進数相互変換ツール https://hogehoge.tk/tool/number.html