2009-10-23 10 views
5

OpenSSL, così come la maggior parte delle altre implementazioni DSA, le firme delle uscite in formato ASN.1. Pertanto, la firma da 40 byte (due interi a 20 byte) diventa 46 byte a causa delle intestazioni di struttura ASN.1. (Vedi this forum post per dettagli.)Come importare la firma DSA in formato ASN.1 utilizzando BouncyCastle (C#)

La mia domanda è, come si gestisce questo formato in C#? (o altrove, se è per questo)

ho trascorso un po 'cercando di trattare con essa utilizzando .NET System.Security.Crypto pacchetti, ma ha dato su quel (davvero frustrante, perché ha chiaramente codice interno per analizzare ASN.1 dal momento che può leggere il formato DER, ma non è possibile utilizzarlo - ma sto divagando ...)

Poi, ho iniziato a lavorare con la libreria BouncyCastle C#. Posso farlo in un Asn1Object, e se io espanderla durante il debug vedo che contiene una DerSequence con i due numeri interi, ma come faccio a tirare fuori (preferibilmente in BigIntegers modo che io possa mangiare a DSA.VerifySignature?)

codice di esempio:

Byte[] msgText = ReadFile("test_msg.txt"); 
Byte[] msgSigRaw = ReadFile("test_sig_1.bin"); // reads binary ASN.1 sig using FileStream 
Asn1Object sigASN = Asn1Object.FromByteArray(msgSigRaw); // parses into Asn1Object 
... 
X509Certificate implCert = ReadCertificate("pubcert_dsa.cer"); // cert in DER format 
DsaSigner DSA = new DsaSigner(); 
DSA.Init(false, implCert.GetPublicKey()); 
... 
BigInteger sigIntR, sigIntS; 
... //TODO: how to get signature from sigASN into sigIntR, sigIntS? 
Boolean validSig = DSA.VerifySignature(msgText, sigIntR, sigIntS); // my goal 

risposta

2

Alcuni codice di esempio di come verificare una firma DSA in BouncyCastle C#:

ISigner sig = SignerUtilities.GetSigner("SHA1withDSA"); 
sig.Init(false, implCert.GetPublicKey()); 
sig.BlockUpdate(msgText, 0, msgText.Length); 
bool valid = sig.VerifySignature(msgSigRaw); 

Si noti che questo firmatario si occuperà del ASN.1 e il calcolo del message digest (ho assunto SHA 1 è stato usato qui) per te.

Se si desidera veramente sapere in che modo avvengono le conversioni dei valori {r, s} su/da ASN.1, consultare l'origine di DsaDigestSigner. Internamente esegue la codifica/decodifica ASN.1 appropriata e quindi utilizza la classe DsaSigner per l'operazione sig di basso livello.

+0

grazie! sembra funzionare! –

Problemi correlati