当前位置: 首页 > 知识库问答 >
问题:

从“Google inapp Billing”提供的公钥initailing EVP_PKEY(在OpenSSL中)

仲孙夕
2023-03-14

在服务器端实现的c或c++中,我缩进验证“谷歌inapp计费签名”

我找到了通过php(在php服务器中的Android应用内计费签名验证)的方法,并建议它可以使用evp_verify...OpenSSL中的函数…但是要使用:

它需要'evp_pkey*pkey'结构的实例作为参数...但是我没有!

我想有办法将'Google InApp Billing signature string(base64 encoded SHA1-with-RAS signature with PKCS#1 padding)‘转换为EVP_PKEY..但我不知道怎么做。

如何将其作为EVP_VerifyFinal函数的参数传递??

int main()
{
    OPENSSL_config(NULL);
    OpenSSL_add_all_digests();
    ERR_load_crypto_strings();

    EVP_MD_CTX* ctx = EVP_MD_CTX_create();
    const EVP_MD* md = EVP_get_digestbyname("SHA1");
    if(0 == EVP_VerifyInit_ex(ctx, md, NULL))
    {
        std::cerr << "init error" << std::endl;
        return 0;
    }

    const char* data = "{\"orderId\":\"12999763169054705758.1310724241212373\",\"packageName\":\"com.company.game.google\",\"productId\":\"game_product_001\",\"purchaseTime\":1358227642000,\"purchaseState\":0,\"developerPayload\":\"12322144\",\"purchaseToken\":\"}";
    if(0 == EVP_VerifyUpdate(ctx, (void*)data, strlen(data)))
    {
        std::cerr << "update error" << std::endl;
        return 0;
    }

    const char* key_context = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh0UDlUA1aYPvfRFq6qUjDVG/fi5EetC6LsjdT/WNmHUAy0muvuOTFfQEzBoELciDfh23VXgwVnb/XsfuvQrCgtnQbuMKsj+sDhofLjeq8TznEMlQcJ//0LsGSM8rRVHw72BYA2mSVKi04k1GIicB9J25c2f+eIwF7lEWJlWqVDlNqOS7GIIjnq3HPhqki3ZRSA9c";

    EVP_PKEY* pub_key = EVP_PKEY_new();
    if(NULL == pub_key)
    {
        std::cerr << "evp_pkey new error" << std::endl;
        return 0;
    }

    // I have to call 'EVP_VerifyFinish' here!! but I don't know how to!!
    ERR_remove_state(0);
    ERR_free_strings();

    return 0;
}

求求你来人帮帮我!!

共有1个答案

温开畅
2023-03-14

未测试的代码,但应该如下所示:

BIO *mem= BIO_new(BIO_s_mem());
BIO_puts(mem, "your data");
RSA *cipher;
PEM_read_bio_RSAPublicKey(mem, &cipher, NULL, NULL);
EVP_PKEY *pkey  = EVP_PKEY_new();
EVP_PKEY_set1_RSA(pkey, cipher);
 类似资料:
  • ssh-keygen和openssl是否可能从同一个私钥生成两个不同的公钥?命令与命令生成的公钥(和之间的内容)不同。

  • 以下命令生成一个包含公钥和私钥的文件: 资料来源:这里 使用OpenSSL,私钥也包含公钥信息,因此公钥不需要单独生成 如何从私钥中提取公钥。pem文件? 谢谢

  • 从这里我指出了自己如何获得公钥,并使用EC_POINT_bn2point,而不是hex2point,根据OpenSSL源代码,它在内部执行BN_hex2bn。 那么,为什么EC_POINT_bn2point返回null呢?我正在认真考虑重新编译OpenSSL,并放一些调试例程来找出它失败的原因。

  • 我需要从一个文件中提取公钥(RSA)。我希望提取密钥并将其存储在文件中,这样我就可以使用它的值来使用js加密加密值。 下面的命令转换至: 然而,它生成的不是带有公钥的文件,而是包含文件内容的文件。 我应该使用什么命令来提取公钥并将其存储在文件中?

  • 我知道可以使用此链接为OpenSSL中的自签名证书生成一个公钥和一个私钥。但是对于给定的公钥,我有没有可能算出对应的私钥呢?我一直在使用1024位的RSA公钥。

  • 我使用我编写的程序生成了一个 PKCS#1 RSA 密钥对。我已经输出公钥作为 ASN.1数据结构的DER编码。 然而,当我试图在OpenSSL 和< code>rsautl命令中使用它时,OpenSSL说 我尝试过DER和PEM格式。 是否有额外的编码和/或数据结构需要我申请才能在OpenSSL中使用? 这是我的命令行: PEM 格式的公钥数据结构