验证使用 BER/DER 编码的 ASN.1 格式的 C# 中的 DSA 签名

2024-05-04

如何在 C# 中验证 DSA 签名?

Given:

  • 消息文本,
  • 签名摘要(通常为 ASN.1 DER 格式),
  • 公钥(采用签名的 X.509 证书、PEM 或 DER 格式)

我尝试了多种方法,但都没有成功:

  • OpenSSL.NET http://openssl-net.sourceforge.net/:库中出现各种奇怪的错误;我有一个在 SourceForge 上与作者一起打开线程运行 https://sourceforge.net/projects/openssl-net/forums/forum/552647/topic/3393454/index/page/1但还无法解决这个问题。

  • 微软.NET API:无法解压 DER 签名进行比较。 DSA 签名为 40 字节(两个 20 字节整数),但表示为两个整数的 DER 编码序列,因此总长度范围为 46 到 48 字节(请参阅这个帖子 http://forums.sun.com/thread.jspa?threadID=144622虽然 .NET 包含解析 ASN.1/DER 的代码(因为它可以读取 DER 格式的证书),但它被埋得很深,并且没有办法访问它,以便您可以正确检索来自ASN.1/DER 编码信号。这个问题让我想到了下一个选择......

  • 充气城堡:通过使用Org.BouncyCastle.Asn1函数,我可以解析 ASN.1 签名并将其拉入其组件 R 和 S 整数值中。但是当我将这些传递给签名验证例程时,它失败了并且没有给出任何解释。我不确定我是否做错了什么,因为 C# API 是完全无证,并且 Java 版本几乎没有文档记录(但我找不到示例或 HOWTO 信息。)

我已经为这个问题投入了大约一周的时间。我知道以前肯定有人做过,但我还没有找到任何完整/有效的示例。

我这里有三个 C# 项目,每个项目都已完成 95%,但有一个严重缺陷导致其失败。任何工作示例代码将不胜感激。

编辑:这是我试图验证的签名示例,将其转换为 Base64 和 ASCII 十六进制以使其可发布。这个特定的字节是 47 字节,但正确的解析器仍然必须接受它,请阅读 DER 规范以获取更多信息(如果 MSB 为 1,BER/DER 会添加前导 00 以确认符号)

Base64: MC0CFQCUgq2DEHWzp3O4nOdo38mDu8mStwIUadZmbin7BvXxpeoJh7dhquD2CTM=

ASCII Hex: 302d0215009482ad831075b3a773b89ce768dfc983bbc992b7021469d6666e29fb06f5f1a5ea0987b761aae0f60933

结构符合 DER 规范;它解析如下:

30 2d: sequence, length 45 (may vary from 44 to 46)
 02 15: integer, length 21 (first byte is 00 to confirm sign)
  009482ad831075b3a773b89ce768dfc983bbc992b7
 02 14: integer, length 20 (leading 00 not necessary for this one)
  69d6666e29fb06f5f1a5ea0987b761aae0f60933

编写我自己的 DER 解析器确实不是一个选择,错误的空间太大,并且必须有一种方法可以正确地做到这一点。


看看这个:http://www.codeproject.com/KB/security/CryptoInteropSign.aspx http://www.codeproject.com/KB/security/CryptoInteropSign.aspx这解决了我遇到的问题,看起来与你的问题非常相似。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

验证使用 BER/DER 编码的 ASN.1 格式的 C# 中的 DSA 签名 的相关文章

随机推荐