none
使用 DSACryptoServiceProvider 计算哈希值的签名问题? RRS feed

  • 问题

  • 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的结果竟然不符?请教这是哪里出问题了?




    • 已编辑 GuanEr 2013年1月22日 9:22
    • 已移动 垃圾邮件筛选器 2013年1月23日 5:42
    • 已移动 Lisa Zhu 2013年1月23日 5:43 更合适的论坛
    2013年1月22日 9:18

答案

全部回复

  • 同一源数据每次签名的数值都会不同,比如你将 SignDataToByteArray 方法调用两次你将会得到不同的结果,但他们验签都是正确的

    知识改变命运,奋斗成就人生!

    2013年1月23日 2:02
    版主
  • 相同的问题,比如 RSA 使用相同公用多次加密相同值会得到不同的加密结果,但解密结果会是一样的

    知识改变命运,奋斗成就人生!

    2013年1月23日 2:06
    版主
  • 上述代码,如果换成RSACryptoServiceProvider就完全通过,虽然每次的计算结果都不相同,但是

    SignDataToByteArray与SignHashToByteArray计算出来的结果确实相等.不知道是不是DSACryptoServiceProvider使用的哈希算法有问题?


    2013年1月25日 7:38