5

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
4

2 に答える 2

4

この CodeProject の記事をご覧ください: http://www.codeproject.com/KB/security/CryptoInteropSign.aspx

これには、DSA 署名を C# で想定される P1363 形式に変換するコードが含まれています。

于 2009-12-02T11:19:21.637 に答える
2

BouncyCastle C# で DSA 署名を検証する方法のサンプル コード:

ISigner sig = SignerUtilities.GetSigner("SHA1withDSA");
sig.Init(false, implCert.GetPublicKey());
sig.BlockUpdate(msgText, 0, msgText.Length);
bool valid = sig.VerifySignature(msgSigRaw);

この署名者は、ASN.1 とメッセージ ダイジェストの計算 (ここでは SHA-1 が使用されたと想定しています) を処理することに注意してください。

{r,s} 値と ASN.1 との間の変換がどのように行われるかを知りたい場合は、DsaDigestSigner のソースを参照してください。内部的には、適切な ASN.1 エンコーディング/デコーディングを実行してから、低レベルの sig 操作に DsaSigner クラスを使用します。

于 2010-02-02T12:45:23.543 に答える