【问题标题】:OpenSSL gost engine issueOpenSSL gost 引擎问题
【发布时间】:2012-02-07 13:42:42
【问题描述】:

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

    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 参数,检查了代码流,但不知道哪里出了问题。

FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD94
a6
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD97
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6C611070995AD10045841B09B761B893
1
8D91E471E0989CDA27DF505A453F2B7635294F2DDF23E3B122ACC99C9E9F1E14

有一件事:VKO 34.10-2001 算法在 openssl\engines\ccgost\gost2001_keyx.c(函数 VKO_compute_key)中实现,但是当我调用通用函数 ECDH_compute_key 时,它不会导致 VKO_compute_key(通过在 VKO_compute_key 的开头设置 int3)。

我是不是误会了什么?或者有人可以展示一个使用来自 openssl 的 gost 引擎生成共享密钥的示例吗?

【问题讨论】:

    标签: cryptography openssl diffie-hellman gost3410


    【解决方案1】:

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

    以下代码在使用 GOST 引擎时可以很好地生成共享密钥。

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2010-11-15
      相关资源
      最近更新 更多