and*_*sop 6 .net c# asn.1 digital-signature
如何在C#中验证DSA签名?
鉴于:
我尝试了很多方法,但没有取得任何成功:
OpenSSL.NET:库中的各种奇怪错误; 我在SourceForge上有一个与作者一起运行的开放线程,但还没能解决这个问题.
Microsoft .NET API:无法解压缩DER签名以进行比较.DSA签名是40个字节(两个20字节整数),但是表示为两个整数的DER编码序列,因此总长度可以在46到48个字节之间(有关快速概述,请参阅此文章). NET包含解析ASN.1/DER的代码(因为它可以读取DER格式的证书),它深埋,并且无法访问它,因此您可以从ASN.1/DER编码的sig中正确检索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
Run Code Online (Sandbox Code Playgroud)
结构符合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
Run Code Online (Sandbox Code Playgroud)
编写我自己的DER解析器实际上不是一个选项,错误的空间太大,必须有一种方法来正确地执行此操作.
| 归档时间: |
|
| 查看次数: |
6685 次 |
| 最近记录: |