积极答复者
使用 DSACryptoServiceProvider 计算哈希值的签名问题?

问题
-
static public Byte[] SignDataToByteArray(Byte[] dataToSign, DSAParameters keyInfo) { try { DSACryptoServiceProvider dSA = new DSACryptoServiceProvider(); dSA.ImportParameters(keyInfo); return dSA.SignData(dataToSign); } catch { return null; } } static public Byte[] SignHashToByteArray(Byte[] hashToSign, DSAParameters keyInfo, String hashAlgorithm = "SHA1") { try { DSACryptoServiceProvider dSA = new DSACryptoServiceProvider(); dSA.ImportParameters(keyInfo); DSASignatureFormatter dSAFormatter = new DSASignatureFormatter(dSA); dSAFormatter.SetHashAlgorithm(hashAlgorithm); return dSAFormatter.CreateSignature(hashToSign); } catch { return null; } } static public String ToHexaDecimal(Byte[] source, String separator = "", Boolean ignoreException = true, String defaultValue = null) { Byte[] bytes = (Byte[])source; var hexResult = new StringBuilder(bytes.Length); for (Int32 i = 0; i < bytes.Length; i++) { hexResult.Append(bytes[i].ToString("X2") + separator); // Convert to hexadecimal } return hexResult.ToString(); } [TestMethod()] public void DSAComputeHashToByteArrayTest() { Byte[] data = { 1, 2, 3 }; // 原始数据 // 计算 data 的哈希值 Byte[] hash; using (var sha1 = SHA1.Create()) { hash = sha1.ComputeHash(data); } DSACryptoServiceProvider dSA = new DSACryptoServiceProvider(); Byte[] signData = SignDataToByteArray(data, dSA.ExportParameters(true)); // 函数内部会使用 SHA1 计算哈希值 Byte[] signHash = SignHashToByteArray(hash, dSA.ExportParameters(true), "SHA1"); ToHexaDecimal(signData).Should().Be.EqualTo(ToHexaDecimal(signHash)); //Result // signData="496D15689B0A5EFF4FCF05691C5C106F694AAD912E178DD786868572698B4..." // signHash="88025D2C2D9F07A68B481EFD1EA7D72DDC350AE1453672AA8CAFAA1EB97EB..." }
使用 DSACryptoServiceProvider.SignData 计算出来的结果与DSASignatureFormatter.CreateSignature的结果竟然不符?请教这是哪里出问题了?
答案
-
同一源数据每次签名的数值都会不同,比如你将 SignDataToByteArray 方法调用两次你将会得到不同的结果,但他们验签都是正确的
知识改变命运,奋斗成就人生!
- 已建议为答案 Mike FengModerator 2013年1月23日 7:47
- 已标记为答案 Mike FengModerator 2013年2月5日 11:04
- 取消答案标记 Mike FengModerator 2013年2月7日 3:40
- 已标记为答案 Mike FengModerator 2013年2月7日 3:40
全部回复
-
同一源数据每次签名的数值都会不同,比如你将 SignDataToByteArray 方法调用两次你将会得到不同的结果,但他们验签都是正确的
知识改变命运,奋斗成就人生!
- 已建议为答案 Mike FengModerator 2013年1月23日 7:47
- 已标记为答案 Mike FengModerator 2013年2月5日 11:04
- 取消答案标记 Mike FengModerator 2013年2月7日 3:40
- 已标记为答案 Mike FengModerator 2013年2月7日 3:40