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

目录

正文

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.mzph.cn/news/819168.shtml

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

相关文章

代码随想录算法训练营Day56|LC583 两个字符串的删除操作LC72 编辑距离

一句话总结:看起来复杂,动规分析以后就比较简单。 原题链接:583 两个字符串的删除操作 本质就是求两个字符串的最短子序列的长度。已经做过,不再详解。 class Solution {public int minDistance(String word1, String word2) {/…

Python(11):网络编程

文章目录 一、一些基本概念二、软件的开发架构(c/s架构和b/s架构)三、OSI模型四、socket套接字编程1.socket编程过程2.python中的socket编程 一、一些基本概念 来了解一些网络的基本概念 名词解释IP(互联网协议地址)IP用来标识网…

PCB基础介绍

一,单层板: 1,铜皮 和导线类似,提供电路板上的电信号传导路径。 因为铜具有良好的导热性能,因此铜皮还可以用于散热。在高功率电子设备中,通过在PCB上增加铜皮面积和散热片,可以提高散热效果…

数字晶体管数字三极管

数字晶体管 指内部集成了电阻的三极管,有PNP和NPN型,也有双管,双管有3种形式,其中一种是PNPNPN。下面以双NPN示例,好处是外面没有电阻,批量应用时,焊点费用就可省下不少。双NPN的用在串口自动下…

开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread

开源相机管理库Aravis例程学习(二)——连续采集multiple-acquisition-main-thread 简介例程代码函数说明arv_camera_set_acquisition_modearv_camera_create_streamarv_camera_get_payloadarv_buffer_newarv_stream_push_bufferarv_camera_start_acquisi…

java:多线程

多线程 在java程序中同时执行多个线程,每个线程独立执行不同的任务. 可以提高程序的性能和资源利用率,增加程序的并发性. 多线程的作用 1,提高程序性能 可以将一个任务分解成多个子任务并行处理,从而提高程序的运行速度 2,提高资源利用率 可以更好地利用CPU资源,提高CPU…

如何实现Windows RDP 远程桌面异地跨网连接

Windows RDP远程桌面的应用非常广泛。远程桌面协议(RDP)是一个多通道(multi-channel)的协议,让使用者(所在计算机称为用户端或本地计算机)连上提供微软终端机服务的计算机(称为服务端或远程计算机)。大部分的Windows版本都有用户端所需软件,有些其他操作…

Python Flask Web 框架-API接口开发_4

一、1、安装 Falsk 当前用户安装 pip3 install --user Flask 确认安装成功: 进入python交互模式看下Flask的介绍和版本: $ python3>>> import flask >>> print(flask.__doc__)flask~~~~~A microframework based on Werkzeug. Its …

病毒繁殖-第12届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第52讲。 病毒繁殖&#xf…

数据结构与算法——23.哈希冲突及其解决方法

这篇文章我们主要讲一下哈希冲突及其解决方法。 目录 1.哈希冲突的介绍 2.解决哈希冲突的方法 2.1 开放地址法 2.1.1 线性探测法 2.1.2 平方探测法(二次探测法) 2.2再哈希法 2.3链地址法 2.4建立公共溢出区 3.总结 1.哈希冲突的介绍 首先&…

vue快速入门(二十五)本地存储与初始化使用

注释很详细&#xff0c;直接上代码 上一篇 新增内容 本地获取数据数据存储到本地 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial…

【浪漫 罗盘时钟 Js、css实现(附源代码) 美化版本】,前端面试必问的HashMap

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

WebKit简介及工作流程

文章目录 一、WebKit简介二、WebKit结构三、Webkit工作流程四、WebKit常见问题五、WebKit优点六、相关链接 一、WebKit简介 WebKit是一个开源的浏览器引擎&#xff0c;它的起源可以追溯到2001年&#xff0c;当时苹果公司推出了其首款基于Unix的操作系统Mac OS X。在2002年&…

最短网络kruskal算法

题目描述 农民约翰被选为他们镇的镇长&#xff01;他其中一个竞选承诺就是在镇上建立起互联网&#xff0c;并连接到所有的农场。当然&#xff0c;他需要你的帮助。约翰已经给他的农场安排了一条高速的网络线路&#xff0c;他想把这条线路共享给其他农场。为了用最小的消费&…

【Java开发指南 | 第七篇】静态变量生命周期、初始化时机及静态变量相关性质

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 生命周期初始化时机常量和静态变量的区别静态变量相关性质静态变量的访问修饰符静态变量的线程安全性静态变量的命名规范 生命周期 生命周期&#xff08;Lifecycle&#xff09;是指一个对象从创建到销毁的整个…

光电传感器的工作原理简介

光电传感器是一种利用光电效应将光信号转换为电信号的传感器。 工作原理 光照射&#xff1a;光电传感器通过光源&#xff08;如LED或激光&#xff09;照射在其表面。 光电转换&#xff1a;光线与传感器材料发生光电反应&#xff0c;产生电信号。这种转换过程涉及到光子与电子的…

Albumentations库:为自定义数据进行数据增强

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 为什么在深度学习中使用增强&#xff1f; 深度学习和计算机视觉中的增强已经成为至关重要的几个原因。首先&#xff0c;它丰富了训练数据集&#xff0c;使模型能够从更多样化的示例中学习&#xff0c;这在标记数据有限时…

C++修炼之路之list--C++中的双向循环链表

目录 前言 一&#xff1a;正式之前先回顾数据结构中的双向循环链表 二&#xff1a;list的简介 三&#xff1a;STL中list常用接口函数的介绍及使用 1.构造函数接口 2.list迭代器 范围for 3.数据的修改接口函数 4.list容量操作函数 5.list的迭代器失效 6.演示代码和测…

【深度剖析】曾经让人无法理解的事件循环,前端学习路线

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

Mybatispuls-自动填充

一&#xff0c; 创建时间 . 修改时间! 这些个操作都是自动化完成的,我们不希望手动更新! 阿里巴巴开发手册:所有的数据库表:gmt_create .gmt_modified几乎所有的表都要配置上!而且需要自动化! 二&#xff0c;如何实现 1&#xff0c;编写实体类&#xff08;字段属性上添加注解…