在处理数据的过程中,不可避免的会碰到数据类型之间的转换。下图给出了各种数据类型之间的转换。
大整数和字符串之间的转换比较简单,这里就不多加说明了。下面将重点讨论字符串和点之间的转换。这里提到的字符串默认为十六进制字符串,至于其他进制的字符串和点之间的转换可在代码中查找。
要转成点的这个字符串是有一定的格式要求的(设字符串放在unsigned char *buf中):
首先,buf[0] 用于表示压缩形式(和y*,必要时)。另外约定,buf[0]=0等价于point=∞。
其次,从buf[1]开始存放x坐标。如果x比p小得多,则在字符串中必需添上足够的零以补齐。
最后,在x坐标后面存放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)
───────────────────────────────────────
点转字符串
点到字符串的转换思路如下:
其中大整数转化成字符串的函数为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)
───────────────────────────────────────