OpenSSL 1.1.x版本中如何访问BIGNUM结构体的top成员?
问题1:是否有可直接替换的接口用于访问top的值?
有,OpenSSL 1.1.0及以上版本提供了官方公开接口BN_get_top(),可以直接替换原有代码:
// 原有代码 // int x = d->top; // 替换为 int x = BN_get_top(d);
这个接口的返回值和原结构体的top成员完全等价,不需要修改后续逻辑。
问题2:top的具体含义是什么?
BIGNUM内部使用BN_ULONG类型的数组存储大整数的二进制内容,top是该数组中实际存储有效数据的元素个数,注意是按「字(即BN_ULONG单位)」计数,不是按位计数:
- 空BIGNUM的
top值为0 - 有效数据不会包含前导零,所以
top值始终对应存储该大整数所需的最少BN_ULONG数量 - 你印象里的「最高有效位」是基于
top换算的结果:总有效位数 =top * BN_BITS2(BN_BITS2是单个BN_ULONG的位数,通常为32或64,和平台相关)
问题3:如果没有替代接口,有没有办法可以完全避免使用top成员?
完全可以,根据使用场景可以用以下公开接口替代,兼容性更强:
- 如果是需要计算大整数的长度:可以用
BN_num_bits()获取总有效位数,或者BN_num_bytes()获取总有效字节数,要换算成等价的top值可以用公式:
计算结果和int equivalent_top = (BN_num_bits(d) + BN_BITS2 - 1) / BN_BITS2;top值完全一致。 - 如果是需要遍历大整数的每个存储字:可以配合
BN_get_words()接口获取内部数组的只读指针,结合上面计算的有效字个数使用即可,不需要直接访问结构体成员。
内容的提问来源于stack exchange,提问作者ahmouse
相关产品推荐
相关产品推荐

