简体   繁体   中英

Can't set public/private key in OpenSSL

I am trying to set the public and private key to an EVP_PKEY in C++ from a string. However, even after following several examples online, the PKEY always comes out as NULL. Here is the code to reproduce the problem (this is for private keys but the effect is the same for public keys):

#include <openssl/evp.h>
#include <openssl/pem.h>
#include <string>
#include <iostream>

int main()
{
    EVP_PKEY *keypair;
    keypair = NULL;

    std::string privateKey = "-----BEGIN PRIVATE KEY-----MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCuKz6ENUUniXU9CelOgD6oTlmkxPWZoaeBUVXLwlh2aE4As/8RMaIpTsxq9M8UmY7L69GVHo51+wmACrW1ftEa3S5rVLRuOrwFNYGLUlrbji4huD5ipxS0MbxKE+lc/VYLTN26zPI8pl8Qb38eESiLXZ7uNO1XRisKxjixy/J4CMMDdn0UFTjKxXmdQluN67T1JlzGzALRKYFMLF8H+VLqhW6ygFE1OjjJ8zwQuP8t2mRBFLXwH1bwffXX4rUwAb+C9FXHWEn5SJv8aoj/9awEw7cYWa0eeAbl2TfPW+QcbzcITp9L9g/9/8M9rH0wqURCzv+z7P0Wkc2JrdcA6vIDAgMBAAECggEAHjFO8BpP96+jjEZIlJw0wHZ8ocynCs/0Or2/0sfJEBW61/JcGD3zb5fCZhQ0Rczs7TrfJSub5KX1GqZAo8rtMuv+3QpdEPLLn1eMMnu/VmpKYvwOjImMVER+8JSNEtqz7NeRZI2cvJjWyAGcFrlAvxAmugKg1k1Krt53+5JwYRBSWQb+05egOXVoQahBJbLWbWJrUFBjmsCAkF/1MvnJ9h2CAmrJIOWMjzWgs2MyUSzAE0I0vLG/mtlUXUGWA7EFAY6BNGWUaHdd6Cy2GhlCoEEL4gYATdtQK1k5r/5O54gTJq1rISEjicXp/qLiFIEa8feuCFGWfFQnIXlmvRZ/gQKBgQDkA8gdQ5XTBQHdcasIeNjJTgmB1W0cugYmUB01O0Kk0O5sVAh0LtWkIF6Tw5Od3olYRt/UNpegOvYoc+lm3kLS14NPcd5P3Zdl/i9NcWq8QF3uNzT5NfLi2nh8lyH2q41Koc2skRQsIQkZEOgLjP2+n3SsZf0PBOE9rYeO9rkSwwKBgQDDi6CWVOSH4suSGLJeauc/j7/MwMAtM7r5cOegh1tJZrAhiL7DXeWM9iT2VWU+9fiH16Je6+0PuXPmkcj3T/E/fSWQ+6n0YjnvIuyQGxMFXW2Zwssxgv51iD+EO88lFD+2wR6YUHl0wPeSQTUvHM3xUp/uOG0yUvoCijqxFCYvwQKBgCvy7qd1V3ONC4b7WdQQNvjWKc70rEtVL8pCtt6DxZyvCMWojNiYDmXMN26Ty+gp9J8nSg1FWIRx2PCDJwHE5WxuTckKUadjNsNZ8xQiQEh4v6Ii0fsXAvHm2kJpfwpklp9EALi6XgEDfRVvxMo1KtOLOJniLpyufBu/TtmnhJSxAoGAG+CI+UWK+vBTMzXAIAO/iek1X7xO6WLJkgwNiW4ijnlMPMug3ntBYXIp3NBZybsJPlx4cm3R8v7uTf2Ul+VWsEVoGJ44IXXranMhJH4nnQkvuc7yZtGU8y6EV5arNk8Hskcf1HkMh5+G69vN+DR0C6ZK1IxIzPbVW41XRq1nsEECgYBmtbY5dIvRemh4FdsMjdUuQcurvyQpEIwdczWurRXfKCuWtbVvn1arTQ/nL+kUixMjPueBInX90vxP+ptoPAHXOMKuZx+bFNwIQZ+OIBQ1WPUG8nV4o7tRZOkIPSy8YVz8UFQuuA6WF5W2kh3gc3iPrQt5JjspkWPDuC1taQo/pw==-----END PRIVATE KEY-----";

    BIO *bio = BIO_new(BIO_s_mem());
    if(BIO_write(bio, (unsigned char*)privateKey.c_str(), (size_t)privateKey.size()) != (int)privateKey.size())
    {
        BIO_free_all(bio);
        return 0;
    }

    PEM_read_bio_PrivateKey(bio, &keypair, NULL, NULL);

    BIO_free_all(bio);

    if(keypair == NULL)
    {
        std::cout << "error";
    }
    else
    {
        return 0;
    }
}

What am I doing wrong?

The private key you're passing is invalid; it's missing newlines. There needs to be one right after the -----BEGIN PRIVATE KEY----- header, another one before the corresponding footer, and one after every 64 characters in the body, eg

std::string privateKey = "-----BEGIN RSA PRIVATE KEY-----\n"
    "MIIEogIBAAKCAQEAris+hDVFJ4l1PQnpToA+qE5ZpMT1maGngVFVy8JYdmhOALP/\n"
    "ETGiKU7MavTPFJmOy+vRlR6OdfsJgAq1tX7RGt0ua1S0bjq8BTWBi1Ja244uIbg+\n"
    /* ... */
    "5y/pFIsTIz7ngSJ1/dL8T/qbaDwB1zjCrmcfmxTcCEGfjiAUNVj1BvJ1eKO7UWTp\n"
    "CD0svGFc/FBULrgOlheVtpId4HN4j60LeSY7KZFjw7gtbWkKP6c=\n"
    "-----END RSA PRIVATE KEY-----";

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM