发现用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. python(29)强大的zip函数

    zip函数:它是python的内建函数,(与序列有关的内建函数有:sorted().reversed().enumerate().zip()),其中sorted()和zip()返回一个序列(列表)对象 ...

  2. Windows安装Node.Js

    1.下载https://nodejs.org/ 2.安装 3.修改环境变量,添加安装的Node.js的目录(此处似乎可以不用配置) 4.查看npm指令 关于npm介绍“Nodejs自身提供了基本的模块 ...

  3. Hololens开发笔记之Gesture手势识别(Manipulation手势控制物体平移)

    Manipulation gesture:保持点击手势,在3D世界中绝对运动 当你想要全息图像1:1响应用户手部移动时,操纵手势能被用于移动.缩放或旋转全息图像.如此的一个用处是使得用户可以在世界中绘 ...

  4. FreeRTOS知识点

    特点: FreeRTOS任务不容许以任何方式从  任务中 实现函数中返回--绝对不能有return语句,也不能执行到函数末尾.如果任务不再需要,可以显示的删除. 一个任务函数可以用来创建若干个任何-- ...

  5. pl/sql配置连接远程数据库oracle,本地没有安装oracle数据库的情况下

    首先下载instantclient 可以到oracle官网下载,要注册账号,一定要下对应版本的,要不然不成功, 10G,11G版的,我已经传上来了,免费下载:正在上传中,稍等 配置文件tnsnames ...

  6. Study plan for automation test framework

    虽然部门的automation建立起来有两年多,去年项目一直很忙,仅限于应用(e.g 运行脚本测试或者写一些简短的测试脚本),但是一直没有深入研究其组成框架.近期希望抽出时间来做深入学习. 初步计划从 ...

  7. sqlserver 2008 建立订阅发布时 报错 解决方案 “错误 2812” 无法创建存储过程

    11月10日早上  一大早,还在地铁14号线上 ,接到同事给的信息 说我们的XX系统宕机了,本想没什么问题,一般服务器 只要硬件没有问题 重启一下就可以了, 但是事与愿违,偏偏最后检测到服务器磁盘阵列 ...

  8. Unreal Engine 4 一些小技巧或提示

    怎样获取当前地图的名字 在任意Actor类里,GetWorld()->GetName()就可以获得当前地图的名字

  9. PlayerPrefs游戏存档

    本地存储.相当于Flash里面的SharedObject. Android位置:机器自身存储的(非扩展卡)/data/data/appname/shared_prefs/{AppName}.xml,如 ...

  10. U盘快捷方式中毒处理办法

    这是网上某位大神的,对于我这个U盘总中毒的人真的很好用,太开心啦啦 http://blog.csdn.net/jzwong/article/details/51002568