ActiveX控件和自定义控件组开发(2)
开发具有对英文文本进行加密和解密功能的组件
设计思想:这里假设英文文本是由大小写字母、逗号、点号和空格组成。加密的原理是,先将这些字符随机地排成一圈,为叙述方便,不妨假设排成如下的圈(□表示空格):
令key表示密钥(这里为整数),对于英文文本(明文)中的每个字符,用其在圈中所在位置后面的第key个字符表示,这样就会得到一串“杂乱无章”的英文文本(密文)。例如,如果key为4,则文本"I am a boy. "加密后就变成密文"MdeqdedfsCc"。
解密方法是显然的,只需将密文中的字符用其在圈中所在位置前面的第key字符来表示即可。当然,解密用户必须知道密钥key,否则就算已有解密组件也无法还原密文。
步骤如下:
(1)创建类库程序EnDecrypting。方法是,在VS.NET 2008中选择“文件”|“新建”|“项目”命令,在打开的“新建项目”对话框中选择左边方框中的“Visual C#”项,在右边的方框中选择“类库”,然后将项目名设置为EnDecrypting,单击【确定】按钮。
(2)命名空间采用默认设置EnDecrypting,而将类名改为EnDecryptingClass;然后在该类中添加一个私有成员:
private string matrix =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,. ";
(3)接着在EnDecryptingClass类中添加两个方法,分别用于实现加密和解密:
public string Encrypting(string plaintext, int keycode) //加密
public string Decrypting(string ciphertext, int keycode) //解密
public string Encrypting(string plaintext, int keycode) //加密方法 { char[] chars = matrix.ToCharArray(); char[] ciphertext_arr = plaintext.ToCharArray(); //将明文散列到字符数组中 int i = 0, j = 0; for (i = 0; i < ciphertext_arr.Length; i++) { for (j = 0; j < chars.Length; j++) { if (matrix[j] == ciphertext_arr[i]) break; } if (j == matrix.Length) throw new Exception("明文中包含非法字符!"); int k = 0; while (k < keycode) { k++; j++; if (j == matrix.Length) j = 0; } ciphertext_arr[i] = matrix[j]; //明文转换为密文 } return new String(ciphertext_arr); //返回密文 }
public string Decrypting(string ciphertext, int keycode) //解密方法 { char[] chars = matrix.ToCharArray(); char[] plaintext_arr = ciphertext.ToCharArray(); //将密文散列到字符数组中 int i = 0, j = 0; for (i = 0; i < plaintext_arr.Length; i++) { for (j = 0; j < chars.Length; j++) { if (matrix[j] == plaintext_arr[i]) break; } if (j == matrix.Length) throw new Exception("密文中包含非法字符!"); int k = keycode - 1; while (k >= 0) { k--; j--; if (j == -1) j = matrix.Length - 1; } plaintext_arr[i] = matrix[j]; //密文转换为明文 } return new String(plaintext_arr); //返回明文 }
(4)生成加密、解密组件。方法是,选择菜单“生成”|“生成EnDecrypting”命令,即可在程序根目录的EnDecrypting\bin\Release子目录下生成以文件EnDecrypting.dll存在的加密、解密组件。
——与Windows控件库程序不同,类库程序不能直接测试运行,因此不利于程序的调试。我建议,先在窗体应用程序中编写实现相同功能的代码,然后将代码拷贝类库程序中,并作适当的修改,以提高开发效率
OK!下面运用这个控件
(1)创建名为testEnDecrypting的窗体应用程序,然后选择菜单“项目”|“添加应用”命令,在打开的“添加引用”对话框中打开“浏览”选项卡,定位到EnDecrypting.dll文件所在的目录,并选择该文件,如下图所示,然后点击【确定】按钮即可引入已创建的组件,以后就可以直接调用它了。
(2)在窗体上分别添加三个TextBox控件和三个Label控件以及两个Button控件,并对它们的有关属性、位置和大小作适当的设置和调整,并将窗体的Text属性值设置为“加密、解密程序”,结果如下图所示。
(3)制作用于输入密钥的对话框。由于C#中没有像VB.NET那样提供InputBox输入框,因此需要自己制作。方法是,在程序中再添加一个窗体,形成窗体Form2,并在该窗体上添加一个TextBox控件和一个Label控件,并作适当的调整和设置,结果如下图所示。
(4)为了使窗体Form2中输入的数据能传递到Form1中,需要编写相关代码 :
public partial class Form2 : Form { public Form2() { InitializeComponent(); } private int keycode = -1; public int keycodeValue //Form1利用该属性可以访问Form2中输入的数据 { get { return keycode; } } private void button1_Click(object sender, EventArgs e) { keycode = Convert.ToInt16(textBox1.Text); this.Close(); } }
//【加密和解密】按钮事件处理函数
private void button1_Click(object sender, EventArgs e)//加密 { Form2 f2 = new Form2(); f2.ShowDialog(); int key = 3; textBox2.Text = enDePassWord1.Encode(textBox1.Text, key); }
private void button2_Click(object sender, EventArgs e)//解密 { Form2 f2 = new Form2(); f2.ShowDialog(); int key = f2.getkey; textBox3.Text = enDePassWord1.Decode(textBox2.Text, key); }
运行结果如下:
浙公网安备 33010602011771号