2009-10-23 12 views
5

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 

答えて

2

はBouncyCastle C#でDSA署名を検証する方法のいくつかのサンプルコード:この署名はASN.1とダイジェスト(Iを想定しましたメッセージの計算に対処すること

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

注SHA- 1がここで使用されました)。

ASN.1との間で{r、s}値の変換がどのように起こっているかを実際に知りたい場合は、DsaDigestSignerのソースを調べます。内部的には、適切なASN.1エンコーディング/デコードを行い、低レベルのsig操作にDsaSignerクラスを使用します。

+0

ありがとう!それはうまくいくようです! –

関連する問題