Udostępnij za pośrednictwem


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

   またしても更新が遅れてしまいました。。。可能な限り、前回までの記事を読んでいただかなくても大丈夫なように書きましたが、内容の都合上、(2)の記事をもしご覧になっていない方は、そこだけ簡単に見返していただく必要があるかと思います。よろしくお願いします。

 前回は、テキストボックス上の文字データを暗号化してファイルにセーブする処理を考えました。
 今回は、逆にそのセーブされたファイルからデータを読み込み、暗号化されたデータを復元して、再びテキストボックス上に再現する処理を考えたいと思います。

 読み込む処理のほうがむしろ簡単です。
 暗号化されているといっても、要するに2バイトで構成されている各文字の上位バイトと下位バイトを入れ替えてセーブされているということと、各バイトデータが右または左に1ビットローテーション(=1ビットシフトして、はみだした1ビットをあいたところに差し込むこと)されているだけですから、読み込み時にも同じようなことをすればいいはずです。つまり、2バイトずつ読み込み、その2バイトの上位と下位を入れ替えて、それぞれを暗号化時と逆方向にローテーションして、文字として正しいものにしてから、テキストボックスに貼り付けていけばいいわけです。

 流れとしては、以下のような形にしてみました。

  1. 暗号化されたファイルを、バイナリファイルとして開く
  2. 1バイト目を読み込み、変数high_8(バイト型)に入れる
  3. 2バイト目を読み込み、変数low_8(バイト型)に入れる
  4. 変数high_8を左に1ビットローテーションする (暗号化時には右に1ビットローテーションされていたのでこれで元に戻る)
  5. 変数low_8を右に1ビットローテーションする (暗号化時には左に1ビットローテーションされていたのでこれで元に戻る)
  6. 変数out_16(unshort型=2バイト長の変数)の上位バイトに変数low_8の内容を入れ、下位バイトに変数high_8の内容を入れる。(これで上位・下位の入れ替えができる)
  7. 変数out_16の内容を文字型とみなして、テキストボックスに貼り付ける。
  8. バイナリファイルの最後まで、2~7の処理を繰り返す
  9. ファイルを閉じる

上記4,5のローテーションには、前回の(2)の記事で作成した関数my_rotateを使用しています。
7の貼り付け対象テキストボックスはtextBox1です。ただし、下記のプログラムの中では、一旦ファイルから読んで復元された文字はすべて変数testbufに入れて、ファイルを閉じた後でテキストボックスにコピーしています。

それでは、以下にプログラムリストを掲示します。 

FileStream fs = newFileStream(filename, FileMode .Open);BinaryReader br = newBinaryReader
(fs);string testbuf = ""

;while
(br.PeekChar() != -1)
{ byte

high_8 = br.ReadByte(); byte
low_8 = br.ReadByte();
my_rotate(ref high_8, "left"
);
my_rotate(ref low_8, "right"
); ushort
out_16 = high_8;
out_16 = (ushort
)((out_16 << 8) | low_8);
testbuf += String.Format("{0}", (char
)out_16);
}
br.Close();

textBox1.Text = testbuf;