Open Source Web Development Tutorials - Dev Shed
XOR暗号のアルゴリズムと解読
(2008/10/27公開)
はじめての暗号学(2008/10/20公開)
おなじみXORで暗号化
この記事は、暗号学アルゴリズムを解説する連載の2回目です。万が一、1回目を見逃していたら、ぜひとも今すぐ1回目の「はじめての暗号学」に目を通すことをお勧めします。1回目で解説している概念を把握していないと、今回の内容は理解できません。
2回目では実際に使われている暗号化アルゴリズムを紹介すると約束しました。具体的には、XORに挑戦します。パート2を通じて、正確にはXORとは何か、どのようにXORを暗号化アルゴリズムに組み込むか、そして最後にXORベースの暗号を解読するいくつかのテクニックを理解していきます。闘志がわいてきましたか?
では、本気で始めましょう。アルゴリズムを理解してコーディングしなくてはなりませんから、時間を無駄にはできません。コーヒーと栄養ドリンクの用意はできましたか?では、大いに楽しみましょう!
XORのすべて
先に進む前に、ひと言注意しておきます。この連載で解説されている暗号化アルゴリズムは、教育のみを目的としていることを忘れないでください。最重要のファイルおよび/データにこれらを応用してはいけません。ただし、このパートに提示されているアルゴリズムがご使用のコンピュータに一切の害をもたらさないことは、筆者が保証します。悪意のあるウイルス、トロイの木馬、ワーム、スパイウエア、マルウエアなどは一切含まれていません。ご傾聴、ありがとうございました。これでようやく先に進めます。
XORとはeXclusive ORを省略した名称です。基本的には論理演算です。下の真理値表を見てください。ただひとつの命題が真の時かつその時に限り、真(しん)となります。
では、XORの定義として、「どちらか一方、両方ではない」と覚えておきましょう。
「どうしてこれが重要なの?」と疑問に思うかもしれませんね。理由は、XORアルゴリズムがこの論理演算に基づいているからです。いいですか、私たちのアルゴリズムでは、ファイルのコンテンツをたどってひとつひとつのバイトにXORアルゴリズムを適用していくのです。暗号化するときは、与えられたパスワードでplaintext(ソースファイル)をXORしているのです。復号するときは、与えられたパスワードでciphertext(暗号化済みファイル)をXORしているのです。
暗号化も復号も同じXORのプロセスであることに注目することが、非常に重要です。一歩ずつビットやバイトを「反転する」のですから、もう一度同じスキームを使って「元に戻す」ことができるのです。XORには数多くのバリエーションがあります。
以下が、私たちが使うXORアルゴリズムの核心です。
while ((s.read((char*)&c, sizeof(c))))
{
if (key[i]=='')
i=0;
c=key[i] ^ c;
d.write((char*)&c, sizeof(c));
i++;
}
変数:「s」はソース、「d」はデスティネーション、「c」はXORするキャラクター、「key」はパスワードキーを表します。このキーはユーザー指定のキーと同じではないことに留意してください。このキーは、以下のプロセスを通じて、XORしていくアルゴリズムに合った状態にします。
for (int i=0; i<255; i++)
key[i]='§';
scanf("%s",key); int temp=0;
for (i=0;i<255;i++)
{ if (key[i]=='') break;
temp=i;
}
strcpy(key_backup, key);
for (i=temp; i>=0; i--)
key[temp-i]=key[temp-i] & (~key_backup[i]);
変数:「key」はユーザー指定のパスワード、「key_backup」は元の「キー」ストリングのバックアップです。このプロセスでパスワードの実行準備が整います。
一般的に、「キー」ストリングに「§」キャラクターを入れてから、パスワードをロードします。この結果、キーストリングの先頭がスタートするときからパスワードが記憶され、255のポジションの残りを通じてこの特殊文字が入った状態になります。この後、キーの各キャラクターに以下の式を適用します。
key[temp-i]=key[temp-i] & (~key_backup[i])
注記:上の「~」演算子は特定の値の補数を示します。コンピュータは、そのような特定の値が格納されているバイナリアドレスから、すべての1を0にし、すべての0を1にして、補数を指定します。例えば、01111101の補数は10000010です。上記の式で、「i」はキーの長さから始まる「for」ループの始まりを表し、先頭(ゼロ)に達するまで1ずつ減じていきます。
Copyright © 2008 Ziff Davis Enterprise, Inc.
Originally appearing in the U.S. Edition of Dev Shed. All Rights Reserved.









