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

3

据我所知,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个回答

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();

Verify

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

还可以参考Bernstein的《RSA签名和Rabin-Williams签名:现状》。该文提供了RSA类签名方案的历史。 - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接