gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:42:21 25 4
gpt4 key购买 nike

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

给定:

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

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

  • OpenSSL.NET : 图书馆的各种奇怪错误;我有一个 open thread running with the author over on SourceForge但还没能解决这个问题。

  • Microsoft .NET API:无法解压 DER 签名进行比较。 DSA 签名为 40 字节(两个 20 字节的整数),但显示为两个整数的 DER 编码序列,因此总长度范围为 46 到 48 字节(有关快速概述,请参见 this post。)虽然.NET 包含解析 ASN.1/DER 的代码(因为它可以读取 DER 格式的证书),它隐藏得很深,无法访问它以便您可以正确地从 ASN.1/DER 编码中检索 40 个字节签名。这个问题让我想到了下一个选择......

  • BouncyCaSTLe:通过使用 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这解决了我遇到的问题,看起来与您的问题非常相似。

关于c# - 在 C# 中验证使用 BER/DER 编码的 ASN.1 格式的 DSA 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1628305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com