发现用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;
}
}
}

c# 的MD5加密算法的更多相关文章

  1. 一起谈谈MD5加密算法

    MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...

  2. MD5加密算法

    package com.bao.tools.encryption; import java.security.MessageDigest;import java.security.NoSuchAlgo ...

  3. md5加密算法c语言版

    from: http://blog.sina.com.cn/s/blog_693de6100101kcu6.html 注:以下是md5加密算法c语言版(16/32位) ---------------- ...

  4. MD5加密算法测试

    在用户注册这一块,密码加密保证客户信息安全是最重要的,在网上查询了一些资料,发现加密算法比较流行的有MD5,DES和SHA. 虽然SHA与MD5通过碰撞法被破解了,但是MD5和SHA仍被公认是安全的加 ...

  5. 标准MD5加密算法

    标准MD5加密算法: public class Md5 { public static String getMd5(String s) { char hexDigits[] = { '0', '1', ...

  6. MD5加密算法(java及js)

    为了防止用户登陆过程中信息被拦截导致信息泄露,我们应该在客户端就对用户密码进行加密.浏览器提交给服务器的是加密后的信息,即使被恶意拦截,被拦截信息也已做了加密处理,现在比较安全的一种加密算法是MD5加 ...

  7. MD5加密算法的Java版本

    网上搜索Java实现MD5的资料很多,错误的也很多. 之前编写的一个阿里云直播鉴权原理算法需要用到MD5算法,网上找了几个,都是不行,浪费了时间,现在贴一个,做备用. import java.secu ...

  8. JAVA实现MD5加密算法(使用MessageDigest)

    http://blog.csdn.net/ymc0329/article/details/6738711 *********************************************** ...

  9. c++Builder XE6 MD5 加密算法 BASE64 URL 编码

    xe6,xe7 BASE64XE6 MD5 加密算法Delphifunction MD5(const texto: string): string; var idmd5: TIdHashMessage ...

  10. MD5加密算法原理及其应用

    MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆:所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后 ...

随机推荐

  1. Android学习笔记(十)

    Android控件——ListView ListView允许用户通过手指上下滑动的方式将屏幕外的数据滚动到屏幕内,同时 屏幕上原有的数据则会滚动出屏幕. 1.ListView的简单用法 新建一个Lis ...

  2. linux 出core设置问题

    我所在的环境是RedHat 1.第一步 修改/etc/security/limits.conf添加一行 user为生效的用户 user hard core unlimited 2.第二步 在普通用户的 ...

  3. tornado api 简单模板

    # 安装 pip insatll tornado # 主文件 web_server.py #!/usr/bin/env python # encoding: utf-8 import tornado. ...

  4. 模拟下载的进度条ProgressBar

    作者:堕落的天使 图片效果 activity_main.xml(代码) <RelativeLayout xmlns:android="http://schemas.android.co ...

  5. BdAsyncTask学习

    综述 是什么 BdAsyncTask是仿照系统的AsyncTask重写的异步处理任务.用法和系统原生的AsyncTask一样,复写doInBackground.onPreExecute.onPostE ...

  6. SpringMVC 自动封装枚举类的方法

    springmvc默认无法自动封装枚举类,解决方法如下: 1.枚举类 public enum GoodsPromoteEnum { /** * 0 精品 */ fine("精品", ...

  7. mac 10.9 安装 gevent

    安装步骤: Gevent依赖libevent和greenlet,需要分别安装. 1,安装 macport (如已安装,可以跳过) 2,通过终端 键入: sudo port install libeve ...

  8. Birt导出Excel图片

    有一段时间没有使用Birt了,最近突然之间发现新版的Birt可以支持导出Excel附带图片.我目前下载的是Birt 4.3版本的,导出图片的也只能在Excel 2007下面能够实现,2003的xls格 ...

  9. 从 A/Looper: Could not create epoll instance. errno=24 错误浅谈解决各种 bug 的思路

    今天代码写着写着就莫名闪退了,手机也没有“程序停止运行”的提示,logcat也没有看到蓝色的调用栈log,这样的闪退最是蛋疼了,还好必现.复现几次之后,终于从logcat中看到了一行可疑的log: A ...

  10. 关于iOS地图定位中点击设置->隐私->定位服务 闪退问题

    iOS8之后,如果应用中用到了地图定位,那么点击设置->隐私->定位服务 再点击该应用有时候会出现闪退问题,其原因是iOS8之后定位中添加了 NSLocationWhenInUseDesc ...