排他的論理和を使ったセキュアな暗号化を考えた

ドコモ口座を利用した不正送金被害が発生してしまいました。
詳細は以下のブログが、わかりやすかったです。
原因
預金者の情報(名義・口座番号・キャッシュカード暗証番号)不正入手できたこと。
ドコモ口座を預金者の本人確認なしで作れたこと。
1項は基本中の基本です。が、だとしても悪用されない仕組みがネットの世界では必須です。
そう考えると、ドコモ側にも十分な罰則(被害者へ還元すべき)が必要と考えます。
まっ、ドコモですからね。ズサンなところはIT企業として恥をしるべき。
先日のドコモの会見での会話です。

記者
「なぜ、本人確認無しで口座を開設できる仕組みにしたのか?」

ドコモ
「皆さんに利用していただきたかったからです。」
本人確認の有無に関わらずサービス利用はできる。セキュリティを甘くした回答になっていない。と突っ込みたい。
また、金融庁もこのようなズサンな業務開始に対して、チェックはしないものなのか?と疑問も感じた。
さて。
評論するのはこれくらいにして、我々利用者もセキュリティに対する意識を高めることも必要ですね。
私も私なりに暗号化について考えてみたことがあるので紹介します。
排他的論理和を使った暗号技術
排他的論理和ってご存知でしょうか?
一言で言うと「XOR」という論理的な計算方法のことです。
2つのビット比較をして、どちらか1つが真だったら真、それ以外は偽という計算方法だ。
ちなみに、このようなことが苦手な方はスルーしてください。面倒臭いお話が続くので・・。
排他論理和の計算方法
具体的には「真:1、偽:0」として見ると以下のパターンで計算される。
0:0=0
0:1=1
1:0=1
1:1=0
このように手法自体は簡単な論理計算です。
排他論理和と暗号化
暗号化前の情報
暗号化前の情報を“BLOG”として暗号化してみる。
“BLOG”を16進数で表す:16進数コードへ
B=42(16進数)=01000010(2進数)
L=4C(16進数)=01001100(2進数)
O=4F(16進数)=01001111(2進数)
G=47(16進数)=01000111(2進数)
①01000010010011000100111101000111
このように“BLOG”は、32 桁の0・1で表すことができます。
鍵となる32桁の乱数を作成
XORで計算するもう一つの鍵は、“乱数で作成”した数字を使う。
私が適当に乱数を決めることにしたが、ここはみなさんが自由に決めて構いません(私はキーボードを適当に叩いてみた)。
②00010101111010010011010101000101(私が決めた乱数)
①と②を排他的論理和で計算し、★を作ってみる。(排他論理和の計算方法と参照ください)
左列から順番に①と②を縦に比較していきます。
①:01000010010011000100111101000111 ②:00010101111010010011010101000101(乱数で作成) ★:01010111101001010111101000000010(①と②のXOR比較)
左から一番目の列は①は0、②は0なので、★は0となります。 左から二番目の列は①は1、②は0なので、★は1となります。 左から三番目の列は①は0、②は0なので、★は0となります。 左から四番目の列は①は0、②は1なので、★は1となります。 ・・・ 左から32番目の列は①は1、②は1なので、結果は0となります。
さてここで面白い状況をお知らせしたい。
①と②と★の3つのデータがあるが、このうちの2つのパーツがあれば残りのパーツをXORで簡単に計算することができる。
以下のような関係になっている。
XOR(①,②)=★
XOR(①,★)=②
XOR(②,★)=①
検算をしてみよう
今回のケースでは、②のパーツと★のパーツで①のパーツとなる”BLOG”を復元してみる。
②:00010101111010010011010101000101 ★:01010111101001010111101000000010 答:01000010010011000100111101000111(②と★のXOR比較)
01000010(42)=B 01001100(4C)=L 01001111(4F)=O 01001000(47)=G
お見事!元に戻りました。
実際のビジネスでの利用
ビジネスの例で説明すると以下のとおりだ。
①=見積書(暗号化したいデータ)
②=両社間であらかじめ決められた乱数(桁数は大量に準備)
★=メール添付時の暗号された見積書
メール送信者:★をメール添付で送信する。 メール受信者:★を②で解凍する。
結果的にこの暗号の仕組みでは、②の乱数生成の仕方がポイントとなります。
Excelですと、セルに”=rand()”とすると、1未満の乱数が表示される。また、VBAを使用すれば、Randomizeで引数を渡して乱数の初期化ができる。
乱数を作ることは簡単です。
例えばドメイン名とタイムスタンプを乱数初期化の引数とし乱数を作ってもよい。また、単純に両社で決めた大量の乱数(HDDがいっぱいになるほど)を作り、メール送信の度に消費していくという考えでも良いと思う。
私としては後者のように使ったものが消費し、乱数が消去された方がセキュリティ性が高いと考えている。
この暗号化の優れているポイント
暗号化を解凍しても「合っている・間違えている」という概念ではなく、どのように解読しても「どれも正解で正しい」という考え方です。 そして本当の正解は乱数でしか解くことができない。
最後に
今回の「不正送金被害」に対する対策ではありませんが、何らかの暗号化では使えれば良いですね。
もちろんセキュリティも日々進化していると思うので、すでに排他的論理和で考えた以上の高い仕組みもあると思います。
乱数が鍵となる仕組みなので、乱数が売れる時代が来たりして・・・。