python-3.x 用Pycyptodome创建ECC生成器的尝试和增量方法

ohtdti5x  于 2023-05-19  发布在  Python
关注(0)|答案(1)|浏览(189)

我正在使用pycyptodome包来实现一个加密投票协议。我正在使用Nist 256曲线,并希望创建第二个生成器,独立于默认生成器,即。与标量乘法无关。
常见的方法是使用try-and-increment方法(如果有其他方法可以与pycyptodome一起使用,请告诉),基本上包括:
1.用特定于上下文的信息和一些填充来创建一些唯一的散列。将其视为生成器的x坐标。
1.用曲线方程求点的等效y坐标
1.如果这个点在曲线上,那么你就找到了一个新的生成器。如果该点不在曲线上,则增加填充并返回步骤1。
我遇到的问题是,如果不知道x和y坐标,我就不能示例化一个pyccryptodome EccPoint。我无法根据曲线方程计算出y坐标是什么,因为我无法使用私有EccCurve._curve属性中的参数重新生成曲线方程。
_curve属性包含p、b、order、默认生成器和一些其他信息。我不知道如何从这些信息中重建曲线方程,有没有办法做到这一点?
也许有一个更好的方式去做这件事,我错过了?或者也许它只是不可能创建第二个独立的生成器使用pycyptodome?
非常感谢您的任何投入。

wb1gzix0

wb1gzix01#

可能有很多软件包可以做到这一点,甚至可能是pyccryptodome。这个例子使用的一个相对简单的例子是ECpy package。这里有一个例子,灵感来自我对您的需求的理解。它使用了一个名为y_recover(x)的椭圆曲线对象的方法,如果(x,y)是曲线上的点,则返回int y,否则返回None

import hashlib

from ecpy.curves import Curve

curve = Curve.get_curve('secp256r1')
base_info = b'some fixed or domain-specific byte sequence'
padding = 0

num_new_points = 5
for i in range(num_new_points):
    while True:
        x_bytes = hashlib.sha256(base_info + padding.to_bytes(4, 'big')).digest()
        x = int.from_bytes(x_bytes, 'big') % curve.field
        y = curve.y_recover(x)
        padding += 1
        if y:
            print(f'({x}, {y}) is on the curve')
            break

相关问题