如何在Java中的curve1174中计算倍数?

问题描述 投票:0回答:1

很难找到关于它的文档,所以我在这里。

我正在尝试在Java中将Curve1174加倍,但是存在问题。当我使用BigInteger时,它会给我(0,0)当我使用BigDecimal时,它给出的是

    Exception in thread “main” java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

我知道我必须使用除法(blabla,length,RoundingMode),但是作为标准我不知道确切的长度是什么。

我的代码在下面,您能帮我吗,我已经考虑了3天,所以我快要疯了。

BigInteger代码

    public class ECCprocess {
    // C1174

    // COSTRUCTOR
    public static ECPoint operate(ECPoint point1,ECPoint point2){
        ECPoint resultPoint;
        BigInteger resultX;
        BigInteger resultY;

        CONSTANTlist constantList = new CONSTANTlist();

        BigInteger calculating1 = point1.getAffineX().multiply(point2.getAffineY());
        BigInteger calculating2 = point2.getAffineX().multiply(point1.getAffineY());
        BigInteger calculating3 = ((BigInteger)constantList.getConstant("dConstant"));
        calculating3 = (calculating3.multiply(point1.getAffineX().multiply(point2.getAffineX()).multiply(point1.getAffineY()).multiply(point2.getAffineY()))).add(new BigInteger("1"));
        resultX = (calculating1.add(calculating2)).divide(calculating3);

        calculating1 = point1.getAffineY().multiply(point2.getAffineY());
        calculating2 = point1.getAffineX().multiply(point2.getAffineX());
        calculating3 = ((BigInteger)constantList.getConstant("dConstant")).multiply(point1.getAffineX()).multiply(point1.getAffineY()).multiply(point2.getAffineX()).multiply(point2.getAffineY());
        calculating3 = (new BigInteger("1")).subtract(calculating3);
        resultY = (calculating1.subtract(calculating2)).divide(calculating3);

        resultX = resultX.remainder((BigInteger)constantList.getConstant("pConstant"));
        resultY = resultY.remainder((BigInteger)constantList.getConstant("pConstant"));
        resultPoint = new ECPoint(resultX, resultY);

        return resultPoint;
    }
}

大十进制代码

    public class ECCprocess2 {
    // C1174

    public static ECCpoint operate(ECCpoint point1,ECCpoint point2){
        ECCpoint resultPoint;
        BigDecimal resultX;
        BigDecimal resultY;

        CONSTANTlist constantList = new CONSTANTlist();

        point1.setX(point1.getX().remainder((BigDecimal) constantList.getConstant("pConstant")));
        point1.setY(point1.getY().remainder((BigDecimal) constantList.getConstant("pConstant")));
        point2.setX(point2.getX().remainder((BigDecimal) constantList.getConstant("pConstant")));
        point2.setY(point2.getY().remainder((BigDecimal) constantList.getConstant("pConstant")));


        BigDecimal calculating1 = point1.getX().multiply(point2.getY());
        BigDecimal calculating2 = point2.getX().multiply(point1.getY());
        BigDecimal calculating3 = ((BigDecimal)constantList.getConstant("dConstant")).multiply(point1.getX().multiply(point1.getY()).multiply(point2.getX()).multiply(point2.getY()));
        resultX = (calculating1.add(calculating2)).divide(calculating3.add(new BigDecimal("1")),100,RoundingMode.HALF_EVEN);

        calculating1 = point1.getY().multiply(point2.getY());
        calculating2 = point1.getX().multiply(point2.getX());
        calculating3 = ((BigDecimal) constantList.getConstant("dConstant")).multiply(point1.getX().multiply(point1.getY()).multiply(point2.getX()).multiply(point2.getY()));
        calculating3 = (new BigDecimal("1")).subtract(calculating3);
        resultY = (calculating1.subtract(calculating2)).divide(calculating3,100,RoundingMode.HALF_EVEN);

        resultX = resultX.remainder((BigDecimal)constantList.getConstant("pConstant"));
        resultY = resultY.remainder((BigDecimal)constantList.getConstant("pConstant"));
        resultPoint = new ECCpoint(resultX, resultY);
        return resultPoint;

    }

}

顺便说一下,这是我与BigDecimal一起使用的类

    public class ECCpoint {
    private BigDecimal x;
    private BigDecimal y;
    private ECPoint point;

    // CONSTRUCTOR
    public ECCpoint(BigDecimal x,BigDecimal y){
        setX(x);
        setY(y);
    }

    // GETTERS
    public BigDecimal getX(){
        return this.x;
    }
    public BigDecimal getY(){
        return this.y;
    }

    // SETTERS
    public void setX(BigDecimal x){
        this.x = x;
    }
    public void setY(BigDecimal y){
        this.y = y;
    }
}

这是我的主要功能及其确切输出

    public static void main(String[] args) throws Exception {

        ECCpoint result;
        ECCpoint point = new ECCpoint(new BigDecimal("2025"), new BigDecimal("588747530266665079407582947937120321357732884331117971504880828350684014295"));
        result = ECCprocess2.operate(point, point);
        System.out.println(result.getX());
        System.out.println(result.getY());


   }

    run:
-1.4289195326809714896E-81
2.077216903248689341047078303547341201311658613556384884404177594774968601568246831530179235E-10
BUILD SUCCESSFUL (total time: 0 seconds)
java cryptography biginteger bigdecimal curve
1个回答
1
投票

您应该为此使用BigInteger,而不是BigDecimal。但是请记住,这里的除法是现场的模数除法,而不是常规除法。这与乘以模逆的乘法相同。

在您的代码中,更改执行除法的两行应会为您提供所需的内容。

变更

resultX = (calculating1.add(calculating2)).divide(calculating3);

类似

resultX = (calculating1.add(calculating2)).multiply(calculating3.modInverse(p));

其中p定义为(即,它是字段素数)]

BigInteger p = (BigDecimal) constantList.getConstant("pConstant");

类似变化

resultY = (calculating1.subtract(calculating2)).divide(calculating3);

resultY = (calculating1.subtract(calculating2)).multiply(calculating3.modInverse(p));
© www.soinside.com 2019 - 2024. All rights reserved.