发现用C#封装好的内部类实现MD5加密和其它语言的MD5加密结果有时会不一样,暂时发现没有特殊字符时的结果是一样的,一旦有特殊字符(09404719290010210‹»×úÛ±8*«À‡7œ–201009291740497794047192900102–œ7‡À«*8±Ûú×»‹01201009291740490)结果就不一样了,所以有了下面的代码:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace BaseStationPDA
{
/**/
/// <summary>
/// Summary description for MD5.
/// </summary>
public class MD5
{
const int BITS_TO_A_BYTE = ;
const int BYTES_TO_A_WORD = ;
const int BITS_TO_A_WORD = ;
private static long[] m_lOnBits = new long[ + ];
private static long[] m_l2Power = new long[ + ]; private static long LShift(long lValue, long iShiftBits)
{
long LShift = ;
if (iShiftBits == )
{
LShift = lValue;
return LShift;
}
else
{
if (iShiftBits == )
{
if (Convert.ToBoolean(lValue & ))
{
LShift = 0x80000000;
}
else
{
LShift = ;
}
return LShift;
}
else
{
if (iShiftBits < || iShiftBits > )
{
// Err.Raise 6;
}
}
} if (Convert.ToBoolean((lValue & m_l2Power[ - iShiftBits])))
{
LShift = ((lValue & m_lOnBits[ - (iShiftBits + )]) * m_l2Power[iShiftBits]) | 0x80000000;
}
else
{
LShift = ((lValue & m_lOnBits[ - iShiftBits]) * m_l2Power[iShiftBits]);
} return LShift;
} private static long RShift(long lValue, long iShiftBits)
{
long RShift = ;
if (iShiftBits == )
{
RShift = lValue;
return RShift;
}
else
{
if (iShiftBits == )
{
if (Convert.ToBoolean(lValue & 0x80000000))
{
RShift = ;
}
else
{
RShift = ;
}
return RShift;
}
else
{
if (iShiftBits < || iShiftBits > )
{
// Err.Raise 6;
}
}
} RShift = (lValue & 0x7FFFFFFE) / m_l2Power[iShiftBits]; if (Convert.ToBoolean((lValue & 0x80000000)))
{
RShift = (RShift | (0x40000000 / m_l2Power[iShiftBits - ]));
} return RShift;
} private static long RotateLeft(long lValue, long iShiftBits)
{
long RotateLeft = ;
RotateLeft = LShift(lValue, iShiftBits) | RShift(lValue, ( - iShiftBits));
return RotateLeft;
} private static long AddUnsigned(long lX, long lY)
{
long AddUnsigned = ;
long lX4 = ;
long lY4 = ;
long lX8 = ;
long lY8 = ;
long lResult = ; lX8 = lX & 0x80000000;
lY8 = lY & 0x80000000;
lX4 = lX & 0x40000000;
lY4 = lY & 0x40000000; lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
if (Convert.ToBoolean(lX4 & lY4))
{
lResult = lResult ^ 0x80000000 ^ lX8 ^ lY8;
}
else if (Convert.ToBoolean(lX4 | lY4))
{
if (Convert.ToBoolean(lResult & 0x40000000))
{
lResult = lResult ^ 0xC0000000 ^ lX8 ^ lY8;
}
else
{
lResult = lResult ^ 0x40000000 ^ lX8 ^ lY8;
}
}
else
{
lResult = lResult ^ lX8 ^ lY8;
}
AddUnsigned = lResult;
return AddUnsigned;
} private static long md5_F(long x, long y, long z)
{
long md5_F = ;
md5_F = (x & y) | ((~x) & z);
return md5_F;
} private static long md5_G(long x, long y, long z)
{
long md5_G = ;
md5_G = (x & z) | (y & (~z));
return md5_G;
} private static long md5_H(long x, long y, long z)
{
long md5_H = ;
md5_H = (x ^ y ^ z);
return md5_H;
} private static long md5_I(long x, long y, long z)
{
long md5_I = ;
md5_I = (y ^ (x | (~z)));
return md5_I;
} private static void md5_FF(ref long a, long b, long c, long d, long x, long s, long ac)
{
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac));
a = RotateLeft(a, s);
a = AddUnsigned(a, b);
} private static void md5_GG(ref long a, long b, long c, long d, long x, long s, long ac)
{
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac));
a = RotateLeft(a, s);
a = AddUnsigned(a, b);
} private static void md5_HH(ref long a, long b, long c, long d, long x, long s, long ac)
{
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac));
a = RotateLeft(a, s);
a = AddUnsigned(a, b);
} private static void md5_II(ref long a, long b, long c, long d, long x, long s, long ac)
{
a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac));
a = RotateLeft(a, s);
a = AddUnsigned(a, b);
} private static long[] ConvertToWordArray(string sMessage)
{
long[] ConvertToWordArray = null;
int lMessageLength = ;
int lNumberOfWords = ;
long[] lWordArray = null;
int lBytePosition = ;
int lByteCount = ;
int lWordCount = ; const int MODULUS_BITS = ;
const int CONGRUENT_BITS = ; lMessageLength = sMessage.Length;
lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) / BITS_TO_A_BYTE)) / (MODULUS_BITS / BITS_TO_A_BYTE)) + ) * (MODULUS_BITS / BITS_TO_A_WORD);
lWordArray = new long[lNumberOfWords]; lBytePosition = ;
lByteCount = ; while (lByteCount < lMessageLength)
{
lWordCount = lByteCount / BYTES_TO_A_WORD;
lBytePosition = (lByteCount % BYTES_TO_A_WORD) * BITS_TO_A_BYTE;
lWordArray[lWordCount] = lWordArray[lWordCount] | LShift(Convert.ToByte(sMessage.Substring(lByteCount, ).ToCharArray()[]), lBytePosition);
lByteCount = lByteCount + ;
} lWordCount = lByteCount / BYTES_TO_A_WORD;
lBytePosition = (lByteCount % BYTES_TO_A_WORD) * BITS_TO_A_BYTE;
lWordArray[lWordCount] = lWordArray[lWordCount] | LShift(0x80, lBytePosition);
lWordArray[lNumberOfWords - ] = LShift(lMessageLength, );
lWordArray[lNumberOfWords - ] = RShift(lMessageLength, );
ConvertToWordArray = lWordArray; return ConvertToWordArray;
} private static string WordToHex(long lValue)
{
string WordToHex = "";
long lByte = ;
int lCount = ;
for (lCount = ; lCount <= ; lCount++)
{
lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) & m_lOnBits[BITS_TO_A_BYTE - ];
WordToHex = WordToHex + (("" + ToHex(lByte)).Substring(("" + ToHex(lByte)).Length - ));
}
return WordToHex;
} private static string ToHex(long dec)
{
string strhex = "";
while (dec > )
{
strhex = tohex(dec % ) + strhex;
dec = dec / ;
}
return strhex;
} private static string tohex(long hex)
{
string strhex = "";
switch (hex)
{
case : strhex = "a"; break;
case : strhex = "b"; break;
case : strhex = "c"; break;
case : strhex = "d"; break;
case : strhex = "e"; break;
case : strhex = "f"; break;
default: strhex = hex.ToString(); break;
}
return strhex;
} public static string Encrypt(string sMessage, int stype)
{
string MD5 = ""; for (int i = ; i <= ; i++)
{
m_lOnBits[i] = Convert.ToInt64(Math.Pow(, i + ) - );
m_l2Power[i] = Convert.ToInt64(Math.Pow(, i));
} long[] x = null;
int k = ;
long AA = ;
long BB = ;
long CC = ;
long DD = ;
long a = ;
long b = ;
long c = ;
long d = ; const int S11 = ;
const int S12 = ;
const int S13 = ;
const int S14 = ;
const int S21 = ;
const int S22 = ;
const int S23 = ;
const int S24 = ;
const int S31 = ;
const int S32 = ;
const int S33 = ;
const int S34 = ;
const int S41 = ;
const int S42 = ;
const int S43 = ;
const int S44 = ; x = ConvertToWordArray(sMessage); a = 0x67452301;
b = 0xEFCDAB89;
c = 0x98BADCFE;
d = 0x10325476; for (k = ; k < x.Length; k += )
{
AA = a;
BB = b;
CC = c;
DD = d; md5_FF(ref a, b, c, d, x[k + ], S11, 0xD76AA478);
md5_FF(ref d, a, b, c, x[k + ], S12, 0xE8C7B756);
md5_FF(ref c, d, a, b, x[k + ], S13, 0x242070DB);
md5_FF(ref b, c, d, a, x[k + ], S14, 0xC1BDCEEE);
md5_FF(ref a, b, c, d, x[k + ], S11, 0xF57C0FAF);
md5_FF(ref d, a, b, c, x[k + ], S12, 0x4787C62A);
md5_FF(ref c, d, a, b, x[k + ], S13, 0xA8304613);
md5_FF(ref b, c, d, a, x[k + ], S14, 0xFD469501);
md5_FF(ref a, b, c, d, x[k + ], S11, 0x698098D8);
md5_FF(ref d, a, b, c, x[k + ], S12, 0x8B44F7AF);
md5_FF(ref c, d, a, b, x[k + ], S13, 0xFFFF5BB1);
md5_FF(ref b, c, d, a, x[k + ], S14, 0x895CD7BE);
md5_FF(ref a, b, c, d, x[k + ], S11, 0x6B901122);
md5_FF(ref d, a, b, c, x[k + ], S12, 0xFD987193);
md5_FF(ref c, d, a, b, x[k + ], S13, 0xA679438E);
md5_FF(ref b, c, d, a, x[k + ], S14, 0x49B40821);
md5_GG(ref a, b, c, d, x[k + ], S21, 0xF61E2562);
md5_GG(ref d, a, b, c, x[k + ], S22, 0xC040B340);
md5_GG(ref c, d, a, b, x[k + ], S23, 0x265E5A51);
md5_GG(ref b, c, d, a, x[k + ], S24, 0xE9B6C7AA);
md5_GG(ref a, b, c, d, x[k + ], S21, 0xD62F105D);
md5_GG(ref d, a, b, c, x[k + ], S22, 0x2441453);
md5_GG(ref c, d, a, b, x[k + ], S23, 0xD8A1E681);
md5_GG(ref b, c, d, a, x[k + ], S24, 0xE7D3FBC8);
md5_GG(ref a, b, c, d, x[k + ], S21, 0x21E1CDE6);
md5_GG(ref d, a, b, c, x[k + ], S22, 0xC33707D6);
md5_GG(ref c, d, a, b, x[k + ], S23, 0xF4D50D87);
md5_GG(ref b, c, d, a, x[k + ], S24, 0x455A14ED);
md5_GG(ref a, b, c, d, x[k + ], S21, 0xA9E3E905);
md5_GG(ref d, a, b, c, x[k + ], S22, 0xFCEFA3F8);
md5_GG(ref c, d, a, b, x[k + ], S23, 0x676F02D9);
md5_GG(ref b, c, d, a, x[k + ], S24, 0x8D2A4C8A);
md5_HH(ref a, b, c, d, x[k + ], S31, 0xFFFA3942);
md5_HH(ref d, a, b, c, x[k + ], S32, 0x8771F681);
md5_HH(ref c, d, a, b, x[k + ], S33, 0x6D9D6122);
md5_HH(ref b, c, d, a, x[k + ], S34, 0xFDE5380C);
md5_HH(ref a, b, c, d, x[k + ], S31, 0xA4BEEA44);
md5_HH(ref d, a, b, c, x[k + ], S32, 0x4BDECFA9);
md5_HH(ref c, d, a, b, x[k + ], S33, 0xF6BB4B60);
md5_HH(ref b, c, d, a, x[k + ], S34, 0xBEBFBC70);
md5_HH(ref a, b, c, d, x[k + ], S31, 0x289B7EC6);
md5_HH(ref d, a, b, c, x[k + ], S32, 0xEAA127FA);
md5_HH(ref c, d, a, b, x[k + ], S33, 0xD4EF3085);
md5_HH(ref b, c, d, a, x[k + ], S34, 0x4881D05);
md5_HH(ref a, b, c, d, x[k + ], S31, 0xD9D4D039);
md5_HH(ref d, a, b, c, x[k + ], S32, 0xE6DB99E5);
md5_HH(ref c, d, a, b, x[k + ], S33, 0x1FA27CF8);
md5_HH(ref b, c, d, a, x[k + ], S34, 0xC4AC5665);
md5_II(ref a, b, c, d, x[k + ], S41, 0xF4292244);
md5_II(ref d, a, b, c, x[k + ], S42, 0x432AFF97);
md5_II(ref c, d, a, b, x[k + ], S43, 0xAB9423A7);
md5_II(ref b, c, d, a, x[k + ], S44, 0xFC93A039);
md5_II(ref a, b, c, d, x[k + ], S41, 0x655B59C3);
md5_II(ref d, a, b, c, x[k + ], S42, 0x8F0CCC92);
md5_II(ref c, d, a, b, x[k + ], S43, 0xFFEFF47D);
md5_II(ref b, c, d, a, x[k + ], S44, 0x85845DD1);
md5_II(ref a, b, c, d, x[k + ], S41, 0x6FA87E4F);
md5_II(ref d, a, b, c, x[k + ], S42, 0xFE2CE6E0);
md5_II(ref c, d, a, b, x[k + ], S43, 0xA3014314);
md5_II(ref b, c, d, a, x[k + ], S44, 0x4E0811A1);
md5_II(ref a, b, c, d, x[k + ], S41, 0xF7537E82);
md5_II(ref d, a, b, c, x[k + ], S42, 0xBD3AF235);
md5_II(ref c, d, a, b, x[k + ], S43, 0x2AD7D2BB);
md5_II(ref b, c, d, a, x[k + ], S44, 0xEB86D391); a = AddUnsigned(a, AA);
b = AddUnsigned(b, BB);
c = AddUnsigned(c, CC);
d = AddUnsigned(d, DD);
} if (stype == )
{
MD5 = ((((WordToHex(a)) + (WordToHex(b))) + (WordToHex(c))) + (WordToHex(d))).ToLower();
}
else
{
MD5 = ((WordToHex(b)) + (WordToHex(c))).ToLower();
}
// MD5=MD5.Replace("0", "a");
// MD5=MD5.Replace("1", "b");
// MD5=MD5.Replace("2", "cs");
// MD5=MD5.Replace("3", "d");
// MD5=MD5.Replace("4", "e");
// MD5=MD5.Replace("5", "f");
// MD5=MD5.Replace("6", "k");
// MD5=MD5.Replace("7", "s");
//
// MD5=MD5.Replace("8", "r");
// MD5=MD5.Replace("9", "ip");
// MD5=MD5.Replace("j", "8");
// MD5=MD5.Replace("o", "3");
//
// MD5=MD5.Replace("a", "04");
// MD5=MD5.Replace("m", "3");
// MD5=MD5.Replace("x", "67");
// MD5=MD5.Replace("p", "23");
// MD5=MD5.Replace("g", "7"); //自已再加上个尾缀别人根本解不出来 return MD5;
}
}
}
04-25 07:06