Я пытаюсь использовать OpenSSL для проверки подписи, которая была создана с использованием SHA256 с RSA (в частности, реализация Java в Signature.getInstance("SHA256withRSA")
). У меня также есть строки, представляющие шестнадцатеричные формы показателя открытого ключа и модуля. (Например, показатель составляет «010001», что соответствует 65537.) Вот код.Проверка подписи с OpenSSL
int verify(string &plaintext, string &exp, string &mod, string &sig) {
RSA *pub_key = RSA_new();
if (!BN_hex2bn(&pub_key->n, mod.c_str()))
exit(1);
if (!BN_hex2bn(&pub_key->e, exp.c_str()))
exit(1);
int verified = RSA_verify(
NID_sha256,
reinterpret_cast<const unsigned char *>(plaintext.data()),
plaintext.size(),
reinterpret_cast<const unsigned char *>(sig.data()),
sig.size(),
pub_key);
RSA_free(pub_key);
return verified;
}
Я также попытался SHA256-хеширования открытого текста первого и переходя, что RSA_verify (наряду с SHA256_DIGEST_LENGTH
), но это не сработало.
unsigned char hash[SHA256_DIGEST_LENGTH];
SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, plaintext.data(), plaintext.size());
SHA256_Final(hash, &sha256);
// use hash instead of plaintext in call to verify
К сожалению, обе реализации возвращают 0. Могу ли я делать что-то здесь не так, или это кажется вероятным, что один из моих входов не так?