zoukankan      html  css  js  c++  java
  • 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");
            }

  • 相关阅读:
    apache 访问出现403 Forbidden
    linux下用Apache一个IP多个域名建虚拟主机
    利用xargs 可以一次性卸载到位
    linux安装包地址备忘
    ii7安装php
    基于jQuery的对象切换插件:soChange 1.5 (点击下载)
    phpMyAdmin 缺少 mysqli 扩展。请检查 PHP 配置
    Android中的自动朗读(TTS)
    Android中的手势
    Android中的SQLiteOpenHelper类
  • 原文地址:https://www.cnblogs.com/zz-930474270/p/6016454.html
Copyright © 2011-2022 走看看