0

XML メッセージのデジタル署名に問題があります。要件では、ECDSA 証明書を特定の曲線で使用することが規定されています。メソッドによって提供される RSA および DSA 機能は、 、およびSignedXml.ComputeSignature(...)のカスタム実装を作成しないと機能しないことを意味します。SignatureDescriptionAsymmetricSignatureFormatterAsymmetricSignatureDeformatter

そうは言っても、多くのコードを投稿することなく、証明書を取得し、その公開鍵を使用してECDsaCngクラスを使用してデータに署名する単純な関数を作成しました。これは、上記のカスタム実装を作成するために使用したものです。

何が起こるかというと、私のカスタム実装でも例外がスローされSystem.Security.Cryptography.CryptographicException: Key does not exist.ます。ただしCngKey、インポートする代わりに作成するだけでも機能します。私が見ることができることから、この例外は、メソッドを呼び出しているコードからスローされていますinternal static extern ErrorCode NCryptSignHash(...)ncrypt.dll

だから私の質問は、例外がスローされる理由System.Security.Cryptography.CryptographicException: Key does not exist.と、それを解決する方法です。

[TestMethod]
public void CreateSignatureTest()
{
  var request = "Some xml goes here...";

  var store = new X509Store(StoreLocation.LocalMachine);
  store.Open(OpenFlags.ReadOnly);
  var certificates = store.Certificates;

  var applicableCertificate = certificates.Cast<X509Certificate2>()
     .FirstOrDefault(certificate => certificate.Subject.Contains("ECDSA_CERT_NAME"));

  var encryptingKey = (ECDsaCng)applicableCertificate.GetECDsaPublicKey();

  var exported = encryptingKey.Key.Export(CngKeyBlobFormat.EccPublicBlob);
  var creationParameters = new CngKeyCreationParameters
  {
    ExportPolicy = CngExportPolicies.AllowPlaintextExport
  };

  using (CngKey objCngKey = CngKey.Import(exported, CngKeyBlobFormat.EccPublicBlob)) // This will throw a Key Does Not Exist Exception
  //using (CngKey objCngKey = CngKey.Create(CngAlgorithm.ECDsaP256, null, creationParameters)) // This works...
  {
    //'Convert String to be signed to a byte array
    var data = Encoding.Default.GetBytes(request);

    //'Create a ECDsaCng Object
    var ecdsa = new ECDsaCng(objCngKey);

    //'Sign the string
    var bSignature = ecdsa.SignData(data);

    //'Convert Signature to Base64 string for better reading
    var sSignature = Convert.ToBase64String(bSignature);
    }
}
4

1 に答える 1

2

公開鍵を取得しました。次に、それを新しいコンテナーにインポートし、Sign と呼びます。署名には秘密鍵が必要であるため、秘密鍵フィールドが存在しないという例外がスローされました。

とにかくオブジェクトを複製するのはなぜですか?cert.GetECDsaPrivateKey()そのオブジェクトを呼び出して使用するだけです。

于 2016-08-17T14:12:03.047 に答える