ツンデレ暗号化ソフト完成!

ホームC#入門講座第4章:簡易暗号化アルゴリズム > ツンデレ暗号化ソフト完成!

ツンデレ暗号化ソフト完成!

ソースコード

using System;
using System.IO;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
 
public class XorEncoder : Form
{
	private string filepath;
	private string password;
	private Button button1 = new Button();
	private Button button2 = new Button();
	private Label label1 = new Label();
	private Label label2 = new Label();
	private TextBox filepathBox = new TextBox();
	private TextBox passwordBox = new TextBox();
	
	static public void Main (string[] args)
	{
		Application.Run (new XorEncoder());
	}
 
	public XorEncoder()
	{
		// form
		this.Text = "ツンデレ暗号化「XorEncoder」";
		// button1
		button1.Text = "暗号化!!";
		button1.Location = new Point(200,90);
		button1.Click += new EventHandler (button1_Click);
		Controls.Add (button1);
		// button2
		button2.Text = "参照";
		button2.Location = new Point(200,60);
		button2.Click += new EventHandler (button2_Click);
		Controls.Add (button2);
		// label1
		label1.Text = "ファイルのパスとパスワードを入力するといいわっ!";
		label1.AutoSize = true;
		label1.Location = new Point(20,20);
		Controls.Add(label1);
		// label2
		label2.Text = "";
		label2.AutoSize = true;
		label2.Location = new Point (10, 120);
		Controls.Add(label2);
		// filepathBox
		filepathBox.Text = "filepath";
		filepathBox.Width = 170;
		filepathBox.Location = new Point(20,60);
		Controls.Add(filepathBox);
		// passwordBox
		passwordBox.Text = "password";
		passwordBox.Width = 170;
		passwordBox.Location = new Point(20,90);
		Controls.Add(passwordBox);
	}
 
	private void button1_Click (object sender, EventArgs e)
	{
		label2.Text = "いましてるわよっ! ちょっとくらい待ちなさいよっ!";
		this.filepath = filepathBox.Text;
		this.password = passwordBox.Text;
		
		byte[] passcord = Encoding.ASCII.GetBytes(this.password);
		
		FileStream fs_r = new FileStream(this.filepath, FileMode.Open, FileAccess.Read);
		FileStream fs_w = new FileStream(this.filepath + ".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();
		
		label2.Text = "べっ、べつにあなたのためにしたんじゃないんだからねっ!";
	}
	
	private void button2_Click (object sender, EventArgs e)
	{
		OpenFileDialog openFileDialog = new OpenFileDialog();

		openFileDialog.InitialDirectory = "c:\\" ;
		openFileDialog.Filter = "All files (*.*)|*.*" ;
		openFileDialog.FilterIndex = 1 ;
		openFileDialog.RestoreDirectory = true ;

		if(openFileDialog.ShowDialog() == DialogResult.OK)
			filepathBox.Text = openFileDialog.FileName;
	}
}

これが、XOR演算による簡易暗号化ソフト「XorEncoder」のGUI版のソースコードです。Linux上で書きましたので、Windows上では動作確認をしていません。

OpenFileDialogクラスと列挙型

これまでにきちんとオブジェクト指向を学んできた方は、このソースコードを理解する力があるはずです。ほぼ全て、既習です。

唯一、「OpenFileDialogクラス」は初めてです。Windowsには「ダイアログ」と呼ばれるフォームみたいなコントロールがあります。これはある特定の機能を満たすためだけにあらかじめ作られたフォームと言えます。

たとえば、ここではファイルを開くための「OpenFileDialog」を用いています。ほかには色を選択するものやファイルを保存するためのものがあります。このダイアログの使い方も、これまでのオブジェクト指向に則っています。

まず、newでオブジェクト化します。次に、プロパティで細かい設定をします。上の各プロパティの説明は省略しますので、自分で調べてください。最後に、ShowDialog()メソッドでダイアログを開きます。

「DialogResult.OK」は列挙型(列挙体)です。列挙型とは、数字をわかりやすい言葉にしたものです。ここでは、ダイアログの結果である「OK」や「Cancel」、「Yes」というのはもともと整数の1とか2とかを指します。しかし、数字よりも言葉の方がわかりやすいので、数字と言葉を対応させたのです。

using System;

namespace NewWorld
{
	enum Trick : int { Naoko, Jiro, Kenzo, Satomi }
	class MainClass
	{
		public static void Main(string[] args)
		{	
			Console.WriteLine((int)Trick.Kenzo);
		}
	}
}

ドラマ「TRICK」の主要メンバーの列挙体を宣言し、その3番目の「Kenzo」をint型に型変換して表示します。すると、2が表示されます。これは0から始まっているため、3番目が2なのです。このように、列挙型は enum キーワードを使って簡単に定義できます。

なお、ツンデレ仕様にしたのはその方が個性的になると思ったからであって、深い理由はありません。

コラム:プログラマの3要素

ラリー・ウォールという有名なプログラマによれば、プログラマには欠かせない3つの重要な要素があるということです。

これを見て、普通の人は驚くでしょう。しかし、私が初めてこれを知ったとき、納得してつい笑ってしまいました。

「無精」というのは余計なことに対して、です。たとえば、スーツを着て仕事をすることは、プログラマにとっては余計です。IT企業には私服を採用している企業が圧倒的に多いです。

「短気」というのは満たされない状態に対してです。エラーが出てコンパイルできないとき、「まぁいいか。残りは明日」という心構えではいつまでもコンパイルできません。うまくいかないとイライラしてしまうというのは、プログラマにとって必要です。

「傲慢」というのは自分の意思に対してです。言い替えれば「自尊心」です。自分が創り出すプログラムに対して愛情を注ぎ、他人のプログラムでもより効率的な解決があるならばそれを声に出します。

これらの要素は、「職人」のイメージと共通しているのではないでしょうか。プログラマが無精で短気で傲慢で、といったら最悪に思われるかもしれませんが、職人がそのようであればなんとなく美徳に感じます。

私たちはプログラマに対して「ヲタク」という偏見を抱いていますが、実際は「職人気質」なのです。ステップアップC#でプログラミングを学んだみなさんは、ぜひそのことを心にとどめておいてほしいと思います。