3

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

1 つある: VKO 34.10-2001 アルゴリズムは openssl\engines\ccgost\gost2001_keyx.c (関数 VKO_compute_key) に実装されていますが、汎用関数 ECDH_compute_key を呼び出すと、VKO_compute_key につながりません (int3 を設定してこれを確認しました)。 VKO_compute_key の先頭)。

私は何かを誤解しましたか?または、誰かがopensslからgostエンジンを使用して共有キーを生成する例を示すことができますか?

4

1 に答える 1

0

私はそれが古い質問であることを知っていますが、一部の人にとってはまだ話題になっているかもしれません.

次のコードは、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;
}
于 2016-02-18T00:09:07.097 に答える