java - 椭圆曲线加密

标签 java bouncycastle elliptic-curve

请为我提供一个使用 BouncycaSTLe 库的示例,展示如何在椭圆曲线上添加两个点。

我尝试了以下代码,但没有得到理论上应该发生的相同结果。

   X9ECParameters x9=NISTNamedCurves.getByName("P-224");
   ECCurve curve=x9.getCurve();
   ECFieldElement x1=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("8"));
   ECFieldElement y1=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("9"));
   ECPoint.Fp p1=new ECPoint.Fp(curve, x1, y1);
   ECFieldElement x2=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("5"));
   ECFieldElement y2=new ECFieldElement.Fp(new BigInteger("10"), new BigInteger("6"));
   ECPoint.Fp p2=new ECPoint.Fp(curve, x2, y2);
   p2=(ECPoint.Fp) p1.add(p2);
   System.out.println(p2.getX().toBigInteger()+" "+p2.getY().toBigInteger());

而且我也不明白为 ECFiledElement 中的第一个 BigInteger 提供什么值。

最佳答案

你的例子根本没有意义,所以很难理解你认为结果应该是什么。通过使用像 ECFieldElement 这样的低级类,您将承担提供合理参数的全部责任。您已选择 NIST 曲线 P-224。该椭圆曲线是在特定字段上定义的。您可以检索此有限域的素数“q”,并使用它通过以下方式创建域元素(与您的示例不同):

    X9ECParameters x9 = NISTNamedCurves.getByName("P-224");
    ECCurve.Fp curve = (Fp) x9.getCurve();
    BigInteger q = curve.getQ();
    ECFieldElement x1 = new ECFieldElement.Fp(q, new BigInteger("8"));
    ECFieldElement y1 = new ECFieldElement.Fp(q, new BigInteger("9"));

ECFieldElement.Fp 构造函数的第一个参数是定义字段的素数。

您的示例的第二个问题是,并非每对 (x,y) 整数都是椭圆曲线上的点。随机 (x,y) 出现在 P-224 上的机会非常小。再次强调,通过扰乱低级 EPoint 类,BouncycaSTLe 不会为您检查这一点。因此,虽然您可以运行椭圆曲线加法软件的机制并给出答案,但这些答案毫无意义。

为了取得更多进展,我必须首先问:你想做什么?

在椭圆曲线上查找点

在椭圆曲线上查找点有两种基本方法。

  1. 取曲线上现有的已知点并将标量乘以整数。结果是曲线上的另一个点。
  2. 选择一个 x 坐标,例如 x1。将其插入 elliptic curve formula 的右侧得到 y12 = E(x1)。然后尝试计算字段中的平方根。如果平方根存在,那么您将得到两个点 (x1, y1) 和 (x1,-y1 )位于曲线上。如果平方根不存在,则曲线上不存在 x 坐标为 x1 的点。

您可以通过以下方式获得椭圆曲线上的一个点:ECPoint.Fp = (ECPoint.Fp)x9.getG(); 您可以将该点乘以一个带有ECPoint 的整数。乘法(...)

使用方法 #2 比使用 BouncycaSTLe 更难。所有方法都位于 ECPoint 和 ECFieldElement 类中。 ECFieldElement 类包含一个公共(public)平方根方法,您可以使用该方法来尝试计算平方根。如果返回 null,则平方根不存在。

关于java - 椭圆曲线加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6648166/

相关文章:

java - PKCS#7 登录并验证签名

java - BouncyCaSTLe 是否有 SecureRandom 服务?

java - Java 中的椭圆曲线私钥长度

java - 使用 bouncycaSTLe 进行椭圆曲线加点

java - "map = new HashMap<>()"什么时候被调用?

java - 制作java CRUD应用程序的最简单方法

java - weblogic Server10.6中EJB定时器异常

java - 如何在 for 循环中使用 getIndices ?

java - 如何使用 bouncycaSTLe 解析 ASN1 数据