3

私が知る限り、TLS 1.1 では、CertificateVerify メッセージの内容が、2 つのハッシュ アルゴリズム (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

In case it helps anyone else, I used the BigInteger class to make this work. What is called "signing" in TLS 1.1 is really just private-key encryption, which can be done using BigInteger math.

Sign

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

Note that you still have to add padding yourself to the output. (0x0001FFFFFF...FF00{data})

Signing can be optimized using CRT parameters (p, q, etc.), but that's a problem for another day.

于 2013-10-16T22:10:05.507 に答える