我已经阅读了许多相关文章并尝试了编码示例,但是我对RSA_verify的调用仍然失败。这是我的详细信息:
我必须针对由私钥(由单独的应用程序)签名的签名来验证哈希(SHA256),但我所要做的就是为mod,exp和message分配uint8_t数组。我尝试过创建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;
}
我已经为此努力了几天。如果有人可以帮助,将不胜感激。