结合反射技术实现多算法动态加密

这个题目,我姑且这样叫吧,照例,我们先来分析一下需求。
比如有一个设置密码的功能,但用户希望能够自己选择密码的加密算法,如MD5、HMAC、SHA1等,然后程序会根据用户所选择的算法对密码进行加密并存入数据库,同时在配置文件中记录下用户的选择。
按照一般的思路,我们可能会做一个分支判断,如
[csharp]
switch( 用户的选择 ) 

    case "MD5": 
              MD5 md5 = MD5.Create();..............        
              break; 
             ........... 

 
 
 
呵呵,其实我们不必要这样做,来,先来看看MD5、HMAC、SHA1、SHA384等类有什么共同的特征?
1、都是通过调用Create静态方法来创建一个实例,当然,像MD5这些类都是抽象类,是不能被实例化的。其实,它们都返回一个名为“算法名CryptoServiceProvider”的类实例,如MD5CryptoServiceProvider、SHA1CryptoServiceProvider等,这些类都是对算法计算的具体实现。
2、都是通过调用ComputeHash方法计算哈希值的。
 
而且,这些类都是位于同一个命名空间下,因些,根据不同的算法进行加密,唯一不同的是类名,也就是说,我们的代码只写一次就可以了,把代码封装在一个方法中,通过在参数中传递类名。
 
能做到这种功夫的,也就用到反射了,通过反射动态动调用类成员来完成。
 
 
[csharp]
/// <summary> 
/// 通过算法计算哈希值。 
/// </summary> 
/// <param name="className">算法类名</param> 
/// <param name="tcode">待加密的字符串</param> 
/// <returns>加密后的字节数组</returns> 
private byte[] ComputeHash(string className, string tcode) 

    byte[] bufRes = null; 
    // 加载程序集 
    Assembly asmby = Assembly.Load(@"mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 
    Type myType = asmby.GetType("System.Security.Cryptography." + className, false, true); 
    if (myType != null) 
    { 
        // 得到与Create方法有关的MethodInfo 
        // GetMethod通过传入的Type数组的维数和类型来 
        // 判断获取哪个重载。 
        MethodInfo mdf=myType.GetMethod("Create",new Type[0]); 
        if (mdf != null) 
        { 
            object ob = null; 
            // 调用方法 
            ob = mdf.Invoke(null, null); 
            if (ob != null) 
            { 
                // 得到ComputeHash方法的MethodInfo 
                MethodInfo mfo = myType.GetMethod("ComputeHash", new Type[] { typeof(byte[]) }); 
                if (mfo!=null) 
                { 
                    // 调用方法 
                    bufRes = (byte[])mfo.Invoke(ob, new object[]{ 
                        Encoding.Default.GetBytes(tcode) 
                    }); 
                } 
            } 
        } 
    } 
    return bufRes; 

 
 
 
接着需要一个方法来把字节数组转为字符串。
 
 
[csharp]
/// <summary> 
/// 把字节数组转换为十六进制字符串。 
/// </summary> 
/// <param name="bf"></param> 
/// <returns></returns> 
private string ByteToStr(byte[] bf) 

    StringBuilder sb = new StringBuilder(); 
    foreach (byte b in bf) 
    { 
        sb.Append(b.ToString("x2")); 
    } 
    return sb.ToString(); 

 
 
 
然后,我们就可以在其它代码中使用了。
 
 
[csharp]
public partial class b : Form 

    public b() 
    { 
        InitializeComponent(); 
        comboBox1.Items.Add("HMAC"); 
        comboBox1.Items.Add("MD5"); 
        comboBox1.Items.Add("SHA1"); 
        comboBox1.Items.Add("SHA256"); 
        comboBox1.Items.Add("SHA384"); 
        comboBox1.Items.Add("SHA512"); 
        comboBox1.Items.Add("RIPEMD160"); 
        comboBox1.DropDownStyle = ComboBoxStyle.DropDownList; 
        comboBox1.SelectedIndex = 0; 
    } 
 
    private void button1_Click(object sender, EventArgs e) 
    { 
        if (comboBox1.SelectedIndex == -1) 
        { 
            return; 
        } 
        try 
        { 
            byte[] bHash = ComputeHash(comboBox1.SelectedItem.ToString(), txtIn.Text); 
            if (bHash != null) 
            { 
                txtOut.Text = ByteToStr(bHash); 
            } 
        } 
        catch (Exception ex) 
        { 
            MessageBox.Show(ex.Message); 
        } 
    } 
 
  好了,现在可以运行一个试试。

摘自 tcjiaan的专栏

时间: 2024-10-11 01:36:05

结合反射技术实现多算法动态加密的相关文章

7. 反射技术:其实就是动态加载一个指定的类

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

反射技术

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

JavaSE 学习笔记之反射技术(二十四)

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

反射技术的一些理解

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

反射技术总结

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有内容. 而且将字节码文件与内容都封装成了对象. 这样便于操作这些成员,简单说:反射技术可以对一个类进行解刨. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 获得Class对象.就是获取到指定的名称的字节码文件对象. 实例化对象,获得类的属性,方法或构造函数. 访问属性,调用方法,调用构造函数创建对象. 获取Class对象有三种方法. 每个类都具备getClass();方法,弊端:必须要创建该类对象,才可以调用该方法. 每一个数

Java反射技术详解

反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好处:大大的增强了程序的扩展性. 反射的基本步骤: 1.获得Class对象,就是获取到指定的名称的字节码文件对象. 2.实例化对象,获得类的属性.方法或构造函数. 3.访问属性.调用方法.调用构造函数创建对象. 获取这个Class对象,有三种方式: 1:通过每个对象都具备的方法getClass来获取.

Java中类加载机制和反射技术

我们知道一个对象在运行时有两种类型,一个是编译类型,一个是运行时类型.在程序运行时,往往是需要发现类和对象的真实的信息的.那么如何获的这种信息呢? 其一,如果我们在编译和运行时都知道类型的具体信息,这时是可以手动将一个对象转换为运行时的类型. 其二,如果我们在编译时无法预知对象和类到底是属于哪些类,那么程序只有依靠运行时的信息来发现对象和类的真实的信息了,这时就必须要用到反射技术. 在谈具体的发射技术之前,我想先回顾下,有关类的加载的一些基本的性质和原理,以方便我们更好地理解,反射的作用和特点.

C#反射技术概念作用和要点

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的名称.限定符和参数等.有了反射,即可对每一个类型了如指掌.如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道. 1..NET可执行应用程序结构 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构. 应用程序结构分为应用程序域—程序集—模块—类型—成员

Java反射技术学习总结

-------<a href="http://www.itheima.com/"">android培训</a>.<a href="http://www.itheima.com/" ">java培训</a>期待与您交流!---------- Java反射技术就是将java中的类的各个组成部分反射出来变为java中相应的数据类型获得. Java同样将类中的各个组成部分进行封装,变为一个个Java类. C