OpenSSL密码库算法笔记——第5.3.3章 椭圆曲线点群信息的基本操作

新的群建好之后,就可以开始对这个群进行一些基本得操作了,如需要把很多必要的信息(如特征pWeierstrass方程参数ab、基点和阶等)添加进群里面去,同时在必要时还需要将这些信息读出来。

先来看看对特征pWeierstrass方程参数ab的写入和读取。

设置abp信息的函数如下:

───────────────────────────────────────

int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b)

功能:    设置椭圆曲线特征和Weierstrass方程参数

输入:    grouppab

输出:   

返回:    1【正常】or 0【出错】

出处:    ec_lib.c

调用:    

   int ec_GFp_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b)

▼▼int ec_GFp_simple_group_set_curve(EC_GROUP *group,const BIGNUM *p, const BIGNUM *a, const BIGNUM *b)

───────────────────────────────────────

仔细研究这个函数的代码,可以再次看到各个函数之间既紧密相联又各施其责:

  1. EC_GROUP_set_curve_GFp负责提供对外接口。
  2. ec_GFp_mont_group_set_curve负责实现对field_data1field_data2的操作:field_data1 to_mont(p)field_data2 to_mont(1)
  3. ec_GFp_simple_group_set_curve负责处理最底层最基本的信息:group->field p group->a to_mont(a mod p)group->b to_mont(b mod p) group->a_is_minus3赋值。

注意:记号to_montfrom_mont表示大整数与Montgomey整数之间的转化,即a to_mont(b)表示将大整数b转化成Montgomery整数a,而b from_mont(a)表示将Montgomery整数a转化成大整数b。详情参见§5.3.4

接下来看看读取群信息abp的函数。

───────────────────────────────────────

int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b)

功能:     获取椭圆曲线特征和Weierstrass方程参数

输入:     group

输出:     pab

返回:     1【正常】or 0【出错】

出处:    ec_lib.c

调用:        int ec_GFp_simple_group_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b)

备注:    p group->fielda from_mont(group->a)b from_mont(group->b)

───────────────────────────────────────

由于不需要处理field_data1field_data2,所以该函数就直接调用ecp_smpl.c中的函数。

接下来来讨论下基点、阶和相伴因子的读写。

设曲线的阶为,其中n为大素数,h为一个很小的数。我们提到的曲线上的点基本上都是以这个大素数n为阶,所谓的阶就是指“点的阶”n,小整数h被称为相伴因子。基点、阶和相伴因子的写入放在同一个函数里完成,而读取则分开实现。

        下面来看看设置基点、阶和相伴因子的函数。

───────────────────────────────────────

int EC_GROUP_set_generator(EC_GROUP *group, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor)

功能:     设置椭圆曲线的基点、阶和相伴因子

输入:     groupgenerator【基点】,order【阶】,cofactor【相伴因子】

输出:    

返回:     1【正常】or 0【出错】

出处:     ec_lib.c

调用:   

备注:     group->generator generator

group->order order    group->cofactor cofactor

───────────────────────────────────────

获取群基点、阶和相伴因子是由三个函数分别来完成的,它们是:

  1. 获取基点        const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group)
  2. 获取阶           int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order)
  3. 获取相伴因子int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor)

获取基点的函数EC_GROUP_get0_generator如下:

───────────────────────────────────────

const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *group)

功能:    获取基点

输入:    group

输出:   

返回:    基点

出处:    bn_lib.c

调用:   

───────────────────────────────────────

获取阶的函数EC_GROUP_get_order如下:

───────────────────────────────────────

int EC_GROUP_get_order(const EC_GROUP *group, BIGNUM *order)

功能:    获取阶

输入:    group

输出:    order group->order

返回:    1【正常】 or 0【出错】

出处:    bn_lib.c

调用:   

───────────────────────────────────────

获取因子的函数EC_GROUP_get_cofactor如下:

───────────────────────────────────────

int EC_GROUP_get_cofactor(const EC_GROUP *group, BIGNUM *cofactor)

功能:    获取相伴因子

输入:    group

输出:    cofactor group->cofactor

返回:    1【正常】or 0【出错】

出处:    ec_lib.c

调用:   

───────────────────────────────────────

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值