Próbuję napisać kod, aby zweryfikować niektóre podpisy RSA. Podpisy zostały wykonane przy użyciu narzędzia OpenSSL wiersza poleceń, używając równowartość tej linii poleceń:Weryfikacja podpisu RSA OpenSSL: skrót i dopełnienie?
openssl dgst -sha1 -sign private_key_file.pem <binary_data_file> sig
próbuję użyć libtomcrypt
zrobić to zweryfikować:
Oto wzywając podpis funkcji weryfikacyjnej RSA w libtomcrypt
:
int rsa_verify_hash_ex(
const unsigned char *sig, unsigned long siglen, // signature to verify
const unsigned char *hash, unsigned long hashlen, // hash value to check against sig
int padding, // defined constant value, see below
int hash_idx, // identifies which hash algorithm, see below
unsigned long saltlen, // specify salt length, see below
int *stat, // output parameter, returns whether verify succeeded or not
rsa_key *key); // RSA public key to use for verify
funkcja zwraca 0, jeśli działa bez błędu, w przeciwnym razie zwraca kod błędu. Jeśli działa bez błędu, parametr wyjściowy stat
wskazuje, czy podpis został zweryfikowany.
Większość argumentów wydaje się prosta: należy podać podpis do sprawdzenia, wartość mieszania użyć do porównania oraz klucz RSA, który ma zostać użyty do kontroli. hash_idx
wynika z przykładowego kodu dołączonego do libtomcrypt
; jest indeksem do tabeli obsługiwanych algorytmów mieszających, a znajdę poprawną wartość używać z tym fragmencie kodu: hash_idx = find_hash("sha1")
Ale zastanawiam się o wartościach padding
i saltlen
. padding
nie martwi mnie zbyt wiele, ponieważ istnieją tylko dwie możliwe wartości i mogę po prostu wypróbować je oba. Ale co powinienem przekazać dla saltlen
?
Dokumentacja OpenSSL dla funkcji OpenSSL dla weryfikacji RSA nie wyświetla parametru saltlen
. Strona podręcznika dla openssl dgst
(tj. Wynik man dgst
) nie omawia soli.
więc moje pytania:
- Jak mogę określić prawidłową długość sól używać?
- Czy
dgst
poleceń OpenSSL wkładać żadnych dodatkowych rzeczy w danych wejściowych, takich jak:(stdin)=
(I okazało się, że (stdin)=
rzecz wyszukując StackOverflow: Why are the RSA-SHA256 signatures I generate with OpenSSL and Java different?)
libtomcrypt
posiada również funkcję o nazwiepkcs_1_pss_decode()
który jest udokumentowany w celu "odkodowania bloku podpisu kodowanego PSS". Czy jest jakaś szansa, że jest to funkcja, którą muszę wywołać?
Dzięki za pomoc, jaką możesz mi dać.
EDYCJA: dzięki pomocy poniżej, z @ Jonathan Ben-Avraham, udało mi się uzyskać to działa już dziś. Odpowiedzi na moje pytania są następujące:
- Użyj długości 0 dla soli, bez soli.
- Nie, OpenSSL nie wkładać żadnych dodatków takich jak
(stdin)=
- Musiałem zadzwonić
rsa_verify_hash_ex()
, a ja potrzebowałem określićpadding
argumentu jakoLTC_LTC_PKCS_1_V1_5
.
Dziękuję za naprawdę doskonałą odpowiedź. Dałeś mi narzędzia, by przekonać się, że nie ma soli. Mam teraz kod 'libtomcrypt', który skutecznie sprawdza podpis! +1 i odpowiedź zaakceptowana. – steveha
@steveha: Dzięki! Możesz również zobaczyć późniejszy wpis dotyczący '' rsautl'': http://stackoverflow.com/questions/9951559/difference-between-openssl-rsautl-and-dgst –