使用Pycryptodome实现ECC独立生成元的Try-and-Increment方法遇阻求助
用Pycryptodome创建NIST256曲线的独立生成元
一、获取曲线参数重构方程的正确方式
不用碰Pycryptodome的私有属性,ECC曲线的核心参数都是公开可访问的:
- 先拿到NIST256P曲线对象:
curve = ECC.generate(curve='P-256').curve - 直接通过
curve.p(素数模)、curve.a、curve.b获取椭圆曲线方程y² ≡ x³ + a*x + b mod p的所有参数,这些都是官方暴露的公开属性,完全合法。
有了这些参数,就能根据x坐标计算对应的y值了。
二、Try-and-Increment方法的完整实现
按照你提出的思路,结合Pycryptodome的工具可以直接写出可运行代码,步骤如下:
- 绑定上下文信息(比如投票协议标识),避免生成的点和其他场景冲突
- 循环生成x坐标,验证是否对应曲线上的点,直到找到符合要求的生成元
代码示例:
from Cryptodome.PublicKey import ECC from Cryptodome.Hash import SHA256 from Cryptodome.Util.number import sqrt_mod # 初始化NIST256P曲线和默认生成元 curve = ECC.generate(curve='P-256').curve default_G = curve.generator # 上下文标识,可根据你的投票协议自定义 context = b"voting_system_secondary_generator" counter = 0 target_generator = None while target_generator is None: # 拼接上下文和计数器,哈希后生成x坐标 hash_input = context + counter.to_bytes(4, byteorder='big') x_hash = SHA256.new(hash_input).digest() x = int.from_bytes(x_hash, byteorder='big') % curve.p # 计算y² mod p y_squared = (pow(x, 3, curve.p) + curve.a * x + curve.b) % curve.p # 用勒让德符号判断是否为二次剩余 legendre_symbol = pow(y_squared, (curve.p - 1) // 2, curve.p) if legendre_symbol == 1: # 用Tonelli-Shanks算法求y的平方根 y = sqrt_mod(y_squared, curve.p) # 实例化候选点 candidate = ECC.EccPoint(x, y, curve=curve) # 验证点的有效性:首先排除无穷远点 if candidate.is_point_at_infinity(): counter += 1 continue # 验证点的阶是否等于曲线阶(确保是生成元) if (candidate * curve.order).is_point_at_infinity(): # 验证与默认生成元线性无关:检查半阶乘积是否不同 half_order = curve.order // 2 if (candidate * half_order) != (default_G * half_order): target_generator = candidate break counter += 1 print("生成的独立生成元:", target_generator)
三、其他可选实现方法
除了Try-and-Increment,还有两种更实用的方式:
- 哈希到曲线(Hash-to-Curve):遵循RFC 9380标准,直接将上下文哈希映射到曲线上的点,比Try-and-Increment效率更高,且有严格的安全性证明。Pycryptodome虽然没有内置实现,但可以基于现有数学工具自行编码。
- 随机点筛选:直接随机生成x坐标,计算y并验证是否在曲线上,直到找到符合要求的点。这种方法不需要绑定上下文,适合对生成元没有场景关联要求的情况。
四、关于Pycryptodome的能力说明
Pycryptodome完全支持创建自定义的ECC生成元,只要你能提供合法的(x,y)坐标和对应曲线对象。之前的问题是没找到正确获取曲线参数的方式,只要用公开暴露的curve.a、curve.b、curve.p这些属性,就可以顺利计算出合法点,不存在无法创建独立生成元的限制。
内容的提问来源于stack exchange,提问作者TP0G
相关产品推荐
相关产品推荐

