2009-10-23 1 views
5

OpenSSL, ainsi que la plupart des autres implémentations DSA, génère des signatures au format ASN.1. Ainsi, la signature de 40 octets (deux entiers de 20 octets) devient 46 octets en raison des en-têtes de structure ASN.1. (Voir this forum post pour plus de détails.)Comment importer une signature DSA au format ASN.1 à l'aide de BouncyCastle (C#)

Ma question est, comment gère-t-on ce format en C#? (ou ailleurs, pour cette matière)

J'ai passé un certain temps à essayer de traiter à l'aide les packages .NET System.Security.Crypto, mais a abandonné ce (vraiment frustrant, car il a clairement code interne pour analyser ASN.1 puisqu'il peut lire le format DER, mais il n'y a aucun moyen pour vous de l'utiliser - mais je digresse ...)

Ensuite, j'ai commencé à travailler avec la bibliothèque BouncyCastle C#. Je peux l'obtenir dans un Asn1Object, et si je le développer pendant le débogage, je vois qu'il contient un DerSequence avec les deux entiers, mais comment puis-je les retirer (de préférence en BigIntegers pour que je puisse les nourrir à DSA.VerifySignature?)

exemple de code:

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 

Répondre

2

Certains code exemple de vérifier une signature DSA dans BouncyCastle C#:

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

Notez que ce signataire traitera de la ASN.1 et le calcul du condensé de message (je l'ai supposé SHA- 1 a été utilisé ici) pour vous.

Si vous souhaitez toujours savoir comment se produisent les conversions des valeurs {r, s} vers/depuis ASN.1, jetez un coup d'œil dans la source de DsaDigestSigner. En interne, il effectue le codage/décodage ASN.1 approprié, puis utilise la classe DsaSigner pour l'opération sig de bas niveau.

+0

merci! ça a l'air de marcher! –

Questions connexes