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
grazie! sembra funzionare! –