我正在尝试使用 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(通过将 int3 设置为VKO_compute_key 的开头)。
我是不是误会了什么?或者有人可以展示一个使用来自openssl的gost引擎生成共享密钥的例子吗?