问题描述
最近接触一个需求如下:发送的数据用私钥签名,接收方用公钥验证。看到网上很多帖子,很多实现。发现以下疑问:疑问1.两种方式的MD5哈希算法,算出来的byte[]值不一致,其中方式2是md5的hash算法。方式1也应该是md5吧。为什么不一致呢。方式1:publicstringGetHash(stringm_strSource){UTF8Encodingenc=newUTF8Encoding();HashAlgorithmalgorithm=HashAlgorithm.Create("MD5");byte[]bytes=enc.GetBytes(m_strSource);byte[]inArray=algorithm.ComputeHash(bytes);returninArray;}方式2:stringcontent;//要hash的内容stringreturnValue;//hash后的值MD5CryptoServiceProvidermd5_Model=newMD5CryptoServiceProvider();byte[]s=md5_Model.ComputeHash(Encoding.UTF8.GetBytes(content));md5_Model.Clear();//通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得for(inti=0;i<s.Length;i++){//将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符returnValue+=Convert.ToString(s[i],16).PadLeft(2,'0');}疑问2:签名我看网上主要集中在两种实现方式上,方式1和方式2有啥区别呢,方式1:调用RSACryptoServiceProvider实例的signdata方法RSACryptoServiceProvideroRSA3=newRSACryptoServiceProvider();oRSA3.SignData(messagebytes,"MD5");方式2:///<summary>///对MD5加密后的密文进行签名///</summary>///<paramname="p_strKeyPrivate">私钥</param>///<paramname="m_strHashbyteSignature">MD5加密后的密文</param>///<returns></returns>publicstringSignatureFormatter(stringp_strKeyPrivate,stringm_strHashbyteSignature){byte[]rgbHash=Convert.FromBase64String(m_strHashbyteSignature);RSACryptoServiceProviderkey=newRSACryptoServiceProvider();key.FromXmlString(p_strKeyPrivate);RSAPKCS1SignatureFormatterformatter=newRSAPKCS1SignatureFormatter(key);formatter.SetHashAlgorithm("MD5");byte[]inArray=formatter.CreateSignature(rgbHash);returnConvert.ToBase64String(inArray);}