提问者:小点点

为椭圆曲线密码生成椭圆曲线的基点(G)


如何为Java中的椭圆曲线生成基点或生成器?

我正在开发一个Java包,可以用来实现一些椭圆曲线密码算法,我想使用我自己的曲线。然而,我被困在必须为曲线获取生成器基点的点上,这样我就可以拥有域参数集。

任何帮助都非常感谢。


共2个答案

匿名用户

给定“近素数”阶u=kr的椭圆曲线,您应该:

  1. 生成一个随机点P
  2. 设置G=kP
  3. 如果G=0转到1
  4. 验证rG不是0(如果是0,则曲线没有顺序kr)。
  5. 否则G是一个顺序点r

匿名用户

这对java、C或其他什么都是一样的……

让我首先假设您自己创建了一个具有素组顺序q的ECC域,并希望将其用于密码学。然后选择一个随机的x坐标,然后从weerstrass形式的椭圆曲线方程中计算y^2。希望您选择了一个素数模量p,它是3 mod 4。在这种情况下,如果存在,确定平方根mod p是微不足道的。如果它不存在,请尝试另一个x。我很少需要超过2次尝试,主要是第一次尝试导致新创建的域中已经存在有效的生成器。

为此,您可以使用我的开源程序“学术签名”。手册和下载页面的链接。如果您将新域导入域列表,您可以尝试为该域创建任意生成器。导入学术签名时会检查生成器。如果它不是椭圆曲线上的有效点,则增加测试点的x坐标,直到遇到有效的x y坐标对。如果您随后导出域,则新生成器将包含在域参数的明文文件中。

在这个页面上ECC域页面,您可以找到我创建的一些域,我使用上述过程获取包含一些“十六进制文字”的生成器。

如果您没有自己创建域,如果它是素数级的,并且如果您已经在某些实现中使用了一个生成器,那就更容易了:将旧的实现生成器与随机数相乘,您就得到了一个新的生成器,您可以使用它来将您的键空间与其他实现的键空间分开。

迈克尔·安德斯