OpenSSL 以及大多数其他 DSA 实现以 ASN.1 格式输出签名。因此,由于 ASN.1 结构标头,40 字节签名(两个 20 字节整数)变为 46 字节。(有关详细信息,请参阅此论坛帖子。)
我的问题是,如何在 C# 中处理这种格式?(或其他地方,就此而言)
我花了一段时间试图使用 .NET 包来处理它System.Security.Crypto
,但放弃了(真的很令人沮丧,因为它显然有解析 ASN.1 的内部代码,因为它可以读取 DER 格式,但是你没有办法使用它——但我离题了……)
然后,我开始使用 BouncyCastle C# 库。我可以把它变成一个Asn1Object
,如果我在调试时展开它,我会看到它包含一个DerSequence
带有两个整数的 a,但是我如何把它们拉出来(最好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