Android 如何将openssl_pkey_get_public和openssl_verify转换为C

Android 如何将openssl_pkey_get_public和openssl_verify转换为C,android,openssl,ssl-certificate,in-app-billing,Android,Openssl,Ssl Certificate,In App Billing,现在我正在寻找一种方法来验证“谷歌inapp账单”系统的签名。 我在PHP中找到了OpenSSLIKPKYGETGIGHORD和OpenSSLIVE验证函数(非常简单和简单!!),但是没有C或C++的例子或文档;(我花了最后两天的时间来搜索……OTL…) 现在我有: -公钥 -签名 -从谷歌购买数据 我想用C或C实现验证代码++ 有人知道我怎样才能得到它吗 我在下面搜索过。。 - 它涉及“openssl EVP”…但它讲述了HSM(硬件安全模块) 谢谢 下面是关于我所问问题的答案。。 1表示成

现在我正在寻找一种方法来验证“谷歌inapp账单”系统的签名。 我在PHP中找到了OpenSSLIKPKYGETGIGHORD和OpenSSLIVE验证函数(非常简单和简单!!),但是没有C或C++的例子或文档;(我花了最后两天的时间来搜索……OTL…)

现在我有:
-公钥
-签名
-从谷歌购买数据
我想用C或C实现验证代码++

有人知道我怎样才能得到它吗

我在下面搜索过。。 - 它涉及“openssl EVP”…但它讲述了HSM(硬件安全模块)


谢谢

下面是关于我所问问题的答案。。 1表示成功,0表示失败。。 谢谢

int验证Google应用账单签名(常量字符*数据、常量字符*签名、常量字符*发布密钥\u id)
{
std::shared_ptr mdctx=std::shared_ptr(EVP_MD_CTX_create(),EVP_MD_CTX_destroy);
const EVP_MD*MD=EVP_get_digestbyname(“SHA1”);
if(NULL==md)
{
返回-1;
}
if(0==EVP_VerifyInit_ex(mdctx.get(),md,NULL))
{
返回-1;
}
如果(0==EVP_VerifyUpdate(mdctx.get(),(void*)数据,strlen(数据)))
{
返回-1;
}
std::shared_ptr b64=std::shared_ptr(BIO_new(BIO_f_base64()),BIO_free);
BIO_set_标志(b64.get(),BIO_标志\u BASE64\u NO\u NL);
std::shared_ptr bPubKey=std::shared_ptr(BIO_new(BIO_s_mem()),BIO_free);
BIO_put(bPubKey.get(),pub_key_id);
BIO_push(b64.get(),bPubKey.get());
std::shared_ptr pubkey=std::shared_ptr(d2i_pubkey_bio(b64.get(),NULL),EVP_PKEY_free);
std::string decoded_signature=base64解码(std::string(signature));
返回EVP_VerifyFinal(mdctx.get(),(unsigned char*)decoded_signature.c_str(),decoded_signature.length(),pubkey.get());
}

下面是关于我所问问题的答案。。 1表示成功,0表示失败。。 谢谢

int验证Google应用账单签名(常量字符*数据、常量字符*签名、常量字符*发布密钥\u id)
{
std::shared_ptr mdctx=std::shared_ptr(EVP_MD_CTX_create(),EVP_MD_CTX_destroy);
const EVP_MD*MD=EVP_get_digestbyname(“SHA1”);
if(NULL==md)
{
返回-1;
}
if(0==EVP_VerifyInit_ex(mdctx.get(),md,NULL))
{
返回-1;
}
如果(0==EVP_VerifyUpdate(mdctx.get(),(void*)数据,strlen(数据)))
{
返回-1;
}
std::shared_ptr b64=std::shared_ptr(BIO_new(BIO_f_base64()),BIO_free);
BIO_set_标志(b64.get(),BIO_标志\u BASE64\u NO\u NL);
std::shared_ptr bPubKey=std::shared_ptr(BIO_new(BIO_s_mem()),BIO_free);
BIO_put(bPubKey.get(),pub_key_id);
BIO_push(b64.get(),bPubKey.get());
std::shared_ptr pubkey=std::shared_ptr(d2i_pubkey_bio(b64.get(),NULL),EVP_PKEY_free);
std::string decoded_signature=base64解码(std::string(signature));
返回EVP_VerifyFinal(mdctx.get(),(unsigned char*)decoded_signature.c_str(),decoded_signature.length(),pubkey.get());
}

您可以使用openSSL库。在它的文档中有一个例子-谢谢你的回答!下面是一些不知道如何在示例中分配“EVP_PKEY”的人的其他链接。您可以使用openSSL库来实现它。在它的文档中有一个例子-谢谢你的回答!下面是一些不知道如何在示例中分配“EVP_PKEY”的人的其他链接。
int Verify_GoogleInappBilling_Signature(const char* data, const char* signature, const char* pub_key_id)
{
    std::shared_ptr<EVP_MD_CTX> mdctx = std::shared_ptr<EVP_MD_CTX>(EVP_MD_CTX_create(), EVP_MD_CTX_destroy);
    const EVP_MD* md = EVP_get_digestbyname("SHA1");
    if(NULL == md)
    {
        return -1;
    }
    if(0 == EVP_VerifyInit_ex(mdctx.get(), md, NULL))
    {
        return -1;
    }

    if(0 == EVP_VerifyUpdate(mdctx.get(), (void*)data, strlen(data)))
    {
        return -1;
    }

    std::shared_ptr<BIO> b64 = std::shared_ptr<BIO>(BIO_new(BIO_f_base64()), BIO_free);
    BIO_set_flags(b64.get(),BIO_FLAGS_BASE64_NO_NL);

    std::shared_ptr<BIO> bPubKey = std::shared_ptr<BIO>(BIO_new(BIO_s_mem()), BIO_free);
    BIO_puts(bPubKey.get(),pub_key_id);
    BIO_push(b64.get(), bPubKey.get());

    std::shared_ptr<EVP_PKEY> pubkey = std::shared_ptr<EVP_PKEY>(d2i_PUBKEY_bio(b64.get(), NULL), EVP_PKEY_free);

    std::string decoded_signature = Base64Decode(std::string(signature));
    return EVP_VerifyFinal(mdctx.get(), (unsigned char*)decoded_signature.c_str(), decoded_signature.length(), pubkey.get());
}