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);
            
        }

运行结果如下:

 

 

 

 

posted on 2012-05-02 14:43  北国的秋天  阅读(913)  评论(0)    收藏  举报

导航