C ++ OpenSSL aes-128-cbc pem - PullRequest
       12

C ++ OpenSSL aes-128-cbc pem

0 голосов
/ 05 мая 2018

Мне нужно зашифровать закрытый ключ (длина 118 байт) aes-128-cbc и записать в формате PEM с библиотекой OpenSSL. Похоже, я почти закончил с этим. Общая длина зашифрованного закрытого ключа слишком мала и выглядит следующим образом:

nTrb9AN15PVFbZfqPdwKAQ

Весь PEM вывод выглядит так:

"-----BEGIN EC PRIVATE KEY-----\nProc-Type: 4,ENCRYPTED\nDEK-Info: AES-128-CBC,643CAFB443D381CC08BA709550DDCD38\n\nnTrb9AN15PVFbZfqPdwKAQ==\n-----END EC PRIVATE KEY-----\n\xad"

Основная часть - зашифрованный закрытый ключ (nTrb9AN15PVFbZfqPdwKAQ) должен быть длиннее, что-то вроде этого:

bqYK4AY8zxun9IkYIevsC6ix/1KO6LNTpWZZEoLMK2FiaESKY6nTfBZTP5Xbw6yJ
tljlBqRXaoRA0QdlE2DyeX/Hs/tiAzcgwogV1qlGqlPu3KsSSjNmtpfAiNyKXLGI
+2xxUrAHT9a5bulabtTMI1avVP/bNUqjrJwssY2FVW8=

Я генерирую pem с кодом C ++.

//generate key from private first
   void () {
     EC_KEY* key = EC_KEY_new_by_curve_name(NID_secp256k1);
        //set flag
        EC_KEY_set_asn1_flag(key, OPENSSL_EC_NAMED_CURVE);

        //generate key
        generateECKeyFromPrivate(key, sourceData, sourceSize);

        //define cipher
        const EVP_CIPHER* evpCipher = EVP_aes_128_cbc();
        //bio
        BIO *bufferB = BIO_new(BIO_s_mem());
        char *pemholder = static_cast<char*>(calloc(600, sizeof(char)));
        BUF_MEM *buf = BUF_MEM_new();

        PEM_write_bio_ECPrivateKey(bufferB, key, evpCipher, NULL, 0, NULL, userPassword);

        BIO_get_mem_ptr(bufferB, &buf);
        memcpy(pemholder, buf->data, 600);
}
    bool generateECKeyFromPrivate(EC_KEY *key, const unsigned char *privBytes, int priveBytesLength) {
        //private bignum part
        BIGNUM *privPart = BN_new();
        BN_bin2bn(privBytes, priveBytesLength, privPart);
        bool success = false;

        BN_CTX *ctx = NULL;
        EC_POINT *pub_key = NULL;
        const EC_GROUP *group = EC_KEY_get0_group(key);

        if ((ctx = BN_CTX_new())) {
            if ((pub_key = EC_POINT_new(group))) {
                if (EC_POINT_mul(group, pub_key, privPart, NULL, NULL, ctx)) {
                    if (EC_KEY_set_private_key(key, privPart)) {
                        if (EC_KEY_set_public_key(key, pub_key)) {
                            success = true;
                        }
                    }
                }
            }
        }

        if (pub_key) EC_POINT_free(pub_key);
        if (ctx) BN_CTX_free(ctx);
        return success;
    }

Не могу понять, как это исправить.

...