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