如何在uint8_t数组中正确验证openSSL 1.1.0(仅是公共模数和指数)中的签名

时间:2018-11-06 08:21:37

标签: c++ openssl rsa

我已经阅读了许多相关文章并尝试了编码示例,但是我对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;
}

我已经为此努力了几天。如果有人可以帮助,将不胜感激。

0 个答案:

没有答案