Я прочитал многие из связанных статей и попробовал примеры кодирования, но мой вызов RSA_verify все еще терпит неудачу. Вот мои данные:
Я должен проверить хеш (SHA256) на соответствие подписи, подписанной закрытым ключом (отдельным приложением), но все, что мне нужно, - это массивы uint8_t для mod, exp и message. Я попытался создать структуру RSA и затем передать ее в функцию RSA_verfiy (вместе с подписью), но все время получаю следующую ошибку:
5040: ошибка: 0306E06C: подпрограммы bignum: BN_mod_inverse: нет инверсии:. \ Crypto \ bn \ bn_gcd.c: 492:
Вот код моего кода:
bool RSAVerifySig(uint8_t *hash, uint32_t hashSize,
uint8_t *sig, uint32_t sigSize,
uint8_t *mod, uint32_t modSize,
uint8_t *exp, uint32_t expSize)
{
RSA *rsa = RSA_new();
BIGNUM *bnN = BN_new();
BIGNUM *bnE = BN_new();
if (!BN_bin2bn(exp, expSize, bnE))
{
cout << "BN_bin2bn bnE failed : " << ERR_error_string(ERR_get_error(), NULL) << endl;
return false;
}
if (!BN_bin2bn(mod, modSize, bnN))
{
cout << "BN_bin2bn bnN failed : " << ERR_error_string(ERR_get_error(), NULL) << endl;
return false;
}
if (!RSA_set0_key(rsa, bnN, bnE, NULL))
{
cout << "RSA_set0_key public failed : " << ERR_error_string(ERR_get_error(), NULL) << endl;
return false;
}
bool result;
if (RSA_verify(NID_sha256, hash, SHA256_DIGEST_LENGTH, sig, sigSize, rsa) == 0)
{
cout << "RSA_verify failed : " << ERR_error_string(ERR_get_error(), NULL) << endl;
result = false;
}
else
{
result = true;
}
RSA_free(rsa);
BN_free(bnN);
BN_free(bnE);
return result;
}
int main()
{
uint8_t msg[128] = { 0x05, 0x94, ... };
uint8_t exp[4] = { 0x82, ... };
uint8_t sig[256] = { 0x95, ... };
uint8_t mod[256] = { ... };
uint8_t hash[32]; // some result : { 0x54, 0x78, .. }
//SHA256() => function that generate hash from msg
bool res = RSAVerifySig(hash, sizeof(hash), sig, sizeof(sig), mod, sizeof(mod), exp, sizeof(exp));
return 0;
}
Я бьюсь головой об этом уже несколько дней. Если кто-то может помочь, это будет оценено.