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
merci! ça a l'air de marcher! –