C# 使用MD5-SHA1哈希算法的RSA签名

C# 使用MD5-SHA1哈希算法的RSA签名,c#,ssl,rsa,md5,sha1,C#,Ssl,Rsa,Md5,Sha1,据我所知,TLS1.1要求CertificateVerify消息的内容是使用两个哈希算法(MD5和SHA1)串联的数字签名值。在.NET中使用RSACryptServiceProvider可以这样做吗 这不起作用: using (var rsa = new RSACryptoServiceProvider()) { rsa.ImportParameters(...); rsa.SignData(data, new MD5SHA1()); } using (var rsa = n

据我所知,TLS1.1要求CertificateVerify消息的内容是使用两个哈希算法(MD5和SHA1)串联的数字签名值。在.NET中使用RSACryptServiceProvider可以这样做吗

这不起作用:

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");
}
这也不起作用:

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是哈希算法的一个实现。)


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

为了防止它对其他人有帮助,我使用了BigInteger类来实现这一点。TLS1.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{data})

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

另请参见Bernstein的。它提供了类似RSA的签名方案的历史。