Próbuję przenieść do systemu Windows strukturę AquaticPrime.CryptoAPI: Używanie CryptVerifySignature do sprawdzania podpisu z openssl za pomocą klucza publicznego
Na Macu używa biblioteki opensll i próbuję zrozumieć, jak przenieść to do Windowsa, gdzie, jak sądzę, muszę używać CryptoAPI.
Potrzebuję głównie kodu do sprawdzania poprawności wygenerowanego podpisu z podanym kluczem publicznym.
Oto jak weryfikacja odbywa się z OpenSSL:
- wejścia: dane licencyjne, klucza publicznego i podpis, zarówno 128 bajtów.
- Skrócona treść SHA1 jest obliczana na podstawie danych licencji.
- Kontekst RSA jest skonfigurowany z danymi klucza publicznego
- Wywoływana jest funkcja RSA_public_decrypt(), biorąc pod uwagę klucz RSA i podpis, który zwraca 20-bajtowy skrót SHA1 - czy to podsumowanie jest równe temu z kroku 2, podpis jest ważny.
Jak to zrobić z CryptoAPI? I dotarłeś tak daleko:
- Uruchom z CryptAcquireContext (CTX, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)
- Korzystanie CryptImportKey z pomocą this oddelegowania, z pubexp = 3 i bitlen = 1024. To wszystko działa, tj. Nie dostaję błędów, a ja spojrzałem na dane binarne, aby sprawdzić, czy pasuje do tego, co pokazuje artykuł MSDN.
- Utwórz wyciąg SHA1 z danych licencji. Pobrałem wynikową wartość mieszania 20 bajtów i widzę, że pasuje do tego, co otrzymuję z openssl na Macu.
W tym momencie, wzywam:
CryptVerifySignature (hashHdl, sig, sigLen, keyHdl, 0, 0)
To nie z kodem błędu ERROR_INVALID_PARAMETER.
Dziwne jest to, że gdy po raz pierwszy przypadkowo zapisałem dwa razy większy klucz publiczny w strukturze PUBLICKEYBLOB, otrzymałem błąd NTE_BAD_SIGNATURE. Może to sugerować, że klucz publiczny, który teraz przekazuję, jest poprawny.
Dlaczego teraz wystąpił błąd ERROR_INVALID_PARAMETER? Zweryfikowałem, że wartość skrótu jest poprawna, a klucz wydaje się również akceptowany. Parametr "sig" jest po prostu wskaźnikiem do 128 bajtów podpisu, a sigLen to 128.
Czego tu mi brakuje?
Pytanie: Dlaczego po prostu nie skorzystasz z wersji OpenSSL z [Windows port] (http://www.slproweb.com/products/Win32OpenSSL.html)?Chodzi mi o to, że nie ma nic złego w korzystaniu z CryptoAPI, ale openSSL już istnieje i oznaczałoby to mniej pracy ... – erloewe
Nie chcę, aby ludzie instalowali nowe składniki systemu tylko po to, aby uruchomić aplikację, która nie wymaga instalatora w inny sposób. –