如何比较.NET中的公钥?

时间:2012-02-07 14:59:20

标签: .net x509 xml-dsig

我有一个包含公钥的X509Certificate2。我有一个RSACryptoServiceProvider(来自调用SignedXml.CheckSignatureReturningKey),也包含一个公钥。

我想知道一个人是否来自另一个人。我如何比较两者?

2 个答案:

答案 0 :(得分:2)

您可以将PublicKey中签名证书的SignedXml.KeyIfo属性与SignedXml.CheckSignatureReturningKey的签名密钥输出进行比较。这个C#扩展方法为我完成了这项工作:

ArrayList<Character> letters;
ArrayList<Integer> rows;
ArrayList<Integer> cols;

像这样使用:

Collections.sort(letters);
for(int i = 0; i < letters.size(); i++)
{
   System.out.println(letters.get(i).getChar() + rows.get(i) + col.get(i)
}

答案 1 :(得分:1)

RSA算法的公钥参数是{e, n},指数和模数。在.NET中,这些可以从RSAParameters结构中获得。其他字段代表私钥。

因此,要比较公共密钥相等的X509Certificate2RSACryptoServiceProvider,您只需获取这些参数:

AsymmetricAlgorithm signingKey;
bool signatureIsVerified = signedXml.CheckSignatureReturningKey(out signingKey);

var certificateParameters =
    ((RSA)certificate.PublicKey.Key).ExportParameters(
        includePrivateParameters: false);
var signingParameters = signingKey.ExportParameters(
        includePrivateParameters: false);
bool areEqual =
    ByteArrayEquals(certificateParameters.Exponent,
                    signingParameters.Exponent)
    && ByteArrayEquals(certificateParameters.Modulus,
                    signingParameters.Modulus);

您必须实施ByteArrayEquals,因为no good way to do it in .NET

如果您使用的是DSA而不是RSA,则公钥由{p, q, g, y}组成。