使用MD5-SHA1哈希算法进行RSA签名

时间:2013-10-16 15:30:39

标签: c# ssl rsa md5 sha1

据我所知,TLS 1.1要求使用两个哈希算法(MD5和SHA1)的串联将CertificateVerify消息的内容作为数字签名值。这可以在.NET中使用RSACryptoServiceProvider吗?

这不起作用:

using (var rsa = new RSACryptoServiceProvider())
{
    rsa.ImportParameters(...);
    rsa.SignData(data, new MD5SHA1());
}

这也不起作用:

using (var rsa = new RSACryptoServiceProvider())
{
    rsa.ImportParameters(...);
    rsa.SignHash(new MD5SHA1().ComputeHash(data), "MD5SHA1");
}

(MD5SHA1是HashAlgorithm的一个实现。)

可能这不起作用,因为签名嵌入了哈希算法的OID,并且MD5-SHA1没有有效的OID。这在.NET中可行吗?我误解了TLS 1.1吗?

1 个答案:

答案 0 :(得分:1)

如果它帮助其他人,我使用BigInteger类来完成这项工作。在TLS 1.1中所谓的“签名”实际上只是私钥加密,可以使用BigInteger数学来完成。

登录

var hash = new MD5SHA1().ComputeHash(data);
var input = new BigInteger(hash);
return input.ModPow(new BigInteger(privateExponent),
                    new BigInteger(modulus)).GetBytes();

验证

var hash = new MD5SHA1().ComputeHash(data);
var input = new BigInteger(signature);
var output = input.ModPow(new BigInteger(publicExponent),
                          new BigInteger(modulus)).GetBytes();
var rehash = SubArray(output, output.Length - 36);
return SequencesAreEqual(hash, rehash);

注意您仍需要自己添加填充到输出中。 (0x0001FFFFFF ... FF00 {数据})

可以使用CRT参数(p,q等)优化签名,但这是另一天的问题。