我有一个包含公钥的X509Certificate2
。我有一个RSACryptoServiceProvider
(来自调用SignedXml.CheckSignatureReturningKey
),也包含一个公钥。
我想知道一个人是否来自另一个人。我如何比较两者?
答案 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
结构中获得。其他字段代表私钥。
因此,要比较公共密钥相等的X509Certificate2
和RSACryptoServiceProvider
,您只需获取这些参数:
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}
组成。