OpenSSL密码库算法笔记——第5.4.14章 椭圆曲线的点与字符串的转化

在处理数据的过程中,不可避免的会碰到数据类型之间的转换。下图给出了各种数据类型之间的转换。

OpenSSL密码库算法笔记——第5.4.14章 椭圆曲线的点与字符串的转化_第1张图片

 

大整数和字符串之间的转换比较简单,这里就不多加说明了。下面将重点讨论字符串和点之间的转换。这里提到的字符串默认为十六进制字符串,至于其他进制的字符串和点之间的转换可在代码中查找。

要转成点的这个字符串是有一定的格式要求的(设字符串放在unsigned char *buf中):

首先,buf[0] 用于表示压缩形式(和y*,必要时)。另外约定,buf[0]=0等价于point=∞。

其次,从buf[1]开始存放x坐标。如果x比p小得多,则在字符串中必需添上足够的零以补齐。

最后,在x坐标后面存放y坐标(如果存在)。

有了这样的规则以后,字符串与点之间转换的思路就比较清晰了。

字符串转点

        字符串到点的转换思路如下:

  1. 读取buf[0]和群的一些基本信息,如特征p的长度(用来决定读取多长的字符串作为x坐标)。
  2. 利用将字符串转化成大整数的函数读出x坐标。
  3. 通过buf[0]决定是通过解压缩获取y坐标还是直接读取y坐标。

其中字符串转化成大整数的函数为BIGNUM *BN_bin2bn(const unsigned char *s, int len, BIGNUM *ret),其作用是将字符串s转化成大整数ret。

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

int EC_POINT_oct2point(const EC_GROUP *group, EC_POINT *point, const unsigned char *buf, size_t len)

功能:     将字符串转化成点

输入:     group,point,buf【字符串】,len【字符串长】

输出:     point

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

出处:     ec_lib.c

调用:        int ec_GFp_simple_oct2point(const EC_GROUP *group, EC_POINT *point,const unsigned char *buf, size_t len)

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

点转字符串

点到字符串的转换思路如下:

  1. 读取压缩形式参数form和群的一些基本信息,如特征p的长度(用来决定写入多长的字符串作为x坐标)。
  2. 读取点的仿射坐标x、y。
  3. 根据form的值(和y的最后一比特,如果必要)填写buf[0]。
  4. 利用大整数转字符串函数输出x坐标。
  5. 根据form的值决定需不需要输出y坐标。

其中大整数转化成字符串的函数为int BN_bn2bin(const BIGNUM *a, unsigned char *to),其作用是将大整数a转化成字符串s。

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

size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form, unsigned char *buf, size_t len)              

功能:     将点的仿射坐标(以压缩或者不压缩形式)转化成字符串

输入:     group,point,form【压缩方式】,len【允许的字符串大小上限】

输出:     buf【字符串】

返回:     转化得到的字符串长度 or 1【point=∞】

出处:     ec_lib.c

调用:        size_t ec_GFp_simple_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form,unsigned char *buf, size_t len)

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

你可能感兴趣的:(openssl)