C# MD5 加密算法

  MD5 算法简介  

  MD5算法,即“Message-Digest Algorithm 5(信息-摘要算法)”,它是由MD2、MD3、 MD4 发展而来的一种单向加密算法,也就是哈希(HASH)算法,是由国际著名的公钥加 密算法标准RSA的第一设计者R.Rivest于上个世纪90 年代初开发出来的。现在,MD5已 经被广泛的应用到项目实践中。

  加密算法一般有两种,即单向加密算法和双向加密算法。双向加密是加密算法中最常用的,它将可以直接理解的明文数据加密为不可直接理解的密文数据,在需要的时候,又可以使用一定的算法将这些加密以后的密文数据解密为原来的明文数据。双向加密适合于隐秘通讯,比如,比如在网络上注册用户或者购买商品时,提交的真实姓名、身份证号码、 银行账号等信息,应当通过双向加密算法加密以后,再在网络上传输,这样,可以有效的 防止黑客的“偷听”,保证数据的安全,同时,网站接收到数据以后,可以通过解密算法来 获得准确的信息。

  双向加密既可以加密,又可以解密。而单向加密则刚好相反,它只能对明文数据进行 加密,而不能对加密了的密文数据再解密成原来的明文数据。可能读者会认为,不能解密 的加密算法有什么作用呢?在实际应用中,对软件系统数据库中的系统用户信息(如用户 密码)加密以及银行账号信息(如银行账号密码),就是一些典型的例子。当用户注册一个 新的账号或者使用银行账号时,这些绝密信息不是直接保存到数据库,而是经过单向加密后再保存,这样,即使这些绝密信息被泄露,别人也不能得到相应的明文数据,当然也就 达不到盗窃账号的目的。

  MD5算法就是单向加密的加密算法。它有两个很重要的特性,第一是任意两段明文数据,加密以后的密文数据一定是不相同的;第二是任意一段明文数据,经过加密以后,其密文数据永远是相同的。

  编写加密数据的方法

  微软在.NET架构中,引入了MD5算法,在使用Visual Studio 2008编程时,可以直接使用.NET 架构中提供的相关类来实现MD5 加密,这些类位于命名空间“System.Security.Cryptography”中。

  在本系统中,将使用MD5 加密用户密码的方法写在公共类“CPublic”中,因此首先 需要给“CPublic”类引入以下命名空间:

  //*************************************************************************************

  using System.Security.Cryptography;

  //*************************************************************************************

  然后在“CPublic”类中添加一个名为GetMd5Str()的静态方法,该静态方法用于将明文 字符串转换成密文的字符串。 定义好GetMd5Str()静态方法后,加上前面定义的公共数组userInfo,这时的“CPublic” 类代码如下:

  //*************************************************************************************

  using System;

  using System.Collections.Generic;

  using System.Linq; using System.Text;

  using System.Security.Cryptography;

  namespace SelectCourse

    {

      class CPublic

        {

          // 用于记录登录用户信息的字符串数组

          public static string[] userInfo = new string[4];

          // 使用MD5加密字符串的方法

          public static string GetMd5Str(string myString)

            {

              MD5 md5 = new MD5CryptoServiceProvider();

              // 获取字符串对应的字符数组

              byte[] fromData = System.Text.Encoding.Unicode.GetBytes(myString);

              // 获取哈希字符串数组

              byte[] toData = md5.ComputeHash(fromData);

              string byteStr = null;

              for (int i = 0; i < toData.Length; i++)

                {

                  // 将字符数组连接还原成字符串,以十六进制的方式表示,不带前导"0x"

                  byteStr += toData[i].ToString("x");

                } return byteStr;

            }

        }

    } //*************************************************************************************

  说明:该代码即为本系统中“CPublic”类的最终代码。

  在 GetMd5Str()静态方法中,包含一个字符串类型的形式参数“myString”,该静态方法可以将指定的字符串“myString”使用MD5算法进行加密,然后返回加密后的密文数据字 符串“byteStr”。

  代码中“MD5CyptoServiceProvider”类是.NET 中“System.Security.Cryptography”命 名空间的一个类,提供专门用于MD5 单向数据加密的解决方法,也是本文中用来加密数据 库中用户密码的类。

  在使用上面编写“GetMd5Str()”方法加密系统用户密码之前,首先需要了解 “MD5CyptoServiceProvider”类中的一个重要的方法:ComputeHash()方法。ComputeHash() 方法用来将输入的明文数据(字符数组形式)使用MD5进行加密,然后输出加密后的密文 数据。在“GetMd5Str()”方法中:要加密的明文字符串为“myString”;用于存放明文字符 串的字符数组为“fromData”;用于接收密文数据的字符数组为“toData”;方法的返回值为 密文字符串“byteStr”。

  从代码中可以看出,“ComputeHash()”方法只能接受字符数组作为加密对象,输出的 密文也是字符数组。因此,在对明文字符串加密之前,必须首先将字符串转化为字符数组, 这就要用到“Encoding”类的GetBytes()方法,将字符串转化为字符数组,而加密以后的结 果也是使用字符数组输出。同样,在返回方法的返回值之前,也需要将密文字符数组转换 成密文字符串。

posted on 2012-03-17 19:55  ryuu  阅读(857)  评论(0编辑  收藏  举报

导航