OpenSSL は、他のほとんどの DSA 実装と同様に、署名を ASN.1 形式で出力します。したがって、40 バイトの署名 (2 つの 20 バイト整数) は、ASN.1 構造ヘッダーにより 46 バイトになります。(詳細については、このフォーラムの投稿を参照してください。)
私の質問は、C# でこの形式をどのように処理するのですか? (または他の場所で、そのことについて)
.NET パッケージを使用して対処しようとしばらく時間を費やしましたがSystem.Security.Crypto
、それをあきらめました ( DER 形式を読み取ることができるため、ASN.1 を解析するための内部コードが明らかにあるため、本当にイライラしますが、使用する方法はありませんそれは -- しかし、私は脱線します... )
次に、BouncyCastle C# ライブラリを使い始めました。に入れることができAsn1Object
、デバッグ中に展開するDerSequence
と、2つの整数を含む が含まれていることがわかりますが、それらを引き出すにはどうすればよいですか(できれBigIntegers
ば にフィードできるようにするにはDSA.VerifySignature
?)
コードサンプル:
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