0

在我尝试使用纯 CI 实现Burmester-Desmedt密钥协议时,需要划分 2 个公钥,因此我认为BN_div应该可以完成这项工作。但是当我阅读文档时:

将 a 除以 d 并将结果放入 dv 并将余数放入 rem (dv=a/d, rem=a%d)。dv 和 rem 中的任何一个都可能为 NULL,在这种情况下不返回各自的值。结果向零舍入;因此,如果 a 为负数,则余数将为零或负数。要除以 2 的幂,请使用 BN_rshift(3)。

我无法理解参数ctx的用途,到目前为止,我理解的 wjat 是:

rem=a%d
dv=a/d

ctx此操作中,用于某种递归的参数应设置为NULL?

4

2 回答 2

2

对于所有函数,ctx 是先前分配的用于临时变量的 BN_CTX;见 BN_CTX_new。

所以你必须做

BN_CTX *ctx = BN_CTX_new();
BIGNUM dv;
BIGNUM rem;
BIGNUM a = ...;
BIGNUM d = ...;

if (!BN_div(&dv, &rem, &a, &d, ctx))
  ...error case
else
  ...ok case

如果您有其他BN_xx电话可以重复使用相同的ctx,这就是目标

于 2019-01-25T13:44:06.830 回答
1

来自文档的逐字记录:

BN_CTX 是一个包含库函数使用的 BIGNUM 临时变量的结构。由于用于创建 BIGNUM 的动态内存分配在与重复的子程序调用结合使用时相当昂贵,因此使用了 BN_CTX 结构。

用于 BN_CTX_new()创建上下文。完成后打电话BN_CTX_free()

于 2019-01-25T13:37:44.173 回答