暗号化テキストエディタを作る(1)

 インストールの話から時間がたってしまいましたが、今日こそは何か作って見ようと思います。

 ありきたりに「簡易エディタ」とか「画像Viewer」とかを作って無難に流すことも可能かとは思いますが、それでは面白くないので、本当に自分が欲しいツール、作りたいツールを作ることを前提にしていきたいと思います。
 欲しいツール・・・とりあえず今欲しいのは、人に見られたくないようなデータを書きとめておくことができるメモが欲しいですね。
 もちろんそういうツールは多数存在しますし、Officeの機能を使って機密データにすることも可能ですが、あくまで簡単に使えて、軽くて、かつデータは盗まれてもエディタなどでは見られない、そういうものにしたいと思います。

 では、今日は以下のような感じの、テキストボックスに書かれた文字をちょっとだけ細工して保存・読み込みするようなアプリケーションを作って見ます。

 とりあえず、Windowsアプリケーションを作成し、テキストボックスを貼り付け、ボタンを2つ貼ります。
 (この辺のコントロールの貼り付けは、あまり丁寧に書かないで先を急ぎます。)
 テキストボックスの名前はtextBox1、ボタンの名前は保存用ボタンがbutton1、読み込み用のボタンがbutton2です。
 テキストボックスの方は、プロパティのMultilineをTrueにして複数行の入力ができるようにして、ScrollbarsをVerticalに変更して、縦のスクロールバーが出てくるようにしました。

 さて、いよいよコードを書くことを考えます。まずは保存です。
 とりあえず、現在開かれているデザインの画面上で、先ほど作成した「保存」ボタンをダブルクリックしてください。
 保存ボタンを押した際に実行されるコードを書く画面になるはずです。
  今回のコードは、テキストボックス上の文字を、軽く暗号化?してファイルに保存するためのものです。
 単にテキストボックス上の文字を、テキストデータとしてTXTファイルに書き込むだけなら、StreamWriterというクラスを使って非常に簡単にファイル作成ができるのですが、今回はテキストデータとしてではなく、将来的には暗号化したデータとして保存したいので、バイナリファイルとして保存します。
 バイナリファイルを作成して書き込みをするには、BinaryWriterというクラスを使います。
 例えば、Dドライブの直下にTemp.binというファイルを作成して、16進数のFF08というデータを書き込みたいならば、こんな感じになります。

      FileStream filename = new FileStream("D:\\Temp.bin", FileMode.Create);
BinaryWriter bw = new BinaryWriter(filename);
ushort out_16 = 0xFF08;
bw.Write( out_16 );
      bw.Close();

1行目、2行目でファイルをオープンし、3行目で書き込み対象データを準備、4行目で書き込み、5行目でファイルをクローズしています。
 ただし、このコードを入力する前に、プログラム全体の先頭に、 using System.IO; と書く必要があります。
 これは、これからファイル系のクラスを使用するために、それらのクラスが含まれているNamespaceを結合するためのものです。前準備と思っていただければいいでしょう。

 それでは、これをベースに、今度はString型の変数に入っている漢字一文字を、バイナリファイルに出力するようにしてみましょう。
 String型の変数に入っている文字は、内部的にはUnicode形式で保存されています。したがって一文字で2バイト必要になります。また、String型の一文字目だけを参照するには、

      string buf = "山田";
      ushort out_16 = (ushort)buf[0];

 のようにします。 ushortという型は2バイトの整数型、String型から取り出した1文字も2バイトなので、上記のようにキャスト(buf[0]の前に(ushort)と書くことで、buf[0]をあたかもushort型のようにだまして使うこと)をすれば代入ができます。

 では、これを先のコードと合成して、「山」一文字をバイナリファイルに出力するコードにすると

      FileStream filename = new FileStream(""D:\\Temp.bin", FileMode.Create);
BinaryWriter bw = new BinaryWriter(filename);
string buf = "山";
ushort out_16 = (ushort)buf[0];
bw.Write(out_16); bw.Close();

こんな感じになります。 さて、せっかくですから保存されたファイルの中を見て見ましょう。メモ帳(Notepad.exe)を開いて、D:\Temp.binをドラッグ&ドロップしてみると、おそらく q\ のように、意味不明のデータが表示されたかと思います。
 まだ、暗号化もなにもしていないのに、ただUnicodeのままファイルに出力しただけなのに、なぜこうなるか?それは、本来ならば、Unicode文字列の先頭には16進数のFEというデータを付加して、この文字列がUnicodeであることを示さなければならないのですが、我々の作ったコードには、その16進数のFEを書き込む動作が入っていないからです。
 しかし、今回はこの方が好都合なので(簡単には読めないデータを作りたい)、そのまま使うことにします。

(つづく)