据我所知,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吗?
答案 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等)优化签名,但这是另一天的问题。