2013-04-12 60 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); 

那麼,有什麼不對勁帶有簽名,但我想不通。我希望有人能提供一個好主意。

順便說一下,本例中提供的數據已被修改,所以簽名將被評估爲假,如果它能工作的話。

+0

你使用什麼版本的Bouncy城​​堡? –

+0

嗨,它是C#版本的BouncyCastle.Crypto.dll,版本爲1.7.4114.6375 – steve

回答

2

這可能爲時已晚,以幫助,但對於後來的讀者的利益:

一個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八位字符串[71]

DER序列 整數(16446081942964531772961165410855935370418106604815444975891408706004345083361) 整數(87431453076334980518600256741994746667679967157867025465393185500427926877084您可以通過傾出結構看這個)

所以,'內部'八位字節看起來是正確編碼的。現在:

bool valid = signer.VerifySignature(inner); 

對於我來說,這會打印'假',你會說因爲數據已被修改而預期。