Параметры открытого ключа для алгоритма 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}
.