简短问题:如何修改单个项目List?(或者更确切地说,struct存储在List?中的成员?)
完整说明:
首先,struct使用以下定义:
public struct itemInfo
{
...(Strings, Chars, boring)...
public String nameStr;
...(you get the idea, nothing fancy)...
public String subNum; //BTW this is the element I'm trying to sort on
}
public struct slotInfo
{
public Char catID;
public String sortName;
public Bitmap mainIcon;
public IList<itemInfo> subItems;
}
public struct catInfo
{
public Char catID;
public String catDesc;
public IList<slotInfo> items;
public int numItems;
}
catInfo[] gAllCats = new catInfo[31]; …Run Code Online (Sandbox Code Playgroud) 如何在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解析器实际上不是一个选项,错误的空间太大,必须有一种方法来正确地执行此操作.
OpenSSL以及大多数其他DSA实现以ASN.1格式输出签名.因此,由于ASN.1结构头,40字节签名(两个20字节整数)变为46字节.(有关详细信息,请参阅此论坛帖子.)
我的问题是,如何在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 …Run Code Online (Sandbox Code Playgroud)