首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenSSL gost引擎问题

OpenSSL gost引擎问题
EN

Stack Overflow用户
提问于 2012-01-11 14:48:36
回答 1查看 1.6K关注 0票数 3

我正在尝试使用OpenSSL 1.0.0d实现ECDH密钥交换GOST34.10-2001。我像这样加载gost引擎:

代码语言:javascript
复制
    ENGINE * e = ENGINE_by_id("gost");

    if(!e)
    {
        e = ENGINE_by_id("dynamic");
        if (!e)
        {
            ENGINE_load_dynamic();
            e = ENGINE_by_id("dynamic");
        }

        if (e && (!ENGINE_ctrl_cmd_string(e, "SO_PATH", "gost", 0) || !ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0)))
            return 1;
    }

    if(!ENGINE_init(e))
        return 1;

    ENGINE_set_default(e, ENGINE_METHOD_ALL);
    OpenSSL_add_all_algorithms();

此时,GOST引擎已加载,并且工作正常(我认为是这样)。我用散列和加密算法做了一些测试。

但是当我尝试实现ECDH (通过导入另一方公钥生成共享密钥)时,我得到了不正确的结果(共享密钥与另一方不同)。

我检查了a,b,p,q,x,y参数,检查了代码流程,但找不到哪里出了问题。

代码语言:javascript
复制
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD94
a6
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD97
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C611070995AD10045841B09B761B893
1
8D91E471E0989CDA27DF505A453F2B7635294F2DDF23E3B122ACC99C9E9F1E14

有一件事:VKO34.10-2001算法是在openssl\engines\ccgost\gost2001_keyx.c (function VKO_compute_key)中实现的,但是当我调用一个泛型函数ECDH_compute_key时,它不会导致VKO_compute_key (通过在VKO_compute_key的开头设置int3来检查这一点)。

我是不是误解了什么?或者,谁能展示一个使用openssl中的gost引擎生成共享密钥的示例?

EN

回答 1

Stack Overflow用户

发布于 2016-02-18 08:09:07

我知道这是一个古老的问题,但对一些人来说,它可能仍然是热门话题。

下面的代码在使用GOST引擎时生成一个共享密钥。

代码语言:javascript
复制
int get_shared_key(
    EVP_PKEY *priv, 
    EVP_PKEY *peer,     
    unsigned char *ukm, 
    int ukm_size, 
    unsigned char *secret, 
    size_t *secret_len)
{
    int result = 0;
    EVP_PKEY_CTX *ctx = NULL;
    int key_size = 0;

    if((ctx = EVP_PKEY_CTX_new(priv, NULL)) == NULL) 
        goto err;
    if(EVP_PKEY_derive_init(ctx) != 1) 
        goto err;
    if(EVP_PKEY_CTX_ctrl(ctx, -1, EVP_PKEY_OP_DERIVE, EVP_PKEY_CTRL_SET_IV, ukm_size, ukm) != 1) 
        goto err;
    if(EVP_PKEY_derive_set_peer(ctx, peer) != 1) 
        goto err;
    key_size=EVP_PKEY_derive(ctx, NULL, secret_len);
    if(key_size != GOST_R_34_12_2015_KEY_SIZE) 
        goto err;
    if(EVP_PKEY_derive(ctx, secret, secret_len) != 1) 
        goto err;

    result = 1;
    goto end;
err:
    ERR_print_errors_fp(stderr);
end:
    if(ctx)
        EVP_PKEY_CTX_free(ctx);
    return result;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8815246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档