━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■第12回 排他的論理和で暗号化
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ところで皆さんは暗号を作ったことがあるでしょうか。
10年ほど前に関わったプロジェクトでの話なんですが、ログインパスワード
をそのまま保存するのは危険ということで、暗号化しようということになり
ました。
ある会社の人が自分がやりますと言うので任せたのですが、このような暗号
が出来てきました。
APZBAYCSXDSWEWVFOUGRTHDS
「これって、「PASSWORD」って書いてありますよね?」
と私が言うと驚いた顔をされたのですが、実に単純な方法です。
暗号化したい文字を、「ABCDEFG.....」と「ZYXWVUTS.....」のアルファベ
ットで囲んでいるだけなんです。
3文字ずつ区切って、真ん中の文字だけ読めばすぐ解読できてしまいます。
このように、人間に馴染みの深い記号や文字を規則的に並べたり入れ替えた
りする暗号は、強度があまり高くありません。
暗号化するなら、「なんだこりゃ?」なものになっているべきでしょう。
●XOR演算(排他的論理和)
本題に入る前に、前回紹介した排他的論理和を思い出してみましょう。
XORとは、「eXclusive OR」の略で、演算対象の2つがお互いに異なるときに
真となります。
逆にお互いに同じ場合は、0・1に関係なく0(偽)となります。
真理値表は、以下のようになりました。
-------------------
| A | B | A XOR B |
|---|---|---------|
| 0 | 0 | 0 |
|---|---|---------|
| 0 | 1 | 1 |
|---|---|---------|
| 1 | 0 | 1 |
|---|---|---------|
| 1 | 1 | 0 |
-------------------
と、前回の説明はここまでだったのですが、実は排他的論理和にはもう一つ
凄い特徴があります。
それは、「2回演算すると元に戻る」ということです。
実際に演算してみましょう。
「10101010」と「00001111」の排他的論理和です。
10101010
XOR 00001111
-------------
10100101
ここで得られた「10100101」に再び「00001111」をXORしてみます。
10100101
XOR 00001111
-------------
10101010
と、このように元に戻りました。
面白いですね。
●XORで暗号化
XORの特徴を利用して、暗号化を考えてみましょう。
XORは2進数の演算ですので、まずは暗号化したい文字を2進数のコードに置
き換える必要があります。
コード体系は何でも構いません。
次に、暗号キーを決めます。
上記の例では、「00001111」が暗号キーに該当します。
この2つの2進数をXORすれば、すぐに解読できない2進数が出来上がります。
そのまま2進数でもいいですし、16進数で表記しても構いません。
解読するためには、暗号キーが何かを求めないといけないため、それなりに
時間を要することになりますが、暗号キーを利用者が決める場合、生年月日
などを使用されると推測されやすくなります。
そこで、もっと強度を上げるために、入力された文字をシード値として乱数
を生成し、暗号キーとして用いるなどの工夫をすると、こんな単純なアルゴ
リズムでも容易に解読ができなくなるのです。
※シード値とは、乱数生成の際に設定するキーのことです。
同じシード値から発生した乱数は必ず同じになるため、上記の例では復号
時でも同じ暗号キーが生成されます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━