1.MD5是什么?
一种单向的加密方法,也就是说只有从明文到密文这一步,没有密文到明文这一步。
2.为什么用MD5呢?
作为识别ID,我们实际上并不需要知道它具体是多少,只需要保证两点,唯一的明文对着唯一密文,有高度的安全性,就行了。
3.MD5算法基本过程?
任意长度字符串输入->转化成byte数组->求余补长->分组->每组都做四轮数据变换->固定128位信息
4.第一步
将字符串转化为byte数组:
byte[] inputBytes = Encoding.Default.GetBytes (_input);
利用C#的Encoding里的方法即可。
5.第二步
求余补长:
1.求余,求余的目的是为了把每64个byte分成一组,也就是64*8=512个bit,512又将依据每32个的合成16个int,作为四轮数据变换的输入端。
2.当然,由于输入的字符串是任意长的,显然不能保证整除64之类的,所以我们必须对剩下的byte做补长,把他补成64位,补长规则是这样的:对于余数不足56位的,首先将他补至56位,补足规则是:填充1个1,N个0;对于56位以上的,补充规则都是一样的,总是将最后8位替换成byte数组的长度信息。
int byteLen = inputBytes.Length;
int []groups=null;
int groupCount=0;
groupCount=byteLen/64;
int rest=byteLen%64;
byte [] tempBytes=new byte[64];
if(rest<=56)
{
for(int i=0;i<rest;i++)
tempBytes[i]=inputBytes[byteLen-rest+i];
if(rest<56)
{
tempBytes[rest]=(byte)(1<<7);
for(int i=1;i<56-rest;i++)
tempBytes[rest+i]=0;
}
long len=(long)(byteLen<<3);
for(int i=0;i<8;i++)
{
tempBytes[56+i]=(byte)(len&0xFFL);
len=len>>8;
}
groups=divGroup(tempBytes,0);
trans(groups);
}
else
{
for(int i=0;i<rest;i++)
tempBytes[i]=inputBytes[byteLen-rest+i];
long len=(long)(byteLen<<3);
for(int i=0;i<8;i++)
{
tempBytes[56+i]=(byte)(len&