【发布时间】:2009-10-23 17:12:46
【问题描述】:
OpenSSL 以及大多数其他 DSA 实现以 ASN.1 格式输出签名。因此,由于 ASN.1 结构标头,40 字节签名(两个 20 字节整数)变为 46 字节。 (详情请参阅this forum post。)
我的问题是,如何在 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
【问题讨论】:
标签: c# .net bouncycastle asn.1