如何为Java中的椭圆曲线生成基点或生成器?
我正在开发一个Java包,可以用来实现一些椭圆曲线密码算法,我想使用我自己的曲线。然而,我被困在必须为曲线获取生成器基点的点上,这样我就可以拥有域参数集。
任何帮助都非常感谢。
给定“近素数”阶u
=k
r
的椭圆曲线,您应该:
P
G
=k
P
G
=0转到1r
G
不是0(如果是0,则曲线没有顺序k
r
)。r
。
这对java、C或其他什么都是一样的……
让我首先假设您自己创建了一个具有素组顺序q的ECC域,并希望将其用于密码学。然后选择一个随机的x坐标,然后从weerstrass形式的椭圆曲线方程中计算y^2。希望您选择了一个素数模量p,它是3 mod 4。在这种情况下,如果存在,确定平方根mod p是微不足道的。如果它不存在,请尝试另一个x。我很少需要超过2次尝试,主要是第一次尝试导致新创建的域中已经存在有效的生成器。
为此,您可以使用我的开源程序“学术签名”。手册和下载页面的链接。如果您将新域导入域列表,您可以尝试为该域创建任意生成器。导入学术签名时会检查生成器。如果它不是椭圆曲线上的有效点,则增加测试点的x坐标,直到遇到有效的x y坐标对。如果您随后导出域,则新生成器将包含在域参数的明文文件中。
在这个页面上ECC域页面,您可以找到我创建的一些域,我使用上述过程获取包含一些“十六进制文字”的生成器。
如果您没有自己创建域,如果它是素数级的,并且如果您已经在某些实现中使用了一个生成器,那就更容易了:将旧的实现生成器与随机数相乘,您就得到了一个新的生成器,您可以使用它来将您的键空间与其他实现的键空间分开。
迈克尔·安德斯