Библиотека openssl SM2, как сгенерировать пары ключей с указанием c закрытого ключа в шестнадцатеричном значении - PullRequest
0 голосов
/ 18 июня 2020

Сейчас я использую библиотеку шифров SM2 в openssl, генерируя пары ключей private и publi c, но закрытый ключ всегда случайный, например:

Закрытый ключ: 443bd4875656bdc23208f1cf56abb29f711c3f197ce5b92745535e40a * *

Publi c ключ: 044237bb976d99830e48083da5ff497e5a4ceef163e6c69db05fe25914579c802266635b4b83fa29c67c1fbe2a204b5e4f7f2a331eb3afa9f57bedc0127a74574f

Я просто хочу, номер Удельный c шестигранной массив, который будет использоваться в качестве секретного ключа и генерации соответствующих PUBLI c ключ, например

Закрытый ключ: 11223344556677889900aabbccddeeff11223344556677889900aabbccddeeff

как сгенерировать publi c с этой спецификацией c закрытый ключ

код генерировать случайные пары ключей выглядит следующим образом:

int sm2_create_key_pair(SM2_KEY_PAIR *key_pair)
{
        int error_code;
        BN_CTX *ctx = NULL;
        BIGNUM *bn_d = NULL, *bn_x = NULL, *bn_y = NULL;
        const BIGNUM *bn_order;
        EC_GROUP *group = NULL;
        EC_POINT *ec_pt = NULL;
        unsigned char pub_key_x[32], pub_key_y[32];

        error_code = ALLOCATION_MEMORY_FAIL;
        if ( !(ctx = BN_CTX_secure_new()) )
        {
           goto clean_up;
        }
        BN_CTX_start(ctx);
        bn_d = BN_CTX_get(ctx);
        bn_x = BN_CTX_get(ctx);
        bn_y = BN_CTX_get(ctx);
        if ( !(bn_y) )
        {
                goto clean_up;
        }

        if ( !(group = EC_GROUP_new_by_curve_name(NID_sm2)) )
        {
                goto clean_up;
        }
        if ( !(bn_order = EC_GROUP_get0_order(group)) )
        {
                goto clean_up;
        }
        if ( !(ec_pt = EC_POINT_new(group)) )
        {
                goto clean_up;
        }

        error_code = CREATE_SM2_KEY_PAIR_FAIL;
        do
        {
                if ( !(BN_rand_range(bn_d, bn_order)) )
                {
                        goto clean_up;
                }
        } while ( BN_is_zero(bn_d) );

        if ( !(EC_POINT_mul(group, ec_pt, bn_d, NULL, NULL, ctx)) )
        {
                goto clean_up;
        }
        if ( !(EC_POINT_get_affine_coordinates_GFp(group,
                                                   ec_pt,
                                                   bn_x,
                                                   bn_y,
                                                   ctx)) )
        {
                goto clean_up;
        }

        if ( BN_bn2binpad(bn_d,
                          key_pair->pri_key,
                          sizeof(key_pair->pri_key)) != sizeof(key_pair->pri_key) )
        {
                goto clean_up;
        }
        if ( BN_bn2binpad(bn_x,
                          pub_key_x,
                          sizeof(pub_key_x)) != sizeof(pub_key_x) )
        {
                goto clean_up;
        }
        if ( BN_bn2binpad(bn_y,
                          pub_key_y,
                          sizeof(pub_key_y)) != sizeof(pub_key_y) )
        {
                goto clean_up;
        }

        key_pair->pub_key[0] = 0x4;
        memcpy((key_pair->pub_key + 1), pub_key_x, sizeof(pub_key_x));
        memcpy((key_pair->pub_key + 1 + sizeof(pub_key_x)), pub_key_y, sizeof(pub_key_y));
        error_code = 0;

clean_up:
    if (ctx)
        {
                BN_CTX_end(ctx);
                BN_CTX_free(ctx);
        }

        if (group)
        {
                EC_GROUP_free(group);
        }

        if (ec_pt)
        {
                EC_POINT_free(ec_pt);
        }

        return error_code;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...