首页 > 解决方案 > LibCrypt BN_div 上的 `ctx` 参数有什么用?

问题描述

在我尝试使用纯 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?

标签: copenssldivisionbignumlibcrypto

解决方案


对于所有函数,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,这就是目标


推荐阅读