25

Przejrzałem wiele forów i przykładów, ale żaden mi nie pomógł. Potrzebuję weryfikacji podpisu z dowolnego serwisu internetowego. Mam plik test.crt z kluczem publicznym do weryfikacji.Jak zweryfikować podpis, ładowanie klucza PUBLICZNEGO Z pliku CRT?

static bool Verify(string text, string signature) 
{ 
    X509Certificate2 cert = new X509Certificate2(
     HttpContext.Current.Server.MapPath("test-server.cert")); 
    RSACryptoServiceProvider csp = (RSACryptoServiceProvider) cert.PublicKey.Key; 

    // Hash the data 
    SHA1Managed sha1 = new SHA1Managed(); 
    UnicodeEncoding encoding = new UnicodeEncoding(); 
    byte[] data = encoding.GetBytes(text); 
    byte[] sign = Convert.FromBase64String(signature); 
    byte[] hash = sha1.ComputeHash(data); 

    return csp.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sign); 
} 

Ale wynik jest zawsze fałszywe :(

Mam przykład OpenSSL.

openssl base64 -d -in signature -out signature.bin 
openssl dgst -sha1 -verify test-server.pub -signature signature.bin from_gateway 
+0

Stworzyłem prostą aplikację, która generuje podpis do tekstu i od razu je weryfikuje. Możesz to sprawdzić tutaj: https://dl.dropbox.com/u/1171045/11221877/Program.cs –

+0

Tak więc powyższa metoda jest raczej w porządku. Czy na pewno używasz odpowiednich certyfikatów do podpisywania i weryfikacji? –

+3

Zrobiłem to samo z aplikacją internetową, więc nie jest to sprawa sieciowa. W jaki sposób przekazujesz podpis swojej aplikacji internetowej? –

Odpowiedz

1

Podejrzewam, że korzystanie UnicodeEncoding może być przyczyną niepowodzeń Jak wykazano poniżej bajtów ASCIIEncoding i UnicodeEncoding nie są takie same, ponieważ ASCII jest kodowaniem 8-bitowym, a kodowanie Unicode w systemie Windows ma szerokość 16 bitów. W innym pytaniu: Can not get signature użyłeś ASCIIEncoding, więc zakładając, że sygnatura jest obliczana na bajtach ASCIIEncoding tekstu/napisu, v erify za pomocą UnicodeEncoding oczywiście nie będzie pasować.

string text = "Hello"; 
Console.WriteLine("ASCIIEncoding bytes length: {0}", new ASCIIEncoding().GetBytes(text).Length); 
Console.WriteLine("UnicodeEncoding bytes length: {0}", new UnicodeEncoding().GetBytes(text).Length); 

Wyjścia

ASCIIEncoding bytes length: 5 
UnicodeEncoding bytes length: 10