如何使用BouncyCastle(C#)导入ASN.1格式的DSA签名

and*_*sop 5 .net c# bouncycastle asn.1

OpenSSL以及大多数其他DSA实现以ASN.1格式输出签名.因此,由于ASN.1结构头,40字节签名(两个20字节整数)变为46字节.(有关详细信息,请参阅此论坛帖子.)

我的问题是,如何在C#中处理这种格式?(或其他地方,就此而言)

我花了一些时间尝试使用.NET System.Security.Crypto软件包处理它,但放弃了(非常令人沮丧,因为它显然有内部代码来解析ASN.1,因为它可以读取DER格式,但是没有办法让你使用它 - 但我离题了...)

然后,我开始使用BouncyCastle C#库.我可以把它变成一个Asn1Object,如果我在调试时展开它,我看到它包含一个DerSequence带有两个整数,但我怎么把它拉出来(最好是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
Run Code Online (Sandbox Code Playgroud)

Lau*_*ble 4

看看这篇 CodeProject 文章:http://www.codeproject.com/KB/security/CryptoInteropSign.aspx

它包含将 DSA 签名转换为 C# 中所需的 P1363 格式的代码。