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

OpenSSL密码库算法笔记——第5.4.14章 椭圆曲线的点与字符串的转化在处理数据的过程中 不可避免的会碰到数据类型之间的转换 下图给出了各种数据类型之间的转换 大整数和字符串之间的转换比较简单 这里就不多加说明了 下面将重点讨论字符串和点之间的转换 这里提到的字符串默认为十六进制字符串 至于其他进制的字符串和点之间的转换可在代码中查找 要转成点的这个字符串是有一定的格式要求的 设字符串放在 unsignedchar buf 中 首先 buf

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

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

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

要转成点的这个字符串是有一定的格式要求的(设字符串放在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)

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229829.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:47
下一篇 2026年3月16日 下午3:47


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号