【问题标题】:RSA Signing using MD5-SHA1 Hash Algorithm使用 MD5-SHA1 哈希算法进行 RSA 签名
【发布时间】:2013-10-16 15:30:38
【问题描述】:

据我所知,TLS 1.1 要求 CertificateVerify 消息的内容是使用两种哈希算法(MD5 和 SHA1)连接的数字签名值。这可以在 .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?

【问题讨论】:

    标签: c# ssl rsa md5 sha1


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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2011-08-16
    • 2010-12-08
    • 2011-11-25
    • 2012-12-02
    相关资源
    最近更新 更多