OpenSSL密码库算法笔记——第5.4.13章 椭圆曲线点的压缩

OpenSSL密码库算法笔记——第5.4.13章 椭圆曲线点的压缩首先来看看什么是点的压缩。椭圆曲线上的任一仿射点(x,y)(非无穷远点)都可以压缩成利用其y坐标的最后一比特(记为y*)和x坐标来表示,即(x,y*),这就是点的压缩。反过来,利用(x,y*)恢复y坐标,还原仿射点(x,y)的过程就称为点的解压缩。利用点的压缩可以减少存储和传输时的数据量,但增加了数据处理时间。代码中用参数point_conver…

大家好,又见面了,我是你们的朋友全栈君。

首先来看看什么是点的压缩。

        椭圆曲线上的任一仿射点(x, y)(非无穷远点)都可以压缩成利用其y坐标的最后一比特(记为y*)和x坐标来表示,即(x, y*),这就是点的压缩。反过来,利用(x, y*)恢复y坐标,还原仿射点(x, y)的过程就称为点的解压缩。

利用点的压缩可以减少存储和传输时的数据量,但增加了数据处理时间。

        代码中用参数point_conversion_form_t来表示是否进行点压缩,point_conversion_form_t的定义如下:

typedef enum {

        POINT_CONVERSION_COMPRESSED = 2,

        POINT_CONVERSION_UNCOMPRESSED = 4,

        POINT_CONVERSION_HYBRID = 6

} point_conversion_form_t;

其中

  1. POINT_CONVERSION_COMPRESSED 的值为 2,表示采用点压缩。
  2. POINT_CONVERSION_UNCOMPRESSED的值为4,表示不采用压缩。
  3. POINT_CONVERSION_HYBRID的值为6,表示混合使用,即既包含点压缩又包含未压缩。

为了节省资源,一般会用一个字节表示压缩形式和y坐标的最后一个字节(必要时)。假设用form来表示压缩形式,则表示压缩形式和y*的字节buf[0]为:

OpenSSL密码库算法笔记——第5.4.13章 椭圆曲线点的压缩。               ………(5.16)

        点的压缩很简单,直接用(x, y*)表示即可。但是怎么解压缩该呢,怎么恢复y坐标呢?简而言之,就是利用Weierstrass方程计算平方根。具体过程如下:

OpenSSL密码库算法笔记——第5.4.13章 椭圆曲线点的压缩

其中,Step2计算可以利用文件bn_sqrt.c中的函数BN_mod_sqrt()实现(函数BIGNUM *BN_mod_sqrt(BIGNUM *in, const BIGNUM *a, const BIGNUM *p)的功能是计算a mod p的平方根)。

利用给定的压缩点(x, y*)来设置点坐标(x, y)的过程其实就是解压缩的过程:

  1. point->X ← x
  2. point->Y ← 取x3+ax+b的某一个平方(由y*决定)
  3. point->Z ← 1

其中y*=1表示y坐标为奇数,y*=0表示y坐标为偶数。

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

int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, const BIGNUM *x, int y_bit) 

功能:    利用压缩点坐标来设置点坐标

输入:    group,x【压缩点的x坐标】,int y_bit【y坐标最后一比特】

输出:    point【不压缩的点】

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

出处:    ec_lib.c

调用:        ec_GFp_simple_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point, const BIGNUM *x_, int y_bit)

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

代码的处理过程是,先通过解压缩计算出y坐标,然后直接调用设置仿射点坐标的函数EC_POINT_set_affine_coordinates_GFp(group, point, x, y)

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162142.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • MySQL 添加索引,删除索引及其用法[通俗易懂]

    MySQL 添加索引,删除索引及其用法[通俗易懂]原文:https://www.cnblogs.com/zz-tt/p/6609828.html一.索引的作用一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响…

  • 离线安装gcc步骤「建议收藏」

    离线安装gcc步骤「建议收藏」公司给了测试服务器,很多东西都没有,又没有联网,不能通过yum去下载,只能离线安装,本文是离线安装gcc的步骤1.下载安装包可以通过以下博客的内容去下载包出处:1.https://blog.csdn.net/yuan_ren_sheng/article/details/810215632.https://blog.csdn.net/u012373815/article/deta…

  • 递归 迭代

    递归 迭代递归:A调用B,B调用C,……都在等待上一步结果返回迭代:A问B,B不知道,A再问C,……每次结果都依赖于上一次迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代(只能往后走不能往前退)可迭代对象:在内部定义有__iter__()#可使用__next__()next(iter_l)#内置方法,即调用l.__ite…

  • 博弈论基础_博弈论基础罗伯特

    博弈论基础_博弈论基础罗伯特博弈论这个环节特别好玩,游戏嘛(不会的话做题就不好玩了,当年打比赛比赛结束后两三分钟才推出来,一看答案想撕草稿纸)本篇文章含有大量逻辑证明,做题用不到,不想看的可以略过直接看结论和模板参考文献特别鸣谢孙大佬的PPT和精彩讲解威佐夫博弈尼姆博弈SG函数斐波那契博弈区间最值查询ST表详解预处理查询巴什博弈问题模型只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取…

    2022年10月15日
  • 简述css盒模型概念_css盒模型和ie盒模型

    简述css盒模型概念_css盒模型和ie盒模型Python-html css 盒模型

  • Oracle 函数 wm_concat 将列转行 用法 实例

    Oracle 函数 wm_concat 将列转行 用法 实例

发表回复

您的电子邮箱地址不会被公开。

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