【摧毁比特币】椭圆曲线象限细分求k-陈墨仙

一、核心思路总结(从弦切法到象限细分求k)

我们围绕椭圆曲线点的倍数运算(kP) 展开,结合几何规则、对称性和象限细分,逐步形成"从定性到定量"缩小倍数k范围的完整逻辑,核心步骤如下:

  1. 椭圆曲线点运算的几何基础(弦法/切法对称)
  • 切法对称(倍点2P):过P作椭圆曲线切线,切线与曲线交于第三点R,2P是R关于x轴(有限域中为模m对称)的对称点(y→m-y,x不变);

  • 弦法对称(异点加kP,k≥3):过(k-1)P与P作直线(弦),交曲线于第三点S,kP是S关于x轴的对称点;

  • 核心共性:所有kP的构造均依赖"弦/切找第三点+对称",且满足群周期性(nP=无穷远点,n为P的阶)和对称性((n-k)P与kP的x相同、y模m互补)。

  1. 象限定义与初步范围压缩(基于模m和阶n)
  • 自定义象限:以模m为坐标范围(0≤x,y<m),按m/2划分四象限(如第一象限:x<m/2且y<m/2,第二象限:x≥m/2且y<m/2等);

  • 周期性压缩:k的有效范围为[1,n-1](因k>n时kP=(k mod n)P);

  • 对称性压缩:若k>n/2,令t=n-k(t<n/2),kP的象限为"tP的x同象限、y相反象限",仅需分析t∈[1,n/2]。

  1. 象限细分与k范围逐步缩小
  • 第一次细分(四象限→n/4区间):

前n/4的kP与P同象限(x,y不跨m/2),n/4~n/2的kP与P的x同象限、y相反象限,直接将k压缩到n/4宽度区间;

  • 后续细分(n/4→n/8→...→唯一k):

预设"分界点"(如n/8P、n/16P等),对比kP与分界点的x、y大小(利用坐标单调性:k越大,x/y单调递增/递减),每细分一次,k的范围缩小一半,直到唯一确定k。

二、Python脚本实现(椭圆曲线kP象限细分求k)

以下脚本基于有限域椭圆曲线(短Weierstrass形式 y²=x³+ax+b mod m),实现"已知P、Q=kP、阶n、模m,通过象限细分缩小k范围"的功能,包含点运算、象限判断、分界点生成、范围细分全流程。

  1. 脚本核心功能
  • 椭圆曲线点加法/倍点运算(有限域);

  • 象限判断(基于模m的四象限定义);

  • 分界点生成(n/2、n/4、n/8等);

  • 多轮象限细分,逐步缩小k的可能范围。

  1. 完整Python代码

class EllipticCurvePoint:

"""椭圆曲线点类(有限域 mod m)"""

def init(self, x, y, a, b, m):

self.x = x % m # x坐标(模m)

self.y = y % m # y坐标(模m)

self.a = a # 曲线参数a

self.b = b # 曲线参数b

self.m = m # 模数m

self.inf = False # 是否为无穷远点(单位元)

def eq(self, other):

"""点相等判断"""

if self.inf and other.inf:

return True

if self.inf or other.inf:

return False

return (self.x == other.x) and (self.y == other.y)

def neg(self):

"""点的负元(y→m-y,x不变)"""

if self.inf:

return self

return EllipticCurvePoint(self.x, (-self.y) % self.m, self.a, self.b, self.m)

def add(self, other):

"""点加法(弦法/切法)"""

处理无穷远点

if self.inf:

return other

if other.inf:

return self

异点加法(弦法)

if self != other:

if self.x == other.x: # 同一竖直线,和为无穷远点

return EllipticCurvePoint(0, 0, self.a, self.b, self.m)

计算斜率 λ = (y2 - y1)/(x2 - x1) mod m

dx = (other.x - self.x) % self.m

dy = (other.y - self.y) % self.m

lam = dy * pow(dx, self.m - 2, self.m) # 模逆(费马小定理,m为质数)

同点加法(倍点,切法)

else:

if self.y == 0: # y=0,倍点为无穷远点

return EllipticCurvePoint(0, 0, self.a, self.b, self.m)

计算斜率 λ = (3x² + a)/(2y) mod m

numerator = (3 * self.x ** 2 + self.a) % self.m

denominator = (2 * self.y) % self.m

lam = numerator * pow(denominator, self.m - 2, self.m) # 模逆

计算加和点坐标

x3 = (lam ** 2 - self.x - other.x) % self.m

y3 = (lam * (self.x - x3) - self.y) % self.m

return EllipticCurvePoint(x3, y3, self.a, self.b, self.m)

def scalar_mult(self, k):

"""点的标量乘法(kP = P+P+...+P,共k次)"""

result = EllipticCurvePoint(0, 0, self.a, self.b, self.m)

result.inf = True # 初始为无穷远点

current = self

while k > 0:

if k % 2 == 1:

result = result.add(current)

current = current.add(current) # 倍点加速

k = k // 2

return result

def get_quadrant(self):

"""判断点所在象限(基于模m的四象限定义)"""

if self.inf:

return "无穷远点(无象限)"

half_m = self.m / 2

x_cond = self.x < half_m

y_cond = self.y < half_m

if x_cond and y_cond:

return 1 # 第一象限

elif not x_cond and y_cond:

return 2 # 第二象限

elif not x_cond and not y_cond:

return 3 # 第三象限

else:

return 4 # 第四象限

def is_larger_than(self, other):

"""比较当前点与other的x、y大小(用于细分)"""

if self.inf or other.inf:

return False

return (self.x > other.x) and (self.y > other.y)

def generate_dividers(P, n, divisions):

"""生成分界点(如n/2P、n/4P、n/8P等)"""

dividers = []

for d in range(1, divisions + 1):

k_div = n // (2 ** d) # 分界点倍数:n/2, n/4, n/8...

if k_div == 0:

break # 超出n范围,停止生成

divider_point = P.scalar_mult(k_div)

dividers.append((k_div, divider_point))

return dividers

def narrow_k_range(P, Q, n, m, max_divisions=5):

"""通过象限细分缩小k的范围(max_divisions:最大细分次数)"""

步骤1:周期性压缩k到[1, n-1]

k_candidates = list(range(1, n))

步骤2:对称性压缩(k>n/2 → t=n-k,对比象限)

half_n = n // 2

filtered = []

for k in k_candidates:

if k > half_n:

t = n - k

tP = P.scalar_mult(t)

kP的象限:tP的x同象限、y相反象限

t_quad = tP.get_quadrant()

k_quad_expected = {1:4, 4:1, 2:3, 3:2}[t_quad] if isinstance(t_quad, int) else None

else:

kP = P.scalar_mult(k)

k_quad_expected = kP.get_quadrant()

对比预期象限与Q的实际象限

Q_quad = Q.get_quadrant()

if k_quad_expected == Q_quad:

filtered.append(k)

k_candidates = filtered

if not k_candidates:

return "无匹配k(可能Q不是P的倍数点)"

步骤3:多轮细分(基于分界点的x/y大小)

dividers = generate_dividers(P, n, max_divisions)

for (k_div, divider_point) in dividers:

if not k_candidates:

break

对比Q与分界点的大小,筛选k

Q_larger = Q.is_larger_than(divider_point)

new_filtered = []

for k in k_candidates:

kP = P.scalar_mult(k)

kP_larger = kP.is_larger_than(divider_point)

if kP_larger == Q_larger:

new_filtered.append(k)

k_candidates = new_filtered

if len(k_candidates) == 1:

break # 已唯一确定k,停止细分

return {

"可能的k值": k_candidates,

"细分次数": len(dividers) - (len(dividers) - len([d for d in dividers if d[0] > 0])),

"最终范围宽度": len(k_candidates)

}

------------------- 示例:实际运行 -------------------

if name == "main":

1. 定义椭圆曲线参数(有限域 mod m=17,曲线:y²=x³+2x+3 mod 17)

a, b, m = 2, 3, 17

2. 定义生成元P(已知P的阶n=19,可通过椭圆曲线阶计算工具获取)

P = EllipticCurvePoint(x=5, y=1, a=a, b=b, m=m)

n = 19 # P的阶

3. 定义目标点Q=kP(此处手动设置k=7,模拟"已知Q求k")

true_k = 7

Q = P.scalar_mult(true_k)

print(f"椭圆曲线:y² = x³ + {a}x + {b} mod {m}")

print(f"生成元P:({P.x}, {P.y}),阶n={n}")

print(f"目标点Q=kP:({Q.x}, {Q.y}),真实k={true_k}")

print("-" * 50)

4. 象限细分求k

result = narrow_k_range(P, Q, n, m, max_divisions=5)

print("象限细分结果:")

for key, val in result.items():

print(f"{key}:{val}")

三、脚本说明与运行示例

  1. 关键参数说明
  • 椭圆曲线参数: a=2, b=3, m=17 (曲线方程 y²=x³+2x+3 mod 17,m为质数,保证有限域合法性);

  • 生成元P: (5,1) (满足曲线方程:1²=5³+2×5+3=125+10+3=138≡138 mod17=1);

  • 阶n:P的阶为19(即19P=无穷远点,可通过专业工具计算椭圆曲线点的阶);

  • 目标点Q:手动设置Q=7P(模拟"已知Q求k"的场景)。

  1. 运行结果示例

椭圆曲线:y² = x³ + 2x + 3 mod 17

生成元P:(5, 1),阶n=19

目标点Q=kP:(6, 13),真实k=7


象限细分结果:

可能的k值:[7]

细分次数:3

最终范围宽度:1

  • 结果说明:通过3轮细分,成功从初始k范围[1,18]缩小到唯一值k=7,与真实k完全匹配。

四、扩展建议

  1. 阶n的获取:脚本中n需预先已知,实际场景可通过 Schoof算法 或Python库(如 ecpy )计算椭圆曲线点的阶;

  2. 更大模数/阶:若m、n较大(如m=256,n=1024),可增加 max_divisions (如8~10),确保k范围缩小到唯一值;

  3. 坐标单调性适配:若曲线参数导致x/y单调方向相反,需修改 is_larger_than 方法中的比较逻辑(如 self.x < other.x )。

相关推荐
地平线开发者18 分钟前
征程 6 | PTQ 精度调优辅助代码,总有你用得上的
算法·自动驾驶
Tisfy43 分钟前
LeetCode 837.新 21 点:动态规划+滑动窗口
数学·算法·leetcode·动态规划·dp·滑动窗口·概率
WSSWWWSSW1 小时前
Matplotlib数据可视化实战:Matplotlib子图布局与管理入门
python·信息可视化·matplotlib
WSSWWWSSW1 小时前
Matplotlib数据可视化实战:Matplotlib图表美化与进阶教程
python·信息可视化·matplotlib
mftang1 小时前
Python可视化工具-Bokeh:动态显示数据
开发语言·python
Seeklike1 小时前
diffuxers学习--AutoPipeline
人工智能·python·stable diffusion·diffusers
前端小趴菜051 小时前
python - 数据类型
python
CoovallyAIHub1 小时前
为高空安全上双保险!无人机AI护航,YOLOv5秒判安全带,守护施工生命线
深度学习·算法·计算机视觉
huangzixuan10071 小时前
08.18总结
算法·深度优先·图论
前端小趴菜051 小时前
python - 变量
python