【发布时间】:2012-01-17 09:42:13
【问题描述】:
这里有两个哈希生成器:
现在,我的问题是: 为什么在尝试散列 char '€' (0x80) 时散列不同? 我认为这是因为“€”不是普通的 ASCII 字符。 这两个哈希中的哪一个是“正确的”?
我正在尝试使用 C# 计算哈希生成器 1 返回的哈希。 这个散列函数不返回它。
private string GetMD5Hash(string TextToHash)
{
if ((TextToHash == null) || (TextToHash.Length == 0))
{
return string.Empty;
}
MD5 md5 = new MD5CryptoServiceProvider();
byte[] textToHash = Encoding.Default.GetBytes(TextToHash);
byte[] result = md5.ComputeHash(textToHash);
return BitConverter.ToString(result).Replace("-", "").ToLower();
}
我怎样才能改变它,让它返回我想要的哈希值?
附加信息: 我做了一个小 AutoIt 脚本:
#include <Crypt.au3>
ConsoleWrite(StringLower(StringMid(_Crypt_HashData(Chr(128), $CALG_MD5),3)) & @CRLF)
它会返回我想要的哈希值! 但是我需要一个 C# 代码:)
【问题讨论】:
-
所以将“Encoding.Default.GetBytes”更改为“Encoding.UTF8.GetBytes”?
-
我不认为这是错误的,因为 AutoIt 代码获得了正确的哈希值。那么它有什么不同呢??
-
@Alex:没有指定它使用的编码就没有“正确的哈希”这样的东西......哈希应用于二进制数据,而不是字符串 - 所以我们需要知道 binary 数据正在被散列。
-
对于“正确的哈希”,我的意思是我需要的哈希 :) 但是感谢您清除这个!
-
另外两个注意事项:
€不是“不是普通的 ASCII 字符”——而是:它根本不是 ASCII 字符。此外,说它是“0x80”也没有意义——这取决于编码。唯一有用的数字(没有编码)是 unicode 代码点,即 0x20AC