密码学 | 椭圆曲线 ECC 密码学入门(四)

news2024/9/17 7:16:38

目录

正文

1  曲线方程

2  点的运算

3  求解过程

4  补充:有限域


⚠️ 知乎:【密码专栏】动手计算双线性对(中) - 知乎

⚠️ 写在前面:本文属搬运博客,自己留着学习。注意,这篇博客与前三篇博客来源于不同网站,因此没有逻辑联系。在本文中,你将看到一个椭圆曲线的循环群是如何诞生的。


正文

上一篇分享了 “模运算” 相关的知识,并且计算了一些有限域的例子,这一篇我们讨论在通用零知识证明中经常提到的椭圆曲线和双线性配对。

很遗憾,尚未找到所谓的 “上一篇” 文章。此外,这篇文章也没有讲双线性对。

椭圆曲线作为双线性对的基础和前置知识,我们首先介绍一下其在实数域上的表现形式,然后通过计算的方法列出 “F_{101}” 上的全部元素的列表。

有限域一般用 “F_P” 来表示,其大小是大素数 P 。在这个有限域中,包含了 P 个元素,包括数字 0 到 P-1 。这里的 “F_{101}”(Latex 写法)表示素数为 101 的有限域。

1  曲线方程

椭圆曲线的一般形式的方程其实比较复杂,称为 Weierstrass 方程,形如下面的形式:

y^2+axy+by=x^3+cx^2+dx+e

区块链中的椭圆曲线用的不是一般形式,而是后文提到的简化形式。

我们先将 a, b, c, d, e 随意的取值为 1, 2, 3, 4, 5,并通过画图来查看曲线在直角坐标系上的表现形式。根据二次方程求根公式(假设求根公式可用),我们将其变换为 x 关于 y 的函数:

y=\frac{1\pm \sqrt{4x^3+12x^2+16x+20}}{2}

二次方程求根公式就是我们在初中会学习的那个求根公式。

根据方程作图如下:

用几何画板画的图。

根据上面的方程和作图过程了解到,曲线由上下两个半支组成,关于 y=0.5 对称。

求解 f(x) = g(x) 时的 (x, y) 就能得到 y=0.5,可惜我已经不是高中生。

对称的总是美的,但是这个曲线却有一点瑕疵,它的对称轴并不是 x 轴而是 y=0.5。考虑到 Weierstrass 太过复杂,人们更经常使用的是在 Weierstrass 方程的基础上进行一些坐标变换(平移和缩放)和参数化简后的形式。该形式关于 x 轴对称:

y^2=x^3+ax+b

当取 a=0,b=3 时,画出曲线如下图,容易验证 (1, 2) 是曲线上一点,对称的 (1, -2) 也是。

通过方程我们画出了曲线的图像,但是说这就是椭圆曲线的图像其实并不准确。

准确地说,我们画的是在实数域上这个方程的图像。在复数域上当然有更多的点也满足曲线方程但是我们的图像中并没有体现,例如 (-2, √5i) 。如果把曲线看作点的集合,那数域的扩张直接影响到我们要讨论的这个集合的大小,这在本文后半部分我们还会看到。

不懂复数也没关系,后面不会再提到。

另外为了让其拥有更多的性质,我们认为椭圆曲线其实还包括一个 “无穷远” 点。这个点在图中并不能体现出来,我们也不能以直角坐标的形式写出这个点的坐标,但是当我们说椭圆曲线时默认其点的集合中包含这个点。“无穷远” 点一般用 “O” 表示。

所谓的 “无穷远” 点更多是一个服务于概念的点,我们不能也不需要用坐标表示出来。

2  点的运算

有了 “元素的集合” 还需要有 “在集合上的运算”

椭圆曲线上的点(有无穷个)就是椭圆曲线 “元素的集合”,但是为了构建密码算法还需要定义点的运算。这里我们只需要定义一种特殊的基本运算就可以,不妨将这种运算称作 “加法”,用 “+” 表示。

个人理解:把这里的 “定义一个运算” 理解为小学做的定义新运算就行了。

通过几何意义可以清楚地理解这种运算的定义,例如我们选取了曲线上的两个点 A 和 B 计算加法,把 A+B 的结果记为 C,过程如下:

  1. 过 A 点、B 点做直线,交曲线于 T 点;
  2. 过 T 点做 x 轴的垂线,交曲线于 C 点,C 点即为所求;

如下图所示:

回忆:密码学 | 椭圆曲线 ECC 密码学入门(二)中作者比喻的台球运动。

需要说明的是:

① 当两个 “加数” 位置的点(即 A 点和 B 点)为同一个点时,上述步骤 1 中所做的,其实是过该点的 切线

② 当 A 点、B 点的连线垂直于 x 轴时,我们规定直线 AB 和曲线的第三个交点(即除 A 点、B 点外的第三个交点)是 无穷远点 “O”

在这样的规则下容易发现:

  • 任何 P 点都有一个对应的 P’ 点,使得 P+P’=O;
  • 任何 A 点和 O 点的运算的结果都是 A 点本身;
  • 由于连线 AB 和连线 BA 其实是同一条直线,因此这里定义的点的加法满足交换率。

针对第一条,P 和 P' 本质上说的就是 P 点和自己的对称点,即任何点及其对称点做 “加法” 都等于 O;针对第二条,将 A 点和 O 点连线,一定交曲线于 O 点本身,再过 O 点作垂线,又交于 A 点本身;针对第三条,也就是说 A+B=B+A=C 。

3  求解过程

根据定义再结合一些解析几何的知识,就可以求出点加法的坐标计算公式。

例如假设 A 和 B 的坐标分别为 (x_a, y_a) 和 (x_b, y_b),那么 C 点坐标如下:

\left\{\begin{matrix} x_c=\lambda ^2-x_a-x_b\\ y_c=\lambda(x_a-x_c)-y_a \end{matrix}\right.

其中 “λ” 是直线 AB 连线的斜率(当 A、B 重合时是 A 点的切线斜率)。

公式貌似没有问题。

现在我们将转而讨论 有限域 上的椭圆曲线,其上的椭圆曲线表现为一些散布的点。在有限域上,A+B 虽然已经没有明确的几何意义,但是有同样的计算公式。

我们已经验证过 (1, 2) 是椭圆曲线上的点,那么我们就把该点记为 G,并且从该点开始,计算 G、G+G、G+G+G…… 看看会有怎样的规律。

G+G 为例,我们进行演算,首先计算 λ,也就是 G 点(切线)的斜率:

\lambda =\frac{3x_a^2}{2y_a}=\frac{3\times 1^2}{2\times 2}\ \mathrm{mod}\ 101=3\times 4^{-1}\ \mathrm{mod}\ 101=3\times 76\ \mathrm{mod}\ 101=26

为什么是 G 点切线的斜率?答:G+G 就等价于 A 点和 B 点重合的情况,因为 A 点是 G 点,B 点也是 G 点。P.S. 暂时没学过小数和负数的模运算 😇

然后计算 C 点坐标:

\left\{\begin{matrix} x_c=(26^2-1-1)\ \mathrm{mod}\ 101=68 \\ y_c=(26\times (1-68)-2)\ \mathrm{mod}\ 101=74\end{matrix}\right.

因此 G+G 的坐标为 (68, 74)。

就是把 G 点的坐标 (1, 2) 和斜率 λ 代入进去。

2G+G 稍稍有不同,主要是 λ 需要从切线斜率修改为直线 AB 的斜率:

\lambda =\frac{y_b-y_a}{x_b-x_a}=\frac{74-2}{68-1}\ \mathrm{mod}\ 101=(72\times98)\ \mathrm{mod}\ 101=87

同样地,代入公式计算 2G+G 的坐标:

 \left\{\begin{matrix} x_c=(87^2-1-68)\ \mathrm{mod}\ 101=26 \\ y_c=(87\times (1-26)-2)\ \mathrm{mod}\ 101=45\end{matrix}\right.

因此我们也计算出 2G+G=3G 的坐标 (26, 45),以此类推进行计算,我们得到下表:

0O1(1, 2)2(68, 74)3(26, 45)4(65, 98)
5(12, 32)6(32, 42)7(91, 35)8(18, 49)9(18, 52)
10(91, 66)11(32, 59)12(12, 69)13(65, 3)14(26, 56)
15(68, 27)16(1, 99)17O

读者可以选择表中的点,例如 (32, 42),来验证其是否在曲线上,相关演算我们不在本文赘述。

接着,我们展示 17 个点在直角坐标系中的分布(无法展现 O),读者可以体会其中的对称之美:

可能会好奇 16G+G 的结果到底是多少,以至于能称之为无穷点 O 点。个人认为,无穷点就是一个服务于 “模” 和 “循环” 这一概念的点,不能也不需要用坐标表示出来。

经过计算和验证可以发现,这一系列点构成了一个周期为 17 的循环。如果我们将 k 个 G 相加记为kG,并且将 O 看作 0G,同时定义 17G=O 。这像极了模 17 加法的规律,并且在模 17 加法和为 0 的两个数(即 0 和 17)对应的两个椭圆曲线点的和正好是 O 。

个人理解:“模 17 加法” 就是指,从 0 一直加一加到 17,再加一的话又回到 0 。

我们说这样的 17 个点和加法一起构成一个 有 17 个元素的循环群

因为这只是一篇科普性质的文章,我们不给出 循环群 的严格定义,但是正如它的名字中强调的 “循环”,循环群 最突出的性质就是能够由某个元素不断运算从而得到全部。

需要强调的是这 17 个点并不是 F_{101} 上椭圆曲线的全部,但仅利用这 17 个元素组成的集合我们已经能够在其中完成点的加法运算,也就是说任意选择集合中两个点进行加法,其结果不会跳出到集合之外。

4  补充:有限域

域(Field)的定义是有如下特性的集合:

  • 定义了加法和乘法;
  • 集合里的元素经过加法和乘法计算,结果仍然在集合内;
  • 计算符合交换率、结合率、分配率;
  • 加法和乘法都有单位元素(集合里的值都有负数,集合里的非零值都有倒数);

举个例子,我们常见的实数集是域,但整数值不是域,这是因为除了 1,其它数的倒数都不是整数。特别地,具有有限个元素的域就是 有限域

个人理解:不严格地来说,上述 17 个点构成的集合是一个有限域,因为集合里的元素经过 “加法” 计算,结果仍然在集合内。同时,“加法” 计算满足交换律。前文讲述的循环群只是一个加法循环群,事实上应该还有乘法循环群。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1597691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

验证ElasticSearch 分词的BUG

验证ElasticSearch 分词的BUG 环境介绍 ElasticSearch 版本号: 6.7.0 BUG 重现 创建测试案例索引 PUT test_2022 {"settings": {"analysis": {"filter": {"pinyin_filter": {"type": "pinyin"}},"analy…

万界星空科技商业开源MES+项目合作+低代码平台

今天我想和大家分享的是一套商业开源的 MES制造执行管理系统。对于制造业而言,MES 是一个至关重要的系统,它可以帮助企业提高生产效率、优化资源利用、提高产品质量,从而增强市场竞争力。什么是 MES? MES 是指通过计算机技术、自动…

uniapp开发 如何获取IP地址?

一、需求 使用uniapp开发小程序时,需要调取【记录日活动统计】的接口,而这个接口需要传递一个ip给后台, 那么前端如何获取ip呢?下面代码里可以实现 二、代码实现 1.在项目的manifest.json中配置一下网络权限: &quo…

企业网络日益突出的难题与SD-WAN解决方案

随着企业规模的迅速扩张和数字化转型的深入推进,企业在全球范围内需要实现总部、分支机构、门店、数据中心、云等地点的网络互联、数据传输和应用加速。SD-WAN作为当今主流解决方案,在网络效率、传输质量、灵活性和成本等方面远远超越传统的互联网、专线…

C语言之探秘:访问结构体空指针与结构体空指针的地址的区别(九十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

前端标记语言HTML

HTML(HyperText Markup Language)是一种用于创建网页的标准标记语言。它是构建和设计网页及应用的基础,通过定义各种元素和属性,HTML使得开发者能够组织和格式化文本、图像、链接等内容。 HTML的基本结构 文档类型声明&#xff0…

Adobe Premiere 2020 下载地址及安装教程

Premiere是一款专业的视频编辑软件,由Adobe Systems开发。它为用户提供了丰富的视频编辑工具和创意效果,可用于电影、电视节目、广告和其他多媒体项目的制作。 Premiere具有直观的用户界面和强大的功能,使得编辑和处理视频变得简单而高效。它…

【AngularJs】前端使用iframe预览pdf文件报错

<iframe style"width: 100%; height: 100%;" src"{{vm.previewUrl}}"></iframe> 出现报错信息&#xff1a;Cant interpolate: {{vm.previewUrl}} 在ctrl文件中信任该文件就可以了 vm.trustUrl $sce.trustAsResourceUrl(vm.previewUrl);//信任…

Python基于卷积神经网络的车牌识别系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

qt5-按字节读取并解析含属性的xml文件

参考&#xff1a; 对XML文件读取和编辑2-QXmlStreamReader读取 - 知乎 https://zhuanlan.zhihu.com/p/358862429 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt 5.12 代码已测试通过。 问题描述 需要按字节读取一个文档&#xff0c;解析其中具有xml格式的…

【C语言回顾】数组

前言1. 数组2. 一维数组2.1 一维数组的创建2.2 一维数组的初始化2.3 一维数组的使用2.3.1 一维数组的下标2.3.2 一维数组的输入和输出 2.4 一维数组在内存中的存储 3. 二维数组3.1 二维数组的创建3.2 二维数组的初始化3.3 二维数组的使用3.3.1 二维数组的下标3.3.2 二维数组的输…

ELK日志收集和备份填坑实战 (滞后8个小时等时区问题)

ES的备份&#xff1a;ES快照备份 根据时间&#xff0c;每天零点在Linux机器crontab来调用api接口实现快照备份&#xff0c;通过快照备份&#xff0c;可以定准恢复到某一天的日志。 现象&#xff1a;&#xff08;坑&#xff1a;但是恢复某一天日志&#xff0c;发现会少8小时的日…

暴力破解密码自动阻断

1 re模块 re 模块是 Python 中用于正则表达式操作的模块。正则表达式&#xff08;Regular Expression&#xff09;是一种强大的文本处理工具&#xff0c;它使用一种特殊的字符序列来表示字符串中的模式&#xff0c;并可以通过模式匹配、查找、替换等操作对文本进行高效处理。 …

【Qt】:对话框(二)

对话框 一.消息对话框&#xff08;QMessageBox&#xff09;1.自己构建2.使用静态函数构建 二.颜色对话框&#xff08;QDialog&#xff09;三.文件对话框&#xff08;QFileDialog&#xff09;四.字体对话框&#xff08;QFontDialog&#xff09;五.输入对话框&#xff08;QInputD…

光场相机建模与畸变校正改进方法

摘要&#xff1a;光场相机作为一种新型的成像系统&#xff0c;可以直接从一次曝光的图像中得到三维信息。为了能够更充分有效地利用光场数据包含的角度和位置信息&#xff0c;完成更加精准的场景深度计算&#xff0c;从而提升光场相机的三维重建的精度&#xff0c;需要实现精确…

PgSQL之WITH Queries/Statement

PostgreSQL WITH 子句 在 PostgreSQL 中&#xff0c;WITH 子句提供了一种编写辅助语句的方法&#xff0c;以便在更大的查询中使用。 WITH 子句有助于将复杂的大型查询分解为更简单的表单&#xff0c;便于阅读。这些语句通常称为通用表表达式&#xff08;Common Table Express…

《Kubernets证书篇:基于Kylin V10+ARM架构CPU修改K8S 1.26.15版本证书时间限制》

一、背景 Kubernetes 默认的证书有效期只有1年&#xff0c;因此需要每年手动更新一次节点上面的证书&#xff0c;特别麻烦而且更新过程中可能会出现问题&#xff0c;因此我们要对 Kubernetes 的 SSL 证书有效期进行修改&#xff0c;这里将证书的时间限制修改为100年。 环境信息…

视频国标学习

总体介绍 GB/T28181协议&#xff0c;全名叫《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是由中国国家标准委员会发布的一种国家级的标准。它主要对视频监控系统的各个方面做了明确的规定&#xff0c;使得不同厂商生产的视频监控设备能够相互连通&am…

JavaScript之Proxy详解

文章的更新路线&#xff1a;JavaScript基础知识-Vue2基础知识-Vue3基础知识-TypeScript基础知识-网络基础知识-浏览器基础知识-项目优化知识-项目实战经验-前端温习题&#xff08;HTML基础知识和CSS基础知识已经更新完毕&#xff09; 正文 Proxy是JavaScript中的一个强大而灵活…

linux 自定义快捷指令(docker

vi /root/.bashrc alias disdocker images alias dpsdocker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" 保存退出后使用sourece /root/.bashrc 让其立即生效 sourece /root/.bashrc