万物の根源は数である

ホームC#入門講座第4章:簡易暗号化アルゴリズム > 万物の根源は数である

万物の根源は数である

文字を数字で表す

コンピュータの世界ではピタゴラスが正しいのです。現実世界では、たとえば「私が今飲んでる牛乳も数なのか?」という疑問に陥りますが、コンピュータ世界の「牛乳」は数です。実際に試してみますか?

using System;

namespace NewWorld
{
	class MainClass
	{
		public static void Main(string[] args)
		{	
			string milk = "牛乳";
			Console.WriteLine((int)milk[0]);
			Console.WriteLine((int)milk[1]);
		}
	}
}

文字列というのは文字の配列です。milk[0] や milk[1] は文字を表し、それをint型に型変換しています。表示されるのは 29275 と 20083 です。数字と文字を対応させています。文字に対応する数字を「文字コード」といい、文字コードを定める手順によっていろいろ種類があります。C#で標準なのは UTF-8 という文字コードで、これは世界共通です。

このように、文字コードを利用してパスワードを整数に変えることができます。

データを数字で表す

「データ」という言葉を用いるとき、普通は2種類のデータを想像します。一つは「テキストデータ」であり、もう一つは「バイナリデータ」です。

この2つの違いは、メモ帳で開けるかどうか、です。たとえば、ホームページの基になっている「HTML」というデータはメモ帳で開くことができます。私はLinuxのメモ帳で作ってさえもいます。要するに、「テキストエディタ」で読み書きできます。

一方、画像やプログラム本体はメモ帳では開けません。仲間由紀恵の画像をメモ帳で開いたらプロフィールが登場した、などということは普通はありません。それらは「バイナリデータ」であり、「バイナリエディタ」で読み書きができます。もっとも、バイナリエディタで開いても数字が並んでいるだけですが。

データはいずれにせよ、数字で表すことができます。よって、暗号化したいファイルを数字で表すことも可能です。

ではためしに、「テキストファイル」を「バイナリデータ」として開いてみましょう。自分で勝手にテキストファイルを作り、下のソースコードのパスの部分を調整してください。

using System;
using System.IO;

namespace NewWorld
{
	class MainClass
	{
		public static void Main(string[] args)
		{	
			FileStream fs_r = new FileStream("/home/satoshi/test.txt", FileMode.Open, FileAccess.Read);
			int data;
			while((data = fs_r.ReadByte()) != -1)
				Console.WriteLine(data);
		}
	}
}

よくわからない数字のら列が表示されました。ただ、なんとなく分かるのは「改行」が10で表されているのではないか、ということです。もっとも、これはただの勘ですが。

パスワードの使い方

データもパスワードも数字にできることは分かりましたが、入力されたパスワードを数字にしてどう使うのでしょうか。文字コードに置き換えて全部連結し、巨大な整数にする方法もありますが、その場合は int では足りないかもしれません。

文字コードに置き換えた数を全部足して、和を使うのでしょうか。それだと逆に少なすぎて、数百までやれば普通のパスワードは攻撃できてしまいます。

パスワードをどう使うか、というのはサンプルを作る際に私が一番悩んだ部分です。ソースコードを見る際は、その点に是非注意してください。次回は早速、ソースコードを公開します。