在尝试使用纯C来实现Burmester-Desmedt密钥协议时,我需要划分2个公共密钥,因此我认为BN_div应该可以完成这项工作。但是当我阅读文档时:
将a除以d,然后将结果放入dv,其余部分放入rem(dv = a / d,rem = a%d)。 dv和rem都可以为NULL,在这种情况下,不会返回相应的值。结果四舍五入为零;因此,如果a为负,则余数将为零或负。对于除以2的幂,请使用BN_rshift(3)。
我无法理解参数ctx
用于什么,到目前为止,我知道确实是:
rem=a%d
dv=a/d
此操作中的ctx
所使用的是用于某种递归的参数,应将其设置为NULL
吗?
答案 0 :(得分:1)
docs的逐字记录:
BN_CTX是保存库函数使用的BIGNUM临时变量的结构。由于与重复的子例程调用一起使用时,用于创建BIGNUM的动态内存分配相当昂贵,因此使用BN_CTX结构。
使用BN_CTX_new()
创建上下文。完成后致电BN_CTX_free()
。
答案 1 :(得分:1)
对于所有功能,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 ,这就是目标