2013-04-12 3 views
2

내가 ECDSA를 확인하려고 (256) 서명, 나는 그것이 아래 지정된 형식의 공개 키, 원래의 데이터와 서명입니다 할 수있는 유일한 데이터 :InvalidCastException이 확인 서명

 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

안녕하세요, BouncyCastle.Crypto.dll, 버전 1.7.4114.6375의 C# 버전입니다. – steve

답변

2

이 도움이 너무 늦을 수 있지만, 나중에 독자의 이익을 위해 :

DSA 서명은 두 개의 정수를 포함하는 시퀀스의 ASN.1 인코딩 될 것으로 예상된다. 여기서 문제는 b_signature가 실제로 OCTET STRING이며 옥텟이 올바른 인코딩임을 의미합니다. 따라서 실제 서명 주위에 추가 "외부"배치가 있습니다. (

DER 옥텟 문자열 [71]

DER 순서 정수 (16446081942964531772961165410855935370418106604815444975891408706004345083361) 정수 87431453076334980518600256741994746667679967157867025465393185500427926877084를 : 나를 위해

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

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

이 인쇄 : 당신은 구조를 덤프하여 볼 수 있습니다)

따라서 '내부'옥텟이 올바르게 인코딩 된 것처럼 보입니다. 지금 :

bool valid = signer.VerifySignature(inner); 

제게는 데이터가 수정되었으므로 예상 한대로 '거짓'으로 인쇄됩니다.