2013-10-31 68 views
1

現在我正在尋找一種方法來驗證'Google inapp billing'系統中的簽名。 我在php中找到了'openssl_pkey_get_public'和'openssl_verify'函數(它非常簡單易用!!),但沒有用於C或C++的示例或文檔;;;(我花了兩天的時間搜索它..OTL ...)如何將openssl_pkey_get_public和openssl_verify轉換爲C

現在我有:
- 公鑰
- 簽名
- 購買從谷歌
數據我想實現驗證使用C或C++

代碼是否有別人誰知道如何我能得到它?

我初級講座搜索.. - http://www.nlnetlabs.nl/downloads/publications/hsm/hsm_node21.html 它涉及 'OpenSSL的EVP' ..但它講述了HSM(硬件安全模塊)

的感謝!下面

+0

您可以使用OpenSSL庫吧。在它的文檔中有一個示例 - [示例](https://www.openssl.org/docs/crypto/EVP_PKEY_verify.html#) – SkySurfer

+0

感謝您的回答!下面的 是別人不知道如何在樣本中分配'EVP_PKEY'的其他鏈接。 http://stackoverflow.com/questions/10177916/openssl-how-to-initialize-keys-for-public-key-encryption – kukuta

回答

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()); 
}