news 2026/7/15 14:47:17

椭圆曲线里标量乘法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
椭圆曲线里标量乘法

这张图在讲椭圆曲线里标量乘法(scalar multiplication):给定一个点 P 和整数 n,要算 nP(把点 P 在群里“加”自己 n次)。核心技巧就是Double-and-Add(倍加法)

  • Double(倍点):Q←2Q(等价于 Q+Q)

  • Add(加点):若某一位需要,就把当前的 Q 加进结果:R←R+Q


1)原理一句话

把整数 n 写成二进制:

那么

所以你只需要从 P,2P,4P,8P,…这些“2 的幂倍”里,把二进制位为 1 的那些挑出来加起来即可。
正好可以用“不断倍点”得到:P→2P→4P→8P→⋯

2)图里的例子:n=151

图上写 “Imagine, n=151, we want to compute nP”
先把 151 写成二进制:

  • 也就是

因此:

图中气泡也在强调这点:已经算到的中间结果

16P+4P+2P+P

“离最终结果很近”,只差再把 128P 加上去。


3)图中步骤在做什么(从低位到高位的做法)

图里的流程是典型的“从最低位开始(LSB-first)”:

  • 一开始当前倍数 Q=P,结果 R=0

  • 看二进制最低位是 1,就把 Q 加进 R

  • 然后把 Q倍点(变成下一档:2P,4P,8P,…)

  • 下一位是 1 就加,不是 1 就跳过

对照图里列出的动作:

  1. 取 P(此时 Q=P)

  2. 加 P:R=P(因为最低位

  3. 倍点:Q=2P

  4. 加 2P:R=2P+P(

  5. 倍点:Q=4P

  6. 加 4P:R=4P+2P+P(

  7. 倍点:Q=8P

  8. 不加 8P:R不变(因为

  9. 倍点:Q=16P

  10. 加 16:R=16P+4P+2P+P(

后面继续倍点到 32P,64P,128P,对应位是 0、0、1,最终再把 128P 加进去,就得到 151P。


4)为什么它快?

如果你用“朴素加法”算 151P,要加 150 次点加法。
Double-and-Add 用二进制只需要:

  • 倍点次数:大约是位数(这里 151 是 8 位,倍点约 7 次)

  • 加点次数:大约是二进制里 1 的个数(popcount)减 1(这里有 5 个 1,加点约 5 次)

所以复杂度从 O(n)变成 O(log⁡n),这就是椭圆曲线能高效做签名/密钥交换的关键之一。


5)一个非常直观的类比

把 nP 想成“用很多张面额为 1,2,4,8,16,… 的钞票凑钱”:

  • 倍点:相当于把面额翻倍(1→2→4→8…)

  • 加点:相当于某一位是 1,就把这张钞票放进钱包(累加到结果)

这张图是在用几何方式把椭圆曲线的“标量乘法”拆成一连串倍点(doubling)来做——也就是把

变成“不断翻倍”的过程:G→2G→4G→8G→⋯

图里每种颜色其实在表达固定含义:

  • 红色曲线:椭圆曲线 E

  • 蓝色线段:用于群运算的直线(这里主要是“切线”)

    • 做倍点时,用的是“过该点的切线”

  • 绿色竖箭头:关于 x 轴的镜像(取负号)

    • 若点是 (x,y),那么 −P=(x,−y)(在有限域里是


1) 图中一步步在算什么:G→2G→4G→8G

A. 从 G 得到 2G

  1. 在点G处画切线(图中上方那条蓝线的方向)。

  2. 这条切线会再次交椭圆曲线于一个点,图上标成−2G(注意是负号)。

  3. 再沿绿色竖箭头把 −2G关于 x 轴翻到对称点,就得到2G

这就是倍点公式的几何版本:


B. 从 2G 得到 4G

同样套路:

  1. 2G处画切线(图中那条斜着的大蓝线)。

  2. 切线再次交曲线于−4G(图上标的 −4G)。

  3. 绿色竖箭头把 −4G翻过去得到4G


C. 从 4G 得到 8G

  1. 4G处画切线(图下方较短的蓝线)。

  2. 得到交点−8G(图上标的 −8G)。

  3. 绿色竖箭头翻过去得到8G


2) 这就是“标量乘法”的核心:用二进制不断倍点

你现在已经在图里“预计算”出了:

它们对应二进制权重:

1,2,4,8

所以任意 kkk 都能写成二进制:

算法上就是Double-and-Add

  • 从最高位往低位扫:每一位都做一次Double(结果翻倍)

  • 如果该位是 1,再做一次Add(把对应的加进去)

举个直接用图里点的例子:
如果,那

13G=8G+4G+G

你先用倍点得到 8G,再把 4G 和 G依次加进去就行。


3) 图里“负号”为啥这么重要?

因为椭圆曲线的加法规则是:

  • 直线与曲线的第三个交点,得到的是“和的相反数”

  • 所以最后要做一次关于 x 轴的翻转(绿色箭头)才能得到真正的和

这就是图里每次都会出现 −2G,−4G,−8,然后再翻成 2G,4G,8G 的原因。

下面我用一个**玩具椭圆曲线(小素数域)**把图里的 Double-and-Add 真正算一遍,让你看到每一步的点坐标怎么变。


0)我们要算什么?

椭圆曲线里的标量乘法:给定点 P 和整数 n,计算

直接加 n−1 次太慢,所以用Double-and-Add(倍加法)

  • Double:倍点 Q←2Q

  • Add:如果该二进制位是 1,就累加 R←R+Q


1)点加/倍点公式(在有限域上)

设曲线:

单位元是无穷远点 O(相当于“0”)。

点加

(当​,且不是互为相反点)

除法在模 p下就是乘以逆元:

倍点

然后同样算 x3,y3​。


2)选一个“玩具曲线”和点

我们选素数 p=211,曲线:

取点:

P=(152,176)

它确实在曲线上,因为:

  • 左边

  • 右边


3)按照图里的例子:算 151P

先把 151 写成二进制:

所以:

这正对应图里气泡说的:中间结果像 16P+4P+2P+P,最后再补一个 128P。


4)先用“不断倍点”得到 P,2P,4P,…,128P

从 P 一直倍点(每次Double)得到:

  • P=(152,176)

  • 2P=(167,141)

  • 4P=(73,120)

  • 8P=(102,101)

  • 16P=(50,24)

  • 32P=(44,48)

  • 64P=(90,12)

  • 128P=(83,203)

(这些都是真按上面的模逆+公式算出来的。)


5)真正执行 Double-and-Add(从低位到高位,和图的风格一致)

151 的二进制从最低位到最高位是:

[1,1,1,0,1,0,0,1]

流程:初始化 R=O,当前倍数点 Q=P。每处理一位:

  • 若 bit=1:R←R+Q

  • 然后 Q←2Q(准备下一位)

下面是每一步的实际点坐标

位ibit当前是否加进 R新的 R
01P=(152,176)R=(152,176)
112P=(167,141)R=(85,160)
214P=(73,120)R=(111,105)
308P=(102,101)不加R=(111,105)
4116P=(50,24)R=(47,63)
5032P=(44,48)不加R=(47,63)
6064P=(90,12)不加R=(47,63)
71128P=(83,203)R=(31,93)

因此最终:

顺带一提:图里气泡的“中间结果”

在这个玩具曲线上确实就是:

然后最后再加 128P 得到 151P。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 12:14:40

突破C++编程瓶颈:Accelerated C++高效学习指南

突破C编程瓶颈:Accelerated C高效学习指南 【免费下载链接】AcceleratedC中文英文两版高清下载介绍 Accelerated C 是一本备受推崇的编程书籍,专为具备C或C基础的读者设计,旨在快速提升编程水平。通过高效的讲解方式,本书深入浅出…

作者头像 李华
网站建设 2026/7/13 23:04:23

从零搭建萌系电商站:快马AI开发实录

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个萌系风格的电商网站原型,包含以下功能:1.商品展示区(至少5个动漫周边商品)2.购物车系统 3.简易支付接口 4.用户评价模块。要…

作者头像 李华
网站建设 2026/7/14 8:05:21

告别Postman:Hoppscotch如何节省开发者50%的API调试时间

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个Hoppscotch效率工具包,包含:1. 快捷键速查表 2. 常用请求模板库 3. 自动环境变量管理 4. 批量请求测试功能 5. 响应差异对比工具。实现为浏览器插件…

作者头像 李华
网站建设 2026/7/14 22:45:26

17、Windows PowerShell 变量操作与数组使用全解析

Windows PowerShell 变量操作与数组使用全解析 1. 变量赋值与自增操作 在 Windows PowerShell 中,变量赋值和自增操作有其独特的规则。首先,使用如下命令将变量 $a 设置为 10: $a = 10接着,输入命令 $b = $a++ ,此命令会先将 $a 的当前值赋给 $b ,然后再将 …

作者头像 李华
网站建设 2026/7/14 3:19:56

1小时用$emit打造TodoList原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 快速开发一个TodoList应用原型,要求:1)使用Vue3 Composition API;2)通过$emit实现添加新任务、切换完成状态、删除任务功能;3)包含本…

作者头像 李华
网站建设 2026/7/15 11:20:36

22、深入探索 .NET 对象:PowerShell 实用指南

深入探索 .NET 对象:PowerShell 实用指南 在使用 .NET 框架进行开发或系统管理时,我们经常需要创建新的 .NET 对象,并对这些对象的属性进行检查、修改,或者调用其方法来执行特定任务。对于刚接触 .NET 框架的人来说,熟悉各种 .NET 类的成员是一项重要的学习任务。PowerShe…

作者头像 李华