博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# 的MD5加密算法
阅读量:4671 次
发布时间:2019-06-09

本文共 17346 字,大约阅读时间需要 57 分钟。

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

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using System.Threading.Tasks;  6   7 namespace BaseStationPDA  8 {  9     /**/ 10     ///  11     /// Summary description for MD5. 12     ///  13     public class MD5 14     { 15         const int BITS_TO_A_BYTE = 8; 16         const int BYTES_TO_A_WORD = 4; 17         const int BITS_TO_A_WORD = 32; 18         private static long[] m_lOnBits = new long[30 + 1]; 19         private static long[] m_l2Power = new long[30 + 1]; 20  21         private static long LShift(long lValue, long iShiftBits) 22         { 23             long LShift = 0; 24             if (iShiftBits == 0) 25             { 26                 LShift = lValue; 27                 return LShift; 28             } 29             else 30             { 31                 if (iShiftBits == 31) 32                 { 33                     if (Convert.ToBoolean(lValue & 1)) 34                     { 35                         LShift = 0x80000000; 36                     } 37                     else 38                     { 39                         LShift = 0; 40                     } 41                     return LShift; 42                 } 43                 else 44                 { 45                     if (iShiftBits < 0 || iShiftBits > 31) 46                     { 47                         // Err.Raise 6; 48                     } 49                 } 50             } 51  52             if (Convert.ToBoolean((lValue & m_l2Power[31 - iShiftBits]))) 53             { 54                 LShift = ((lValue & m_lOnBits[31 - (iShiftBits + 1)]) * m_l2Power[iShiftBits]) | 0x80000000; 55             } 56             else 57             { 58                 LShift = ((lValue & m_lOnBits[31 - iShiftBits]) * m_l2Power[iShiftBits]); 59             } 60  61             return LShift; 62         } 63  64         private static long RShift(long lValue, long iShiftBits) 65         { 66             long RShift = 0; 67             if (iShiftBits == 0) 68             { 69                 RShift = lValue; 70                 return RShift; 71             } 72             else 73             { 74                 if (iShiftBits == 31) 75                 { 76                     if (Convert.ToBoolean(lValue & 0x80000000)) 77                     { 78                         RShift = 1; 79                     } 80                     else 81                     { 82                         RShift = 0; 83                     } 84                     return RShift; 85                 } 86                 else 87                 { 88                     if (iShiftBits < 0 || iShiftBits > 31) 89                     { 90                         // Err.Raise 6; 91                     } 92                 } 93             } 94  95             RShift = (lValue & 0x7FFFFFFE) / m_l2Power[iShiftBits]; 96  97             if (Convert.ToBoolean((lValue & 0x80000000))) 98             { 99                 RShift = (RShift | (0x40000000 / m_l2Power[iShiftBits - 1]));100             }101 102             return RShift;103         }104 105         private static long RotateLeft(long lValue, long iShiftBits)106         {107             long RotateLeft = 0;108             RotateLeft = LShift(lValue, iShiftBits) | RShift(lValue, (32 - iShiftBits));109             return RotateLeft;110         }111 112         private static long AddUnsigned(long lX, long lY)113         {114             long AddUnsigned = 0;115             long lX4 = 0;116             long lY4 = 0;117             long lX8 = 0;118             long lY8 = 0;119             long lResult = 0;120 121             lX8 = lX & 0x80000000;122             lY8 = lY & 0x80000000;123             lX4 = lX & 0x40000000;124             lY4 = lY & 0x40000000;125 126             lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);127             if (Convert.ToBoolean(lX4 & lY4))128             {129                 lResult = lResult ^ 0x80000000 ^ lX8 ^ lY8;130             }131             else if (Convert.ToBoolean(lX4 | lY4))132             {133                 if (Convert.ToBoolean(lResult & 0x40000000))134                 {135                     lResult = lResult ^ 0xC0000000 ^ lX8 ^ lY8;136                 }137                 else138                 {139                     lResult = lResult ^ 0x40000000 ^ lX8 ^ lY8;140                 }141             }142             else143             {144                 lResult = lResult ^ lX8 ^ lY8;145             }146             AddUnsigned = lResult;147             return AddUnsigned;148         }149 150         private static long md5_F(long x, long y, long z)151         {152             long md5_F = 0;153             md5_F = (x & y) | ((~x) & z);154             return md5_F;155         }156 157         private static long md5_G(long x, long y, long z)158         {159             long md5_G = 0;160             md5_G = (x & z) | (y & (~z));161             return md5_G;162         }163 164         private static long md5_H(long x, long y, long z)165         {166             long md5_H = 0;167             md5_H = (x ^ y ^ z);168             return md5_H;169         }170 171         private static long md5_I(long x, long y, long z)172         {173             long md5_I = 0;174             md5_I = (y ^ (x | (~z)));175             return md5_I;176         }177 178         private static void md5_FF(ref long a, long b, long c, long d, long x, long s, long ac)179         {180             a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_F(b, c, d), x), ac));181             a = RotateLeft(a, s);182             a = AddUnsigned(a, b);183         }184 185         private static void md5_GG(ref long a, long b, long c, long d, long x, long s, long ac)186         {187             a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_G(b, c, d), x), ac));188             a = RotateLeft(a, s);189             a = AddUnsigned(a, b);190         }191 192         private static void md5_HH(ref long a, long b, long c, long d, long x, long s, long ac)193         {194             a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_H(b, c, d), x), ac));195             a = RotateLeft(a, s);196             a = AddUnsigned(a, b);197         }198 199         private static void md5_II(ref long a, long b, long c, long d, long x, long s, long ac)200         {201             a = AddUnsigned(a, AddUnsigned(AddUnsigned(md5_I(b, c, d), x), ac));202             a = RotateLeft(a, s);203             a = AddUnsigned(a, b);204         }205 206         private static long[] ConvertToWordArray(string sMessage)207         {208             long[] ConvertToWordArray = null;209             int lMessageLength = 0;210             int lNumberOfWords = 0;211             long[] lWordArray = null;212             int lBytePosition = 0;213             int lByteCount = 0;214             int lWordCount = 0;215 216             const int MODULUS_BITS = 512;217             const int CONGRUENT_BITS = 448;218 219             lMessageLength = sMessage.Length;220             lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) / BITS_TO_A_BYTE)) / (MODULUS_BITS / BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS / BITS_TO_A_WORD);221             lWordArray = new long[lNumberOfWords];222 223             lBytePosition = 0;224             lByteCount = 0;225 226             while (lByteCount < lMessageLength)227             {228                 lWordCount = lByteCount / BYTES_TO_A_WORD;229                 lBytePosition = (lByteCount % BYTES_TO_A_WORD) * BITS_TO_A_BYTE;230                 lWordArray[lWordCount] = lWordArray[lWordCount] | LShift(Convert.ToByte(sMessage.Substring(lByteCount, 1).ToCharArray()[0]), lBytePosition);231                 lByteCount = lByteCount + 1;232             }233 234             lWordCount = lByteCount / BYTES_TO_A_WORD;235             lBytePosition = (lByteCount % BYTES_TO_A_WORD) * BITS_TO_A_BYTE;236             lWordArray[lWordCount] = lWordArray[lWordCount] | LShift(0x80, lBytePosition);237             lWordArray[lNumberOfWords - 2] = LShift(lMessageLength, 3);238             lWordArray[lNumberOfWords - 1] = RShift(lMessageLength, 29);239             ConvertToWordArray = lWordArray;240 241             return ConvertToWordArray;242         }243 244         private static string WordToHex(long lValue)245         {246             string WordToHex = "";247             long lByte = 0;248             int lCount = 0;249             for (lCount = 0; lCount <= 3; lCount++)250             {251                 lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) & m_lOnBits[BITS_TO_A_BYTE - 1];252                 WordToHex = WordToHex + (("0" + ToHex(lByte)).Substring(("0" + ToHex(lByte)).Length - 2));253             }254             return WordToHex;255         }256 257         private static string ToHex(long dec)258         {259             string strhex = "";260             while (dec > 0)261             {262                 strhex = tohex(dec % 16) + strhex;263                 dec = dec / 16;264             }265             return strhex;266         }267 268         private static string tohex(long hex)269         {270             string strhex = "";271             switch (hex)272             {273                 case 10: strhex = "a"; break;274                 case 11: strhex = "b"; break;275                 case 12: strhex = "c"; break;276                 case 13: strhex = "d"; break;277                 case 14: strhex = "e"; break;278                 case 15: strhex = "f"; break;279                 default: strhex = hex.ToString(); break;280             }281             return strhex;282         }283 284 285         public static string Encrypt(string sMessage, int stype)286         {287             string MD5 = "";288 289             for (int i = 0; i <= 30; i++)290             {291                 m_lOnBits[i] = Convert.ToInt64(Math.Pow(2, i + 1) - 1);292                 m_l2Power[i] = Convert.ToInt64(Math.Pow(2, i));293             }294 295             long[] x = null;296             int k = 0;297             long AA = 0;298             long BB = 0;299             long CC = 0;300             long DD = 0;301             long a = 0;302             long b = 0;303             long c = 0;304             long d = 0;305 306             const int S11 = 7;307             const int S12 = 12;308             const int S13 = 17;309             const int S14 = 22;310             const int S21 = 5;311             const int S22 = 9;312             const int S23 = 14;313             const int S24 = 20;314             const int S31 = 4;315             const int S32 = 11;316             const int S33 = 16;317             const int S34 = 23;318             const int S41 = 6;319             const int S42 = 10;320             const int S43 = 15;321             const int S44 = 21;322 323             x = ConvertToWordArray(sMessage);324 325             a = 0x67452301;326             b = 0xEFCDAB89;327             c = 0x98BADCFE;328             d = 0x10325476;329 330             for (k = 0; k < x.Length; k += 16)331             {332                 AA = a;333                 BB = b;334                 CC = c;335                 DD = d;336 337                 md5_FF(ref a, b, c, d, x[k + 0], S11, 0xD76AA478);338                 md5_FF(ref d, a, b, c, x[k + 1], S12, 0xE8C7B756);339                 md5_FF(ref c, d, a, b, x[k + 2], S13, 0x242070DB);340                 md5_FF(ref b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);341                 md5_FF(ref a, b, c, d, x[k + 4], S11, 0xF57C0FAF);342                 md5_FF(ref d, a, b, c, x[k + 5], S12, 0x4787C62A);343                 md5_FF(ref c, d, a, b, x[k + 6], S13, 0xA8304613);344                 md5_FF(ref b, c, d, a, x[k + 7], S14, 0xFD469501);345                 md5_FF(ref a, b, c, d, x[k + 8], S11, 0x698098D8);346                 md5_FF(ref d, a, b, c, x[k + 9], S12, 0x8B44F7AF);347                 md5_FF(ref c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);348                 md5_FF(ref b, c, d, a, x[k + 11], S14, 0x895CD7BE);349                 md5_FF(ref a, b, c, d, x[k + 12], S11, 0x6B901122);350                 md5_FF(ref d, a, b, c, x[k + 13], S12, 0xFD987193);351                 md5_FF(ref c, d, a, b, x[k + 14], S13, 0xA679438E);352                 md5_FF(ref b, c, d, a, x[k + 15], S14, 0x49B40821);353                 md5_GG(ref a, b, c, d, x[k + 1], S21, 0xF61E2562);354                 md5_GG(ref d, a, b, c, x[k + 6], S22, 0xC040B340);355                 md5_GG(ref c, d, a, b, x[k + 11], S23, 0x265E5A51);356                 md5_GG(ref b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);357                 md5_GG(ref a, b, c, d, x[k + 5], S21, 0xD62F105D);358                 md5_GG(ref d, a, b, c, x[k + 10], S22, 0x2441453);359                 md5_GG(ref c, d, a, b, x[k + 15], S23, 0xD8A1E681);360                 md5_GG(ref b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);361                 md5_GG(ref a, b, c, d, x[k + 9], S21, 0x21E1CDE6);362                 md5_GG(ref d, a, b, c, x[k + 14], S22, 0xC33707D6);363                 md5_GG(ref c, d, a, b, x[k + 3], S23, 0xF4D50D87);364                 md5_GG(ref b, c, d, a, x[k + 8], S24, 0x455A14ED);365                 md5_GG(ref a, b, c, d, x[k + 13], S21, 0xA9E3E905);366                 md5_GG(ref d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);367                 md5_GG(ref c, d, a, b, x[k + 7], S23, 0x676F02D9);368                 md5_GG(ref b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);369                 md5_HH(ref a, b, c, d, x[k + 5], S31, 0xFFFA3942);370                 md5_HH(ref d, a, b, c, x[k + 8], S32, 0x8771F681);371                 md5_HH(ref c, d, a, b, x[k + 11], S33, 0x6D9D6122);372                 md5_HH(ref b, c, d, a, x[k + 14], S34, 0xFDE5380C);373                 md5_HH(ref a, b, c, d, x[k + 1], S31, 0xA4BEEA44);374                 md5_HH(ref d, a, b, c, x[k + 4], S32, 0x4BDECFA9);375                 md5_HH(ref c, d, a, b, x[k + 7], S33, 0xF6BB4B60);376                 md5_HH(ref b, c, d, a, x[k + 10], S34, 0xBEBFBC70);377                 md5_HH(ref a, b, c, d, x[k + 13], S31, 0x289B7EC6);378                 md5_HH(ref d, a, b, c, x[k + 0], S32, 0xEAA127FA);379                 md5_HH(ref c, d, a, b, x[k + 3], S33, 0xD4EF3085);380                 md5_HH(ref b, c, d, a, x[k + 6], S34, 0x4881D05);381                 md5_HH(ref a, b, c, d, x[k + 9], S31, 0xD9D4D039);382                 md5_HH(ref d, a, b, c, x[k + 12], S32, 0xE6DB99E5);383                 md5_HH(ref c, d, a, b, x[k + 15], S33, 0x1FA27CF8);384                 md5_HH(ref b, c, d, a, x[k + 2], S34, 0xC4AC5665);385                 md5_II(ref a, b, c, d, x[k + 0], S41, 0xF4292244);386                 md5_II(ref d, a, b, c, x[k + 7], S42, 0x432AFF97);387                 md5_II(ref c, d, a, b, x[k + 14], S43, 0xAB9423A7);388                 md5_II(ref b, c, d, a, x[k + 5], S44, 0xFC93A039);389                 md5_II(ref a, b, c, d, x[k + 12], S41, 0x655B59C3);390                 md5_II(ref d, a, b, c, x[k + 3], S42, 0x8F0CCC92);391                 md5_II(ref c, d, a, b, x[k + 10], S43, 0xFFEFF47D);392                 md5_II(ref b, c, d, a, x[k + 1], S44, 0x85845DD1);393                 md5_II(ref a, b, c, d, x[k + 8], S41, 0x6FA87E4F);394                 md5_II(ref d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);395                 md5_II(ref c, d, a, b, x[k + 6], S43, 0xA3014314);396                 md5_II(ref b, c, d, a, x[k + 13], S44, 0x4E0811A1);397                 md5_II(ref a, b, c, d, x[k + 4], S41, 0xF7537E82);398                 md5_II(ref d, a, b, c, x[k + 11], S42, 0xBD3AF235);399                 md5_II(ref c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);400                 md5_II(ref b, c, d, a, x[k + 9], S44, 0xEB86D391);401 402                 a = AddUnsigned(a, AA);403                 b = AddUnsigned(b, BB);404                 c = AddUnsigned(c, CC);405                 d = AddUnsigned(d, DD);406             }407 408             if (stype == 32)409             {410                 MD5 = ((((WordToHex(a)) + (WordToHex(b))) + (WordToHex(c))) + (WordToHex(d))).ToLower();411             }412             else413             {414                 MD5 = ((WordToHex(b)) + (WordToHex(c))).ToLower();415             }416             //   MD5=MD5.Replace("0", "a");417             //   MD5=MD5.Replace("1", "b");418             //   MD5=MD5.Replace("2", "cs");419             //   MD5=MD5.Replace("3", "d");420             //   MD5=MD5.Replace("4", "e");421             //   MD5=MD5.Replace("5", "f");422             //   MD5=MD5.Replace("6", "k");423             //   MD5=MD5.Replace("7", "s");424             //425             //   MD5=MD5.Replace("8", "r");426             //   MD5=MD5.Replace("9", "ip");427             //   MD5=MD5.Replace("j", "8");428             //   MD5=MD5.Replace("o", "3");429             //430             //   MD5=MD5.Replace("a", "04");431             //   MD5=MD5.Replace("m", "3");432             //   MD5=MD5.Replace("x", "67");433             //   MD5=MD5.Replace("p", "23");434             //   MD5=MD5.Replace("g", "7");435 436             //自已再加上个尾缀别人根本解不出来437 438             return MD5;439         }440     }441 }
View Code

 

转载于:https://www.cnblogs.com/lrj525/p/3510824.html

你可能感兴趣的文章
python路径相关小问题
查看>>
老李分享:持续集成学好jenkins之Git和Maven配置
查看>>
Android深度探索-卷1第二章心得体会
查看>>
linux中cat、more、less命令区别详解
查看>>
java读写文件总结
查看>>
阿里题目:明星群众问题
查看>>
为什么SQL用UPDATE语句更新时更新行数会多3行有触发器有触发器有触发器有触发器有触发器有触发器...
查看>>
关于hist
查看>>
Xtrareport 交叉报表
查看>>
谭浩强C语言第四版第九章课后习题7--9题(建立,输出,删除,插入链表处理)...
查看>>
20145101 《Java程序设计》第7周学习总结
查看>>
P2678 跳石头
查看>>
Alpha阶段项目复审
查看>>
ArrayQueue详解(待解决)
查看>>
ASP.NET 安全认证(四)
查看>>
IE9+下如何让input的placeholder样式生效
查看>>
使用 web storage 制作简单留言本
查看>>
61组第二次团队作业
查看>>
利用jsonp实现跨域请求
查看>>
查看Oracle表中的指定记录在数据文件中的位置
查看>>