2011-10-24 46 views
4

当在传统的ASP(VBScript)的使用CAPICOM进行MD5哈希像这样:传统的ASP使用CAPICOM的MD5哈希 - 结果从.NET System.Security.Cryptography不同

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(); 

回答

5

的问题是,你正在使用Encoding.Default编码,这represents 7 bit ASCII characters。同时,“CAPICOM manipulates only Unicode strings while validating and generating digital signatures”。

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

Encoding.Default替换为Encoding.Unicode以使您的.NET实现与CAPICOM兼容。

还有一点需要注意,使用data[i].ToString("X2")来产生大写结果,就像在CAPICOM实现中一样。