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

news2025/1/10 14:37:25

目录

正文

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  求解过程

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

很遗憾,以我上大学后的知识水平是解不出来的。

假设椭圆曲线的方程为:

y^2=x^3+3

需要计算 A+B=C 这一过程中的坐标公式。

假设 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 的斜率:

\lambda =\frac{y_b-y_a}{x_b-x_a}

特别地,当 A、B 重合时,λ 是过 A 点的切线斜率:

\lambda =\frac{3x_a^2}{2y_a}

就是椭圆曲线方程的等号两边同时求导再相除。

上述公式是没有问题的,的确是要代入 x_c 的值来求 y_c 的值。

现在我们将转而讨论 有限域 上的椭圆曲线,其上的椭圆曲线表现为一些散布的点。在有限域上,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 点。为什么 4^{-1} 一下子变成了 76?答:因为这里使用了 “模乘法逆元”,属于是一个数学知识😇

然后计算 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/1610004.html

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

相关文章

qt设置TextEdit的提示性文字

提示性文字,就是用户在输入的时候自动消失的那种 比如: 可以这样设置: lineEdit->setPlaceholderText("我是提示性文字"); 但是我们觉的这样有点难看,可以用以下QSS来调整: 调整提示性文字的位置&…

Spring Boot集成fastdfs快速入门Demo

1.什么是fastdfs FastDFS 是一个开源的高性能分布式文件系统(DFS)。它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议…

【吊打面试官系列】Java高并发篇 - notify()和 notifyAll()有什么区别?

大家好,我是锋哥。今天分享关于 【notify()和 notifyAll()有什么区别?】面试题,希望对大家有帮助; notify()和 notifyAll()有什么区别? 当一个线程进入 wait 之后,就必须等其他线程 notify/notifyall,使用 …

Java web应用性能分析之服务端慢和优化概叙

前面已经分析了客户端慢、前端页面慢、入口Nginx慢,按照上图接下来就是我们服务端重点的接口慢分析优化、服务器资源性能瓶颈分析、服务器带宽性能瓶颈分析。 性能优化的目的 性能优化的目标是提高应用的性能,使其更加高效、稳定和可靠。性能优化包括服…

短视频流媒体平台的系统设计

1. 功能需求: 我们的系统有两类参与者 内容创作者 •上传任何类型的视频(格式编解码器)•视频可以被删除•视频元数据•必填项: 标题,作者,描述•选填项: 分类/标签列表•可以随时更新•当视频对观众可用时,向内容创作…

六边形酷科技特效单页源码

源码介绍 基于canvas画布绘制多个六边形追踪鼠标&#xff0c;科技感的几何图形酷炫动画特效&#xff0c; 单页html源码&#xff0c;可以做网站动态背景&#xff0c;喜欢的朋友可以拿去 效果截图 完整源码 <!doctype html> <html> <head> <meta charset…

IntelliJ-platform plugIn 插件开发专题内容介绍,学习指导(一)

这系列文章出炉对于笔者来说确实不容易&#xff0c;历时快两年了&#xff0c;先后迭代了3版本&#xff0c;暂时与官方最新版本API同步&#xff08;2024.03&#xff09;&#xff0c;文章内容覆盖2022~2024版内容 专题由来 最早接触插件开发是源于公司一个国际化项目&#xff0c…

Ubuntu 22.04.4安装Docker引擎

正文共&#xff1a;1024 字 13 图&#xff0c;预估阅读时间&#xff1a;1 分钟 我们前面安装了几次Ubuntu的操作系统&#xff08;Ubuntu 23.10通过APT安装Open vSwitch&#xff09;&#xff0c;在开始之前&#xff0c;我还是简单提醒一下&#xff0c;从Ubuntu下载页面&#xff…

python:元组,字符串,切片

一、元组# 列表可以修改内容&#xff0c;元组可以不被修改 # 在程序内封装数据&#xff0c;不希望数据被篡改&#xff0c;所以使用元组 # 语法&#xff1a; 不限制类型 # 定于元组的字面量&#xff1a; &#xff08;元素&#xff0c;元素&#xff0c;元素.....&#xff09; # 定…

【人工智能基础】状态空间搜索

状态空间法 状态空间&#xff1a;一个问题全部可能的状态以及其关系的集合。 状态空间图&#xff1a;以图的形式表示问题的状态空间&#xff0c;节点对应状态&#xff0c;边对应状态转移算子&#xff0c;边上的权对应转移所需的代价 问题的解&#xff1a;是从最开始状态到目…

Spring Boot 统一功能处理(三)

本篇主要介绍Spring Boot的统一异常处理。 目录 一、统一异常处理的使用 二、测试统一异常处理效果 三、浅析原理 ControllerAdvice简析 统一处理异常简析 一、统一异常处理的使用 在前面介绍统一数据返回时&#xff0c;我们在程序发生异常时会把整个报错信息都封装在da…

【SQL】DISTINCT GROUP BY

找到所有办公室里的所有角色&#xff08;包含没有雇员的&#xff09;,并做唯一输出(DISTINCT) 用DISTINCT : SELECT DISTINCT B.Building_name,E.Role FROM Buildings B LEFT JOIN Employees EON B.Building_name E.Building需要找到的结果&#xff1a;所有办公室名字&#…

突破深度模型线上耗时瓶颈,我们做了什么?

广告投放是深度模型应用较为普遍的场景之一&#xff0c;虽然深度模型能够提升业务效果&#xff0c;但往往也会付出更加高额的耗时开销。滴滴现今 DSP&#xff08;Demand-Side Platform&#xff09; 业务场景中&#xff0c;耗时问题已然成为限制模型发挥的魔咒&#xff0c;为了打…

数据结构-链表刷题集(长期更新)

文章目录 1. leetcode 2 两数之和1.1 解法一 1. leetcode 2 两数之和 1.1 解法一 题目及其相关实例如下 要做这个题,首先我们要学会模拟竖式的加法,我们知道即使是java基本数据中最大的long类型范围也是有限的,那如果超出范围了我们该怎么办呢,我们就需要用字符串来模拟这个…

【JavaSE】JDK17的一些特性

前言 从springboot3.0开始&#xff0c;已经不⽀持JDK8了 选⽤Java17&#xff0c;概括起来主要有下⾯⼏个主要原因 JDK17是LTS(⻓期⽀持版)&#xff0c;可以免费商⽤到2029年。⽽且将前⾯⼏个过渡版&#xff08;JDK9-JDK16&#xff09; 去其糟粕&#xff0c;取其精华的版本JDK17…

HarmonyOs开发:导航tabs组件封装与使用

前言 主页的底部导航以及页面顶部的切换导航&#xff0c;无论哪个系统&#xff0c;哪个App&#xff0c;都是最常见的功能之一&#xff0c;虽然说在鸿蒙中有现成的组件tabs可以很快速的实现&#xff0c;但是在使用的时候&#xff0c;依然有几个潜在的问题存在&#xff0c;第一&a…

C++相关概念和易错语法(6)(运算符重载)

1.运算符重载注意事项&#xff1a; &#xff08;1&#xff09;多个同一运算符重载可构成函数重载 &#xff08;2&#xff09;在成员函数中由于隐含了this指针&#xff0c;外部调用看上去前置和后置不会有任何区别&#xff0c;所以为了区分这个在后置时强制引入参数int&#x…

C++:模板详解

模板详解 1.函数模板1.概念2.语法3.原理4.实例化1.隐式实例化2.显示实例化 5.匹配原则 2.类模板1.格式2.实例化 3.非类型模板参数注意点 4.特化1.概念2.函数模板特化1.前提2.语法说明3.示例 3.类模板特化1.全特化2.偏特化/半特化3.选择顺序 4.按需实例化 5.模板的分离编译1.分离…

玄子Share-计算机网络参考模型

玄子Share-计算机网络参考模型 分层思想 利用七层参考模型&#xff0c;便于在网络通信过程中&#xff0c;快速的分析问题&#xff0c;定位问题并解决问题 将复杂的流程分解为几个功能相对单一的子过程 整个流程更加清晰&#xff0c;复杂问题简单化 更容易发现问题并针对性的…

Labview2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 LabVIEW是一种由美国国家仪器&#xff08;NI&#xff09;公司开发的程序开发环境&#xff0c;它显著区别于其他计算机语言&#xff0c;如C和BASIC。传统的计算机语言是基于文本的语言来产生代码&#xff0c;而LabVIEW则采用图形化…