Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OpenSSL密码库算法笔记——第5.4.13章 椭圆曲线点的压缩

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

作者头像
全栈程序员站长
发布于 2022-09-09 07:06:51
发布于 2022-09-09 07:06:51
8970
举报

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

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

椭圆曲线上的任一仿射点(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]为:

。 ………(5.16)

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

其中,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)。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
OpenSSL密码库算法笔记——第5.1.2章 椭圆曲线算法集
在定义椭圆曲线点群时出现了描述曲线所用算法的参数const EC_METHOD *meth,这一节就来看看这个参数有什么用处。
全栈程序员站长
2022/09/13
4050
OpenSSL密码库算法笔记——第5.1.1章 椭圆曲线点群的定义
下面定义的椭圆曲线点群不仅包含了域的信息和曲线的信息,甚至还包括了很多别的有利于实现的信息。
全栈程序员站长
2022/09/13
3650
OpenSSL密码库算法笔记——第5.2章 椭圆曲线算法的函数架构图
椭圆曲线算法中涉及的函数纷繁复杂,比如为了实现“复制点群”功能,就定义了四个函数,有:
全栈程序员站长
2022/09/13
4790
OpenSSL密码库算法笔记——第5.2章 椭圆曲线算法的函数架构图
让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结
从官网下载openssl源码和 libcurl源码。OpenSSL顺利交叉编译通过。
杨永贞
2020/08/05
4.6K0
让终端支持https,移植OpenSSL和libcurl到嵌入式linux,遇到的问题总结
椭圆曲线加密与NSA后门考古
本文主要介绍椭圆曲线的基本原理以及基于椭圆曲线的密码学实现,包括ECC加密、ECDH秘钥交换以及ECDSA签名算法,并介绍其中潜在的一些安全问题。其中分析了两个ECC实现相关的真实案例,分别是索尼PS3的签名问题和美国国家安全局NSA留下的椭圆曲线后门。
evilpan
2023/02/12
1.3K0
椭圆曲线加密与NSA后门考古
ECDH椭圆双曲线(比DH快10倍的密钥交换)算法简介和封装
前面有几篇blog就提到我有计划支持使用ECDH密钥交换。近期也是抽空把以前的DH密钥交换跨平台适配从atgateway抽离出来,而后接入了ECDH流程。
owent
2018/08/01
5.5K0
密码学[3]:椭圆曲线
Short Weierstrass 椭圆曲线:F 是特征 q > 3 的有限域,a, b ∈ F,且 4a^3 + 27b^2 \ne 0 ,所有点 (x, y) ∈ F x F 满足方程 y^2 = x^3 + ax + b 所组成的集合,还有额外的一个点 O,称为无穷点:
谛听
2023/10/27
9450
编出个区块链:数据结构的序列化
有过区块链开发相关工作经验的同学知道,要开发智能合约的应用,你首先需要通过geth同步以太坊主网,这意味着你需要从其他节点下载很多数据。另外在使用区块链技术时,例如支付,接收数字货币时,“钱包”应用需要发送一系列数据给对方,当我们需要通过网络收发数据时就需要对数据进行序列化。
望月从良
2022/03/28
5790
Rust FFI 编程 - 手动绑定 C 库入门 01
本篇为一个新的章节《手动绑定 C 库入门》的第一篇。从这个章节开始,我们将会进行使用 Rust 对 C 库进行封装的实践。
MikeLoveRust
2020/05/14
1.8K0
高效的多维空间点索引算法 — Geohash 和 Google S2
每天我们晚上加班回家,可能都会用到滴滴或者共享单车。打开 app 会看到如下的界面:
一缕殇流化隐半边冰霜
2018/08/30
3.5K0
高效的多维空间点索引算法 — Geohash 和 Google S2
大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)
这里提一下,我维护的几个记录个人学习笔记以及社区中其它大佬们的优秀博客链接的仓库都获得了不少star,感谢读者们的认可,我也会继续在开源社区多做贡献。github主页:https://github.com/BBuf ,欢迎来踩
BBuf
2024/06/18
2.8K0
大模型KV Cache节省神器MLA学习笔记(包含推理时的矩阵吸收分析)
Linux系统文件压缩与备份
在 Linux 系统选有相当多的压缩命令可以使用,这些压缩指令可以让我们更方便的从网上下载大型文件,本章第一节内容我们就来谈谈这个 Linux 系统下常用的几种压缩格式吧.
王 瑞
2022/12/28
2.7K0
【Linux】《how linux work》第二章 基本命令和目录层次结构(3)
Every Unix file has a set of permissions that determine whether you can read, write, or run the file. Running ls -l displays the permissions. Here’s an example of such a display:
阿东
2024/04/27
1430
【Linux】《how linux work》第二章 基本命令和目录层次结构(3)
Kotlin(Java)与Golang的椭圆曲线密钥交换算法
go写的服务端后台,android是客户端之一,需要用到密钥交换(ecdh)算法生成aes密钥加密数据。公私钥生成算法,ECC-P256,也即secp256r1.
天地一小儒
2022/12/28
1.8K0
Kotlin(Java)与Golang的椭圆曲线密钥交换算法
Go unsafe包底层编程细节详解 【Go语言圣经笔记】
Go语言的设计包含了诸多安全策略,限制了可能导致程序运行出错的用法。编译时类型检查可以发现大多数类型不匹配的操作,例如两个字符串做减法的错误。字符串、map、slice和chan等所有的内置类型,都有严格的类型转换规则。
Steve Wang
2021/12/06
1.4K0
Go unsafe包底层编程细节详解 【Go语言圣经笔记】
高效的多维空间点索引算法 — Geohash 和 Google S2
如果同时有很多遍布全国的请求都在查找附近的餐馆,按照上述的做法,你的服务有能力及时响应么?
YoungTimes
2022/04/28
2.8K0
高效的多维空间点索引算法 — Geohash 和 Google S2
点云压缩研究进展与趋势
三维点云为物理世界精细数字化提供了高精度的三维表达方式,广泛应用于三维建模、智慧城市、自主导航系统、增强现实等领域。然而点云的数据海量、非结构化、密度不均等特点给点云的存储和传输带来了巨大挑战,因此在有限的存储空间容量和网络传输带宽中实现低比特率、低失真率的点云压缩具有重要的理论意义和实用价值。
一点人工一点智能
2023/09/15
1.2K0
点云压缩研究进展与趋势
NOIP2020 前练习笔记
给一棵树,每个点权值为 w_i,需要将节点分组。 分组要求:每个组内的点,两两不存在祖先——后代关系。 每个组的代价是组内的最大值,求最小的总代价。
Clouder0
2022/09/23
5360
跳点搜索算法JPS及其优化
引言 寻路算法用途众多,例如在游戏和地图中。A*算法已经众所周知,对于其优化也是层出不穷,然而性能并没有取得突破性进展。本文介绍一种跳点搜索算法JPS以及其四个优化算法,其中三个优化是加速跳点的寻找,
serena
2017/12/11
6.9K2
跳点搜索算法JPS及其优化
【Linux】《how linux work》第二章 基本命令和目录层次结构(第二部分)
Occasionally, you may redirect standard output but find that the program still prints something to the terminal. This is called standard error (stderr); it’s an additional output stream for diagnostics and debugging.
阿东
2024/04/21
1610
【Linux】《how linux work》第二章 基本命令和目录层次结构(第二部分)
推荐阅读
相关推荐
OpenSSL密码库算法笔记——第5.1.2章 椭圆曲线算法集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档