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
dzięki! to wydaje się działać! –