2009-10-23 8 views
5

OpenSSL, a także większość innych implementacji DSA, generuje sygnatury w formacie ASN.1. Tak więc 40-bajtowy podpis (dwie 20-bajtowe liczby całkowite) staje się 46 bajtów ze względu na nagłówki struktury ASN.1. (Aby uzyskać szczegółowe informacje, patrz: this forum post).Jak zaimportować podpis DSA w formacie ASN.1 przy użyciu BouncyCastle (C#)

Moje pytanie brzmi, w jaki sposób obsługuje się ten format w języku C#? (lub gdzie indziej, dla tej sprawy)

spędziłem starając się radzić sobie z nim przy użyciu .NET System.Security.Crypto pakietów, ale zrezygnował z tego (naprawdę frustrujące, ponieważ wyraźnie ma kod wewnętrzny do analizowania ASN.1 ponieważ może czytać format DER, ale nie ma sposobu, aby go użyć - ale dygresja ...)

Następnie zacząłem pracować z biblioteką BouncyCastle C#. Mogę go do Asn1Object i gdybym go rozwinąć podczas debugowania widzę, że zawiera on DerSequence z dwóch liczb całkowitych, ale jak mogę wyciągnąć je (najlepiej w BigIntegers więc mogę karmić je do DSA.VerifySignature?)

przykładowy kod:

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 

Odpowiedz

2

Niektóre przykładowy kod, w jaki sposób zweryfikować DSA podpisu w BouncyCastle C#:

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

pamiętać, że ta osoba podpisująca zajmie się ASN.1 i obliczenia Message Digest (mam założyć SHA 1 został tu użyty) dla ciebie.

Jeśli nadal chcesz wiedzieć, jak przebiegają konwersje wartości {r, s} do/z ASN.1, to spójrz na źródło dla DsaDigestSigner. Wewnętrznie wykonuje odpowiednie kodowanie/dekodowanie ASN.1, a następnie stosuje klasę DsaSigner dla operacji niskiego poziomu sig.

+0

dzięki! to wydaje się działać! –