2012-02-07 8 views

答えて

2

SignedXml.KeyIfoの署名証明書のPublicKeyプロパティとSignedXml.CheckSignatureReturningKeyの署名キー出力を比較できます。このC#の拡張メソッドは私のために仕事をしていません:

X509Certificate2 signingCertificate = null; 
bool isValid = signedXml.CheckSignatureReturningCertificate(out signingCertificate); 
if(isValid) 
{ 
    // signingCertificate now contains the certificate used to sign 
} 

public static bool CheckSignatureReturningCertificate(this SignedXml signedXml, out X509Certificate2 signingCertificate) 
{ 
    signingCertificate = null; 
    AsymmetricAlgorithm signingKey; 
    bool isValid = signedXml.CheckSignatureReturningKey(out signingKey); 
    if (isValid) 
    { 
     IEnumerable<X509Certificate2> keyInfoCertificates = 
      signedXml.KeyInfo.OfType<KeyInfoX509Data>() 
       .SelectMany(x => x.Certificates.Cast<X509Certificate2>()); 

     signingCertificate = keyInfoCertificates.FirstOrDefault(x => x.PublicKey.Key == signingKey); 
     if (signingCertificate == null) 
     { 
      throw new Exception("Signing certificate not found in KeyInfo."); 
     } 
    } 

    return isValid; 
} 

はこのようにそれを使用します

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

あなたはno good way to do it in .NETがありますので、ByteArrayEqualsを実装する必要があります。

RSAではなくDSAを使用している場合、公開鍵は{p, q, g, y}で構成されています。

関連する問題