以下为MD5算法用c#的实现 //MD5.cs //MD5 16-bit,32-bits algorithm implemented in C#
using System; using System.Text;
namespace Encrypter { /// <summary> /// Summary description for MD5. /// </summary> public class MD5 { const int BITS_TO_A_BYTE = 8; const int BYTES_TO_A_WORD = 4; const int BITS_TO_A_WORD = 32; private static long[] m_lOnBits = new long[30 + 1]; private static long[] m_l2Power = new long[30 + 1];
private static long LShift(long lValue, long iShiftBits) { long LShift = 0; if (iShiftBits == 0) { LShift = lValue; return LShift; } else { if( iShiftBits == 31) { if (Convert.ToBoolean(lValue & 1)) { LShift = 0x80000000; } else { LShift = 0; } return LShift; } else { if( iShiftBits < 0 || iShiftBits > 31) { // Err.Raise 6; } } }
if (Convert.ToBoolean((lValue & m_l2Power[31 - iShiftBits]))) { LShift = ((lValue & m_lOnBits[31 - (iShiftBits + 1)]) * m_l2Power[iShiftBits]) | 0x80000000; } else { LShift = ((lValue & m_lOnBits[31 - iShiftBits]) * m_l2Power[iShiftBits]); }
return LShift; }
private static long RShift(long lValue, long iShiftBits) { long RShift = 0; if (iShiftBits == 0) { RShift = lValue; return RShift; } else { if( iShiftBits == 31) { if (Convert.ToBoolean(lValue & 0x80000000)) { RShift = 1; } else { RShift = 0; } return RShift; } else { if( iShiftBits < 0 || iShiftBits > 31) { // Err.Raise 6; } } }
RShift = (lValue & 0x7FFFFFFE) / m_l2Power[iShiftBits];
if (Convert.ToBoolean((lValue & 0x80000000))) { RShift = (RShift | (0x40000000 / m_l2Power[iShiftBits - 1])); }
return RShift; }
private static long RotateLeft(long lValue, long iShiftBits) { long RotateLeft = 0; RotateLeft = LShift(lValue, iShiftBits) | RShift(lValue, (32 - iShiftBits)); return RotateLeft; }
private static long AddUnsigned(long lX, long lY) { long AddUnsigned = 0; long lX4 = 0; long lY4 = 0; long lX8 = 0; long lY8 = 0; long lResult = 0;
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 = 0; md5_F = (x & y) | (( ~x) & z); return md5_F; }
private static long md5_G(long x, long y, long z) { long md5_G = 0; md5_G = (x & z) | (y & ( ~z)); return md5_G; }
private static long md5_H(long x, long y, long z) { long md5_H = 0; md5_H = (x ^ y ^ z); return md5_H; }
private static long md5_I(long x, long y, long z) { long md5_I = 0; 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 = 0; int lNumberOfWords = 0; long[] lWordArray = null; int lBytePosition = 0; int lByteCount = 0; int lWordCount = 0;
const int MODULUS_BITS = 512; const int CONGRUENT_BITS = 448;
lMessageLength = sMessage.Length; lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) / BITS_TO_A_BYTE)) / (MODULUS_BITS / BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS / BITS_TO_A_WORD); lWordArray = new long[lNumberOfWords];
lBytePosition = 0; lByteCount = 0;
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, 1).ToCharArray()[0]), lBytePosition); lByteCount = lByteCount + 1; }
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 - 2] = LShift(lMessageLength, 3); lWordArray[lNumberOfWords - 1] = RShift(lMessageLength, 29); ConvertToWordArray = lWordArray;
return ConvertToWordArray; }
private static string WordToHex(long lValue) { string WordToHex = ""; & [1] [2] [3] [4] [5] [6] 下一页 [VB.NET程序]VB的ShowInTaskbar功能分析以及用VC的实现 [Delphi程序]TFontNameComboBox及TFontSizeComboBox的实现 [Delphi程序]TManagedDataSet和DataSetPool的实现 [Delphi程序]MSN / QQ 中的动画表情 在Delphi中RichEdit的实现… [Web开发]利用JS获取IE客户端IP及MAC的实现 [Web开发]ASP.Net ViewState的实现 [Web开发]vb.net_asp.net跨栏表头_滚动表体的DataGrid的实现 [Web开发]无限分类算法 js 的实现 [JAVA开发]关于UDDI的实现 [SyBase]InnoDB 中文参考手册 --- 10 multiversioning 的实…
|