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

标签 c# .net bouncycastle asn.1

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/

相关文章:

c# - 为什么密封类不允许作为泛型类型参数?

java - 使用 BouncycaSTLe 编码 PKCS7

java - 如何将.der文件中的私钥加载到java私钥对象中

c# - System.Text.Json:如何使用接口(interface)属性反序列化类(.NET 6)

java - 如何使用 bouncycaSTLe 将 X509 证书转换为 PKCS7?

c# - 不能使用 DialogResult

c# - 使用 namespace 获取 XML 节点的最简单方法?

c# - ASP.NET C# GridView 选项卡索引问题

c# - MongoDb.Driver IMongoDatabase.GetCollectionNamesAsync() 异常

C# 显示 Windows 窗体