3

据我所知,TLS 1.1 要求 CertificateVerify 消息的内容是使用两个散列算法(MD5 和 SHA1)连接的数字签名值。使用 RSACryptoServiceProvider 在 .NET 中可以做到这一点吗?

这不起作用:

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 吗?

4

1 回答 1

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 等)优化签名,但这是另一天的问题。

于 2013-10-16T22:10:05.507 回答