OpenSSLは、他のほとんどのDSA実装と同様に、ASN.1形式の署名を出力します。したがって、40バイトのシグネチャ(2つの20バイト整数)は、ASN.1構造体ヘッダーのため46バイトになります。 (詳細はthis forum postを参照してください。)BouncyCastle(C#)を使用してASN.1形式でDSA署名をインポートする方法
私の質問は、どのようにC#でこの形式を扱うのですか?(または他の場所で、そのことについては)
それが明確にASN.1を解析するための内部コードを持っているので、私は、本当にイライラする(.NET System.Security.Crypto
パッケージを使用して、それに対処しようとしているときを過ごしたが、それをあきらめましたDERフォーマットを読むことができるので、それを使用する方法はありません。しかし、私は...)
次に、私はBouncyCastle C#ライブラリの作業を開始しました。私はAsn1Object
にそれを得ることができ、私はそれが二つの整数でDerSequence
が含まれていることがわかりますが、どのように私はそれらを抜くんデバッグ中に私はそれを展開すると(私はDSA.VerifySignature
にそれらを供給することができ、好ましくBigIntegers
に?)
コードサンプル:
Byte[] msgText = ReadFile("test_msg.txt");
Byte[] msgSigRaw = ReadFile("test_sig_1.bin"); // reads binary ASN.1 sig using FileStream
Asn1Object sigASN = Asn1Object.FromByteArray(msgSigRaw); // parses into Asn1Object
...
X509Certificate implCert = ReadCertificate("pubcert_dsa.cer"); // cert in DER format
DsaSigner DSA = new DsaSigner();
DSA.Init(false, implCert.GetPublicKey());
...
BigInteger sigIntR, sigIntS;
... //TODO: how to get signature from sigASN into sigIntR, sigIntS?
Boolean validSig = DSA.VerifySignature(msgText, sigIntR, sigIntS); // my goal
ありがとう!それはうまくいくようです! –