OpenSSL 以及大多数其他 DSA 实现以 ASN.1 格式输出签名。因此,由于 ASN.1 结构 header ,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
最佳答案
看看这篇 CodeProject 文章:http://www.codeproject.com/KB/security/CryptoInteropSign.aspx
它包含将 DSA 签名转换为 C# 中预期的 P1363 格式的代码。
关于c# - 如何使用 BouncyCaSTLe (C#) 导入 ASN.1 格式的 DSA 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1614784/