首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# MD5加密算法解决方法

2012-03-24 
c# MD5加密算法给程序写一个登陆功能,听说要用MD5算法MD5原理是什么???c#代码怎么写???有没有其他的什么算

c# MD5加密算法
给程序写一个登陆功能,听说要用MD5算法
MD5原理是什么???c#代码怎么写???

有没有其他的什么算法??

[解决办法]

C# code
public string EncryptStr(string PWD, int Format)    {        string str = "";        switch (Format)        {            case 0:                str = FormsAuthentication.HashPasswordForStoringInConfigFile(PWD, "SHA1");                break;            case 1:                str = FormsAuthentication.HashPasswordForStoringInConfigFile(PWD, "MD5");                break;        }        return str;    }
[解决办法]
C# code
   static string UserMd5(string str)        {            string pwd = "";            MD5 md5 = MD5.Create();//实例化一个md5对像            // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择             byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(str));            // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得            for (int i = 0; i < s.Length; i++)            {                // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符                pwd = pwd + s[i].ToString("X");            }            return pwd;        }
[解决办法]


MD5算法是MD4算法的改进算法。Ron Rivest于1990年提出MD4单向散列函数,MD表示消息摘要(Message Digest),对输入消息,算法产生128位散列值。该算法首次公布之后,Ben den Boer和Antoon Bosselaers对算法三轮中的后两轮进行了成功的密码分析。在一个不相关的分析结果中,Ralph MerKle成功地攻击了前两轮。尽管这些攻击都没有扩展到整个算法,但Rivest还是改进了其算法,结果就是MD5算法。MD5算法是MIM 的改进算法,它比MIM更复杂,但设计思想相似,输入的消息可任意长,输出结果也仍为128位,特别适用于高速软件实现,是基于32位操作数的一些简单的位操作。
算法描述:
该算法的输入是一个字节串,每个字节8个bit。 
算法的执行分为以下几个步骤:
第一步.补位:
MD5算法先对输入的数据进行补位,使得数据的长度(以byte为单位)对64求余的结果是56。即数据扩展至LEN=K*64+56个字节 ,K为整数。
补位方法:补一个l,然后补0至满足上述要求。相当于补一个0x80的字节,再补值为0的字节。这一步里总共补充的字节数为0~63个。
第二步,附加数据长度:
用一个64位的整数表示数据的原始长度(以bit为单位),将这个数字的8个字节按低位的在前,高位在后的顺序附加在补位后的数据后面。这时,数据被填补后的总长度为:
LEN =K*64+56+8 (K+1)*64 Bytes。
※ 注意那个64位整数是输入数据的原始长度而不是填充字节后的长度。
第三步,初始化MD5参数:
有4个32位整数变量(A,B,C,D)用来计算信息摘要,每一个变量被初始化成以下以十六进制数表示的数值,低位的字节在前面。
word A:01 23 45 67
word B:89 ab cd ef
word C:fe dc ba 98
word D:76 54 32 10
第四步,定义四个MD5基本的按位操作函数:
x,Y,z为32位整数。
F(X,Y,Z)=(X and Y)or(not(x)and z)
c(x,Y,z)= (X and Z)or(Y and not(Z))
II(a,b,c,d,Mj,s,ti )表示a=b+((a+(H(b,c,d)++ ti)<<<s)
I(x,Y,Z)=Y or(X or not(z)) 
再定义四个分别用于四轮变换的函数。
设Mj表示消息的第J个子分组(从0到l5),<<<S表示循环左移S位,则四种操作为:
FF(a, b, c,d,Mj,s,ti)表示a=b+((a+(F(b,c,d)+Mj+ti)<<<s)
G(X,Y,Z)= (x and z)or(Y and not(Z))
ml(a,b,c,d,Mj,s,ti)表示a=b+((a+(rI(b,c,d)+Mi+ti)<<<s)
Ⅱ(a,b,c,d,Mj's'ti)表示a=b+((a+(I(b,c,d)+Mj+ti)<<<s)
第五步,对输入数据作变换:
处理数据,N是总的字节数,以64个字节为一组,每组作一次循环,每次循环进行四轮操作。要变换的64个字节用16个32位的整数数组M[0……15]表示。而数组T[1……64]表示一组常数,T[i]为4294967296*abs(sin(i))的32位整数部分,i的单位是弧度,i的取值从1到64。
MD5的典型应用是对一段信息(message)产生信息摘要(message—digest),以防止被篡改。比如,在unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:
MD5(tanajiya.tar.gz)= 0ca17569cOf726a831d895e269332461
这就是tanajiya.tar.gz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的任何形式的改变(包括人为修字符串变换算法,产生了这个唯一的MD5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算MD5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
MD5算法目前已经较为完善,大部分编程语言(环境)都提供了MD5算法的实现。
数字签名可以保证信息的原始性、完整性。因此,数字签名可以解决否认、伪造、篡改及冒充等问题。具体要求:发送:昔事后不能否认发送的报文签名、接收者能够核实发送者发送的报文签名、接收者不能伪造发送者的报文签名、接收者不能对发送者的报文进行部分篡改、网络中的某一用户不能冒充另一用户作为发送者或接收者。数字签名的应用范围十分广泛,在保障电子数据交换(EDI)的安全性上是一个突破性的进展,凡是需要对用户的身份进行判断的情况都可以使用数字签名,比如加密信件、商务信函、定货购买系统、远程金融交易、电子政务、自动模式处理等等。
[解决办法]
C# code
using System;using System.Collections.Generic;using System.Text;namespace DataCrypto{    /// <summary>    /// MD5加密    ---王雷 2007    ///Email:xiaolei.org@gmail.com    /// </summary>    public class MD5    {        public MD5()        { }        /// <summary>        /// 转换到MD5        /// </summary>        /// <param name="str">加密前字符串</param>        /// <param name="code">16位加密还是32位加密</param>        /// <returns>加密后字符串</returns>        public string to_md5(string str, int code)        {            if (code == 16) //16位MD5加密(取32位加密的9~25字符)             {                return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower().Substring(8, 16);            }            if (code == 32) //32位加密             {                return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(str, "MD5").ToLower();            }            return "00000000000000000000000000000000";        }    }} 


[解决办法]

C# code
/// </summary>    public static readonly string myKey = "abcdefg";    #region 加密方法    /// <summary>    /// 加密方法    /// </summary>    /// <param name="pToEncrypt">需要加密字符串</param>    /// <param name="sKey">密钥</param>    /// <returns>加密后的字符串</returns>    public static string Encrypt(string pToEncrypt, string sKey)    {        try        {            DESCryptoServiceProvider des = new DESCryptoServiceProvider();            //把字符串放到byte数组中            //原来使用的UTF8编码,我改成Unicode编码了,不行            byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);            //建立加密对象的密钥和偏移量            //使得输入密码必须输入英文文本            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);            des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);            MemoryStream ms = new MemoryStream();            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);            cs.Write(inputByteArray, 0, inputByteArray.Length);            cs.FlushFinalBlock();            StringBuilder ret = new StringBuilder();            foreach (byte b in ms.ToArray())            {                ret.AppendFormat("{0:X2}", b);            }            ret.ToString();            return ret.ToString();        }        catch (Exception ex)        {                   }        return "";    }    #endregion    #region 解密方法    /// <summary>    /// 解密方法    /// </summary>    /// <param name="pToDecrypt">需要解密的字符串</param>    /// <param name="sKey">密匙</param>    /// <returns>解密后的字符串</returns>    public static string Decrypt(string pToDecrypt, string sKey)    {        try        {            DESCryptoServiceProvider des = new DESCryptoServiceProvider();            byte[] inputByteArray = new byte[pToDecrypt.Length / 2];            for (int x = 0; x < pToDecrypt.Length / 2; x++)            {                int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));                inputByteArray[x] = (byte)i;            }            //建立加密对象的密钥和偏移量,此值重要,不能修改            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);            des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);            MemoryStream ms = new MemoryStream();            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);            cs.Write(inputByteArray, 0, inputByteArray.Length);            cs.FlushFinalBlock();            //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象            StringBuilder ret = new StringBuilder();            return System.Text.Encoding.Default.GetString(ms.ToArray());        }        catch (Exception ex)        {                   }        return "";    }    #endregion 

热点排行