2013-04-12 6 views
2

Стараюсь верифицировать ECDSA (256) подпись, только данные, которые я должен сделать это открытый ключ в данном формате ниже, исходные данные и подпись:InvalidCastException на C# Надувной замок проверить подпись

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

Так, что-то кажется неправильным с подписью, но я не могу понять. Надеюсь, кто-нибудь может помочь с хорошей идеей.

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

+0

Какую версию Bouncy Castle вы используете? –

+0

Привет, это версия C# версии BouncyCastle.Crypto.dll, версия 1.7.4114.6375 – steve

ответ

2

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

АСС подпись, как ожидается, будет 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 октет Строка [71]

Последовательность DER Integer (16446081942964531772961165410855935370418106604815444975891408706004345083361) Integer (87431453076334980518600256741994746667679967157867025465393185500427926877084)

Итак, «внутренние» октеты выглядят правильно закодированными. Сейчас:

bool valid = signer.VerifySignature(inner); 

Для меня это напечатано «false», которое, как вы говорите, ожидается, потому что данные были изменены.

 Смежные вопросы

  • Нет связанных вопросов^_^