MD5加密

算法的应用

  MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。

算法描述

  对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

  在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。

  MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。

  当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。

  将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。

  主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
以一下是每次操作中用到的四个非线性函数(每轮一个)。

   F(X,Y,Z) =(X&Y)|((~X)&Z)
   G(X,Y,Z) =(X&Z)|(Y&(~Z))
   H(X,Y,Z) =X^Y^Z
   I(X,Y,Z)=Y^(X|(~Z))
   (&是与,|是或,~是非,^是异或)

  这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。

 

 与MD5 相关:
System.Security.Cryptography.MD5
System.Security.Cryptography.MD5CryptoServiceProvider()
System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSource, "MD5")

    例子: 
    /// <summary>
    ///方法一:通过使用 new 运算符创建对象
     /// </summary>
     /// <param name="strSource">需要加密的明文</param>
     /// <returns>返回16位加密结果,该结果取32位加密结果的第9位到25位</returns>
    public string Get_MD5_Method1(string strSource)
     {
          //new
        System.Security.Cryptography.MD5 md5 = newSystem.Security.Cryptography.MD5CryptoServiceProvider();

        //获取密文字节数组
        byte[] bytResult = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(strSource));

        //转换成字符串,并取9到25位
        string strResult = BitConverter.ToString(bytResult, 4, 8);

        //转换成字符串,32位

        //string strResult = BitConverter.ToString(bytResult);
        //BitConverter转换出来的字符串会在每个字符中间产生一个分隔符,需要去除掉
        strResult = strResult.Replace("-", "");

         return strResult;
    }

        ///<summary>
        ///方法二:通过调用特定加密算法的抽象类上的Create 方法,创建实现特定加密算法的对象。
        ///</summary>
        ///<param name="strSource">需要加密的明文</param>
        ///<returns>返回位加密结果</returns>
        public string Get_MD5_Method2(string strSource)
        {
            string strResult = "";
            //Create
            System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create();

            //注意编码UTF8、UTF7、Unicode等的选择 
            byte[] bytResult = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strSource));

            //字节类型的数组转换为字符串
            for (int i = 0; i < bytResult.Length; i++)
            { 
                //16进制转换
                strResult = strResult + bytResult[i].ToString("X");
            }

            return strResult;
        }

        ///<summary>
        ///方法三:直接使用HashPasswordForStoringInConfigFile生成
        ///</summary>
        ///<param name="strSource">需要加密的明文</param>
        ///<returns>返回位加密结果</returns>
        public string Get_MD5_Method3(string strSource)
        {
            returnSystem.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strSource, "MD5");
        }

 

posted @ 2016-10-31 16:54  fireBeating  阅读(198)  评论(0编辑  收藏  举报