1

今、「Google アプリ内課金」システムからの署名を検証する方法を探しています。PHP で「openssl_pkey_get_public」および「openssl_verify」関数を見つけました (非常に簡単でシンプルです!!) が、C または C++ の例やドキュメントはありません;;;(過去 2 日間かけて検索しました..OTL. ..)

-
公開鍵
- 署名
- Google からデータを購入
C または C++ を使用して検証コードを実装したい

入手方法わかる人いますか?

以下を検索しました.. - http://www.nlnetlabs.nl/downloads/publications/hsm/hsm_node21.html 「openssl EVP」を扱っています..しかし、HSM(ハードウェアセキュリティモジュール)について説明しています

ありがとう!

4

1 に答える 1

1

以下は私が尋ねたことについての答えです.1は成功を意味し、0は失敗を意味します..ありがとう..

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());
}
于 2013-11-05T02:47:11.053 に答える