gpt4 book ai didi

c# - C# bouncy caSTLe 上的 InvalidCastException 验证签名

转载 作者:行者123 更新时间:2023-11-30 22:18:40 24 4
gpt4 key购买 nike

我尝试验证 ecdsa (256) 签名,我唯一需要做的数据是下面给定格式的公钥、原始数据和签名:

        string pubKey_ecdsa = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE+noecsW+vdfd8DNo5dsAxU4DOaNt6PGmSCLFo/EvQG4xmVzv464qXvDPIrPN8GtLnubzoa9rtWJD52VlGOpFsA==";

string data_ecdsa = ";\"4399901526945\";\"AAAA-BBBBBBBBB-123456789000\";\"5010112544615\";\"20130802063109143\";";

string signature_ecdsa = @"BEcwRQIgJFwnCvm8lRjlRt+G+f4viJktDYVyOiXUd5BJ0V761eECIQDBTHLjJI7KK3FhczEHjunenYWXylDdW91jbS23EmeznA==";

当我尝试使用 bouncy caSTLe 通过调用来验证签名时:

        //Create the public key from string
AsymmetricKeyParameter pubKey = PublicKeyFactory.CreateKey(Convert.FromBase64String(pubKey_ecdsa));

// create byte array from string
byte[] b_signature = Convert.FromBase64String(signature_ecdsa);

ASCIIEncoding encoder = new ASCIIEncoding();
byte[] inputData = encoder.GetBytes(data_ecdsa);
ISigner signer = SignerUtilities.GetSigner("SHA-256withECDSA");
signer.Init(false, pubKey);
signer.BlockUpdate(inputData, 0, inputData.Length);

bool valid = signer.VerifySignature(b_signature);

我收到一个 InvalidCastException:

Unable to cast object of type 'Org.BouncyCastle.Asn1.DerOctetString'
to type 'Org.BouncyCastle.Asn1.Asn1Sequence'.

在以下行:

bool valid =  signer.VerifySignature(b_signature);

所以,签名似乎有问题,但我想不通。我希望任何人都可以提供一个好主意。

顺便说一下,这个例子中提供的数据被修改了,所以签名将被评估为 false,如果它能工作的话。

最佳答案

这可能来不及提供帮助,但为了后来的读者的利益:

DSA 签名应该是包含两个整数的序列的 ASN.1 编码。这里的问题是 b_signature 实际上是一个 OCTET STRING,其中的八位字节是正确的编码。所以有一个额外的“外部”包裹着真正的签名。您可以通过转储结构看到这一点:

Asn1OctetString outer =(Asn1OctetString)Asn1Object.FromByteArray(b_signature);
byte[] inner = outer.GetOctets();

Console.WriteLine(Asn1Dump.DumpAsString(outer));
Console.WriteLine(Asn1Dump.DumpAsString(Asn1Object.FromByteArray(inner)));

对我来说,这会打印:

DER Octet String[71]

DER Sequence Integer(16446081942964531772961165410855935370418106604815444975891408706004345083361) Integer(87431453076334980518600256741994746667679967157867025465393185500427926877084)

因此,“内部”八位字节看起来已正确编码。现在:

bool valid = signer.VerifySignature(inner);

对我来说,这会打印“false”,您说这是预期的,因为数据已被修改。

关于c# - C# bouncy caSTLe 上的 InvalidCastException 验证签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15966846/

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