XorEncoderのベースソース

ホームC#入門講座第4章:簡易暗号化アルゴリズム > XorEncoderのベースソース

XorEncoderのベースソース

ソースコード

using System;
using System.IO;
using System.Text;

namespace XorEncoder
{
	class MainClass
	{
		public static void Main(string[] args)
		{
			Console.Write("File Path>");
			string path = Console.ReadLine();
			Console.Write("Password>");
			string password = Console.ReadLine();
			
			byte[] passcord = Encoding.ASCII.GetBytes(password);
			
			
			FileStream fs_r = new FileStream(path, FileMode.Open, FileAccess.Read);
			FileStream fs_w = new FileStream(path+".xor", FileMode.Create,FileAccess.Write);
			for(int i=0;i<fs_r.Length;i++)
			{
				fs_w.WriteByte((byte)(fs_r.ReadByte() ^ passcord[i % passcord.Length]));
			}
			fs_r.Close();
			fs_w.Close();
			
			Console.WriteLine("The End...");
		}
	}
}

わざとコメントは付けていません。ソースコードからまず、自分で理解してください。

ポイントは3箇所です。

文字列をバイト列へ

XOR暗号化のために、パスワードを数字に変える必要があります。ここではGetBytes()メソッドという便利なメソッドを使って、byte型の配列に数字を格納しています。byte型は整数の一種で、その名の通り8bit = 1byteしか保持できません。もしかしたらUTF8などを指定すると、うまく動かない可能性もあります。

ここでは文字列としての password と、それをバイト列に変換した passcord を区別しています。passcord は配列全体として用いるのではなく、その中の特定の要素を使います。

剰余

疑似サイコロを作る際に用いた「剰余」の技術をここで使いました。

passcord[i % passcord.Length]

例えば、暗号化したいデータが64バイトあるとしましょう。繰り返しによって、64ビットの各ビットごとにXORをしていきます。その際に、現在XORするビットの番号が i に格納されています。ここでは仮りにi=26、つまり27番目のバイトを暗号化する瞬間であるとします。(26という数字を選んだのはYUIの誕生日が3/26だからであって、ここではなんでもいい「任意の数」です。)

また、入力されたパスワードをバイト列に変換し、そのバイト列の要素数が6であるとしましょう。するとこの場合は、26 % 6 = 2 ですから、passcord[2] を使って27番目のバイトをXORすることになります。

ファイルの各バイトとパスワードから作ったpasscordの各バイトを剰余という形で結びつけ、XORしています。これにより、ファイル全体をみれば、ファイル全体のデータがXORされているのではなく、各バイトごとにバラバラのpasscordのバイトを用いてXORしているため、暗号化したデータからパスワードを割り出すのは多少なりとも困難になります。また、パスワード全体を数字に変えて処理するよりも桁数がはるかに小さいので高速に処理できます。

XOR演算とbyteキャスト

(byte)(fs_r.ReadByte() ^ passcord[i % passcord.Length])

これが実際の暗号化をしているコードです。ファイルから1バイト読み取り、passcord との剰余に対応するバイトを使ってXORしています。

先頭でbyte型にキャストしています。これはReadByte()メソッドが、読み取ったバイトをint型で渡すため、全体がint型になっているからです。少し紛らわしいですね。

テスト

実際にファイルとパスワードを指定し、暗号化してみてください。xorという拡張子を持ったファイルが生成されます。そして、そのファイルをさらにもう1度暗号化してみてください。xorを2つくっつけたファイルができますが、そのファイルはもとのファイルと同じデータのはずです。

もとに戻ればパスワードがあっていたということですし、元に戻らなかったら復号化が失敗したということです。暗号化と復号化が全く同じアルゴリズムによって実現されていることを実感してください。

テキストデータだけでなく、画像などのバイナリデータも暗号化できます。次回はGUIアプリケーションの作り方を簡単に学び、最終回ではこの暗号化ソフトをGUIで実装してみます。