3

ECDsa アルゴリズムで署名された XML 署名を検証しようとしています。私は XmlDSigEx ライブラリに基づいて作業を行っていますが、これは自分のニーズに合わせて少し変更する必要があります。私の現在の問題は、証明書から公開鍵を取得し、それを CngKey として使用することに関連しています。私が使用した:

// var cert = X509Certificate2 ...
var key = CngKey.Import(cert.GetPublicKey(), CngKeyBlobFormat.EccPublicBlob);

「パラメーターが正しくありません」とスローされます。公開鍵の形式が鍵として渡されると予想される情報が見つかりませんでした。X509Certificate に保存されている公開鍵をCngKeyに渡すにはどうすればよいですか?

ティア、アロイス

PS: BouncyCastle を使用して公開鍵を抽出することを検討しました。BCしてみた

X509Certificate.CertificateStructure.SubjectPublicKeyInfo.GetEncoded()

としても

X509Certificate.CertificateStructure.SubjectPublicKeyInfo.PublicKeyData.GetBytes()

キーを CngKey に渡す。ただし、同じエラーが発生します。

4

1 に答える 1

0

私は同じタイプの問題と戦ってきましたが、C# に BouncyCastle を使用し、キーを CngKey にインポートしようとしました。ECDsaCng は、公開鍵のインポート用に RFC4050 XML 形式をサポートしています。以下のコードを使用して、BouncyCastle を使用して生成されたキーをインポートし、BouncyCastle で生成された ECDsaCng でハッシュを検証することができました。

//Specify which curve we are using   
string theCurveName = "prime256v1";

X509Certificate2 x509cert = null; //get your x509 certificate here...

//BouncyCastle publickey creation from certificate publickey
var namedCurve = X962NamedCurves.GetByName(theCurveName);

ECPublicKeyParameters publickey = new ECPublicKeyParameters("ECDSA",
    namedCurve.Curve.DecodePoint(x509cert.GetPublicKey()), // Q
    X962NamedCurves.GetOid(theCurveName));

//now we have the public key in bouncy castle
//we can create the xml to import to CngKey            
//Prime256v1 = 1.2.840.10045.3.1.7

var xmlImport = @"<ECDSAKeyValue xmlns='http://www.w3.org/2001/04/xmldsig-more#'>
  <DomainParameters>
    <NamedCurve URN='urn:oid:" + X962NamedCurves.GetOid(theCurveName).Id + @"' />
  </DomainParameters>
  <PublicKey>
    <X Value='" + publickey.Q.X.ToBigInteger().ToString() + @"' xsi:type='PrimeFieldElemType' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />
    <Y Value='" + publickey.Q.Y.ToBigInteger().ToString() + @"' xsi:type='PrimeFieldElemType' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' />
  </PublicKey>
</ECDSAKeyValue>";

var eccImporter = new ECDsaCng();
eccImporter.FromXmlString(xmlImport, ECKeyXmlFormat.Rfc4050);


//prep bouncy castle signature to single array
var sig0 = sig[0].ToByteArrayUnsigned();
var sig1 = sig[1].ToByteArrayUnsigned();   
byte[] newSig = new byte[sig0.Length + sig1.Length];
sig0.CopyTo(newSig, 0);
sig1.CopyTo(newSig, sig0.Length);

var isok = eccImporter.VerifyHash(manualhash, newSig);
于 2012-02-23T13:23:53.053 に答える