C# 经典asp使用capicom进行md5哈希-结果不同于.net System.Security.Cryptography

C# 经典asp使用capicom进行md5哈希-结果不同于.net System.Security.Cryptography,c#,hash,asp-classic,md5,C#,Hash,Asp Classic,Md5,在经典ASP(VBScript)中使用CAPICOM执行MD5哈希时,如下所示: With server.CreateObject("CAPICOM.HashedData") .Algorithm = 3 ' CAPICOM_HASH_ALGORITHM_MD5 .Hash "password" md5Pwd = .Value End With 我得到这个结果:B081DBE85E1EC3FFC3D4E7D0227400CD 当我使用

在经典ASP(VBScript)中使用CAPICOM执行MD5哈希时,如下所示:

With server.CreateObject("CAPICOM.HashedData")
    .Algorithm = 3                  ' CAPICOM_HASH_ALGORITHM_MD5
    .Hash "password"

    md5Pwd = .Value
End With
我得到这个结果:
B081DBE85E1EC3FFC3D4E7D0227400CD

当我使用.NET时,我得到以下结果:
5f4dcc3b5aa765d61d8327deb882cf99

为什么MD5字符串不同?我做错了什么

以下是我的C#函数:

MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash( Encoding.Default.GetBytes( val ) );

StringBuilder sBuilder = new StringBuilder();

// Loop through each byte of the hashed data 
// and format each one as a hexadecimal string.
for( int i = 0; i < data.Length; i++ ) {
    sBuilder.Append( data[i].ToString( "x2" ) );
}

// Return the hexadecimal string.
return sBuilder.ToString();
MD5 md5Hasher=MD5.Create();
byte[]data=md5Hasher.ComputeHash(Encoding.Default.GetBytes(val));
StringBuilder sBuilder=新StringBuilder();
//循环遍历散列数据的每个字节
//并将每个字符串格式化为十六进制字符串。
for(int i=0;i
问题在于您使用的是
编码。默认情况下
编码为。同时,“”

因此,
Encoding.Default.GetBytes
处理单字节字符(顺便说一下,会丢失任何非ASCII数据),而CAPICOM.HashedData将它们视为2字节Unicode字符

Encoding.Default
替换为
Encoding.Unicode
,使.NET实现与CAPICOM兼容

还有一个注意事项,使用
data[i].ToString(“X2”)
生成大写结果,正如您在CAPICOM实现中所做的那样