InvalidCastException в c # bouncy castle проверить подпись

Я пытаюсь проверить подпись ecdsa (256), единственные данные, которые мне нужно сделать, это открытый ключ в указанном ниже формате, исходные данные и подпись:

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

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

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

Когда я пытаюсь использовать надувной замок, чтобы проверить подпись, позвонив:

        //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);

Итак, с подписью что-то не так, но я не могу понять. Я надеюсь, что кто-нибудь может помочь с хорошей идеей.

Кстати, предоставленные данные в этом примере были изменены, поэтому подпись будет оценена как ложная, если она будет работать.


person steve    schedule 12.04.2013    source источник
comment
Какую версию Bouncy Castle вы используете?   -  person John Willemse    schedule 12.04.2013
comment
Привет, это C # версия BouncyCastle.Crypto.dll, версия 1.7.4114.6375   -  person steve    schedule 12.04.2013


Ответы (1)


Возможно, уже слишком поздно, чтобы помочь, но для пользы более поздних читателей:

Ожидается, что подпись DSA будет кодировкой ASN.1 последовательности SEQUENCE, содержащей два INTEGER. Проблема здесь в том, что b_signature на самом деле является строкой октетов, а октеты внутри нее являются правильной кодировкой. Таким образом, настоящая подпись имеет дополнительную «внешнюю» оболочку. Вы можете увидеть это, выгрузив структуру:

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

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

Для меня это печатает:

Октетная строка DER [71]

Последовательность DER Целое число (16446081942964531772961165410855935370418106604815444975891408706004345083361) Целое число (8743145307633498051860025674199474666767996715786702546539318557000427)

Таким образом, «внутренние» октеты выглядят правильно закодированными. Теперь:

bool valid = signer.VerifySignature(inner);

Для меня это печатает false, что, по вашему мнению, ожидается, потому что данные были изменены.

person Peter Dettman    schedule 24.06.2013