BIGNUM(大数)

  • BIGNUM 是 OpenSSL 里用于存储大整数的结构体,远超普通的 intlong,适合密码学中用到的大数运算。
  • 常用操作函数示例:
    • BN_new() — 创建一个新的大数对象。
    • BN_free() — 释放大数对象。
    • BN_hex2bn(BIGNUM **bn, const char *hex) — 从十六进制字符串创建大数。
    • BN_bn2hex(const BIGNUM *bn) — 把大数转成十六进制字符串。
    • BN_mod_inverse() — 计算模逆。
    • BN_mod_mul() — 模乘。
    • BN_mod_add() — 模加。
    • BN_rand_range() — 生成范围内随机数。

BN_CTX 是大数计算时的临时变量池,避免频繁申请释放内存。

使用流程:

  • BN_CTX_new() 创建。
  • BN_CTX_start() 开始申请临时变量。
  • BN_CTX_get() 依次申请临时变量(BIGNUM指针)。
  • 计算结束后用 BN_CTX_end()BN_CTX_free() 清理。

EC_GROUP

  • 代表一个椭圆曲线参数集合,例如素域p,系数a,b,基点G,阶n等。
  • EC_GROUP_new_curve_GFp(p, a, b, ctx) — 根据参数创建一个椭圆曲线。
  • EC_GROUP_set_generator(group, generator, order, cofactor) — 设置曲线的生成元和阶。

EC_POINT

  • 曲线上一个点,类似二维坐标 (x,y)。
  • EC_POINT_new(group) — 创建一个点对象。
  • EC_POINT_set_affine_coordinates_GFp(group, point, x, y, ctx) — 设定点的坐标(注意这个函数从 OpenSSL 3.0 开始被标记为废弃)。
  • EC_POINT_get_affine_coordinates_GFp(group, point, x, y, ctx) — 获取点的坐标。
  • EC_POINT_mul(group, R, k, Q, l, ctx) — 计算 R = k*G + l*Q(点乘运算)。