同一个DLL中的MD5函数加密相同的字符串结果不同?

liunu 2007-11-02 05:47:46
MD5函数如下:
public string MD5(string strIn)
{
MD5 MD5 = new MD5CryptoServiceProvider();
byte[] datSource = System.Text.Encoding.Default.GetBytes(strIn);
byte[] tmpByte = MD5.ComputeHash(datSource); //ComputeHash后结果不同。
string byte2String = ConvertByte2String(tmpByte);
return byte2String;
}

2个不同程序,输入相同的字符串,但结果不同。调试时发现ComputeHash后,tmpByte的值不同。
...全文
278 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
liunu 2007-11-07
  • 打赏
  • 举报
回复
To vrhero:
确实是datSource不同,生成的结果28和30位刚好调换过来了。但这2个程序都是在一台机器上运行的,传入的字符串也是一样的,哪些原因会导致不同呢?
谢谢。
vrhero 2007-11-07
  • 打赏
  • 举报
回复
既然是同一个DLL...显然不是MD5.ComputeHash导致的...你而是仔细看看datSource的值到底是不是一致吧...
NewUser2008 2007-11-07
  • 打赏
  • 举报
回复
up
liunu 2007-11-07
  • 打赏
  • 举报
回复
up
liunu 2007-11-06
  • 打赏
  • 举报
回复
To:danjiewu(阿丹)

“MD5是对byte数组加密而不是字符串。”,应该是对字符串转换为字节后再编码吧?

byte[] tmpByte = MD5.ComputeHash(datSource);
产生的不同只可能是ComputeHash导致的,因为datSource的值还是一致的。
这个正是需要你帮忙解释的地方。
vrhero 2007-11-06
  • 打赏
  • 举报
回复
byte[] datSource = System.Text.Encoding.Default.GetBytes(strIn);
-----------------
你做了编码转换...选择了默认ANSI编码...在不同语言的系统上得到的datSource不一定相同...
王集鹄 2007-11-06
  • 打赏
  • 举报
回复
Encoding.Default根当前操作系统有关系
建议改成
Encoding.Unicode
或者
Encoding.GetEncoding("GB2312");
linuxyf 2007-11-06
  • 打赏
  • 举报
回复
可能与你输入的字符串的编码有关,同一个方法,同样的输入不可能得到不同的结果。
danjiewu 2007-11-06
  • 打赏
  • 举报
回复
MD5是对byte数组加密而不是字符串。你得到的byte数组不一样加密结果当然不一样。至于为什么得到的byte数组不一样那就要问你了。
liunu 2007-11-06
  • 打赏
  • 举报
回复
1、
我是在同一操作系统上的。并且是对2个程序同时单步侦错,结果datSource的值 还是一样,但
byte[] tmpByte = MD5.ComputeHash(datSource);
//ComputeHash后tmpByte结果却不同了。因此有一个主程序调用MD5方法后的结果就是错误的,这个很不理解。

2、
System.Text.Encoding.Default.GetBytes(strIn);
用默认的语言的确是会造成编码结果的不同,这个已经在不同平台测试过了。但文本文件是按默认语言编码的,如果进行MD5加密时,可以用UTF8吗?会生产错误吗?

liunu 2007-11-04
  • 打赏
  • 举报
回复
包含MD5方法的一个类,在2个程序调用时,加密相同字符串的结果不同。以前调用一直正常的,而且对类也无修改。
.ComputeHash(datSource)
这个方法不知会受哪些因素的影响?
conannb 2007-11-04
  • 打赏
  • 举报
回复
什么意思?
清风道禅 2007-11-04
  • 打赏
  • 举报
回复
顶``接分
liunu 2007-11-04
  • 打赏
  • 举报
回复
up
上次曾经传过一个易宝、支付宝、财付通、云网等多用MD5加密程序。 易宝是采用hmac的MD5加密,提供的ASP版函数不支持文,使用dll注册那个兼容又不太好。 上次我发布的加密程序也不支持文,且支付宝那个加密函数是错误的。 为此我专门研究了三天的hmac方案,当然了我也只是通过改进代码反复测试而已。 先是调用易宝提供的C++版dll,因为我知道它支持文。我先是把ASP版的密钥key进行unicode处理, 然后用文密钥与dll加密结果竟然一致了。当时一高兴,认为处理文字符肯定是采用unicode的。 结果把密文换成文一试,又不行了。我又想到按普通字符处理,文字符再And &HFF,反复试验还是不行。 浪费了两天,也找到了另一个C++版hmac函数源码,没看到有字符编码处理。最后才想到易宝提供的其它源码。 PHP源码还是比较容易看懂的,原来加密的字符text和密钥key都是先转换为UTF-8编码。 这一点与原先那个dll里就可能不一致,把PHP上传到空间一测试,果然密钥使用文是不一样的。 我也无法知道易宝自己到底使用哪一种方案,先设计一个UTF-8的转码函数吧。 网上找了下,光这些函数都有几十K大小,还是自己设计省事。ASP版的hmac都不支持文,就是没有转码函数。 VB还有StrConv可以转换unicode,ASP却不能用。其实我们常用的ASP版md5加密,与其它程序的也是不兼容文。 原因还是ASP转换unicode十分困难,但是支付宝的接口是有这么个函数的,而且代码很简练,我参考它设计了UTF-8编码函数。(支持多国语言的哦) 经过三天的改进,程序从17K精简到了9K,使hmac兼容文,md5也提供了两个版本,一是ASP简版,二是标准版。 这个标准版是指其它程序都在采用的unicode编码方案,其实ASP简版才是我们最多使用的,但它并不通用。 调用方法:HmacMd5(text,key)-加密内容支持文,但key最好用非文的。 md5(text)-简版,ASP_MD5(text)-标准版 支付宝一定要用ASP_MD5,财付通的加密内容一般没文的,所以两者均可。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧