BigInteger 作为中性符号
BigInteger as neutral symbol
我目前正在研究与密码学相关的算法。更具体地说,在椭圆曲线上添加点。有一个选项,我必须处理这样的情况,比如添加一个点,例如 P(x,y) = (1,4) 和一些中性点的符号,例如Q=(e, e)。这种“相加”的结果应该是点(1,4)。它 (e) 不能为零值,因为那时点将是 Q(qx,qy)=(0,0) 并且将激活另一个功能,因此结果也会不同。你能为 BigInteger 分配一个符号吗?
我需要类似
的东西
if(qx == e){
BigInteger r1 = x1;
BigInteger r2 = x2;
}
这是完整的功能:
static void addPoints(BigInteger x1, BigInteger y1, BigInteger x2, BigInteger y2, BigInteger a, BigInteger b, BigInteger p) throws Exception {
BigInteger lambda = null;
BigInteger x3 = null;
BigInteger y3 = null;
if (x1.compareTo(x2) == 0 && y1.compareTo(y2) == 0) { //same points
lambda = (((new BigInteger("3").multiply(x1.pow(2))).add(a))
.multiply(Modul1.getReverseNumber(
(new BigInteger("2").multiply(y1)), p)))
.mod(p);
x3 = ((lambda.pow(2)).subtract(new BigInteger("2").multiply(x1))).mod(p);
y3 = ((lambda.multiply(x1.subtract(x3))).subtract(y1)).mod(p);
} else if (x1.compareTo(x2) != 0) { //points are diffrent
lambda = ((y2.subtract(y1)).multiply(
Modul1.getReverseNumber(x2.subtract(x1), p)
)).mod(p);
x3 = (((lambda.pow(2)).subtract(x1)).subtract(x2)).mod(p);
y3 = ((lambda.multiply(x1.subtract(x3))).subtract(y1)).mod(p);
} else if (x1.compareTo(x2) == 0 && y1.compareTo(p.subtract(y2)) == 0) { //y2 is negate
System.out.println(O);
} else { //Point add Neutral Point
System.out.println("Punkt P + neutral : (" + x1 + "," + y1 + ")");
}
}
我稍微解决了一下。我使用 String 作为函数参数有一点。如果它是无穷大符号,则结果是第一个 Point,否则 null BigInteger 将被赋予此 String 的值。
static void addPoints(BigInteger x1, BigInteger y1, String e1, String e2, BigInteger a, BigInteger b, BigInteger p) throws Exception {
BigInteger lambda = null;
BigInteger x3 = null;
BigInteger y3 = null;
if (e1.equals("e") || e2.equals("e")) {
System.out.println("Punkt P + O to: (" + x1 + "," + y1 + ")");
} else {
BigInteger x2 = new BigInteger(e1);
BigInteger y2 = new BigInteger(e2);
String O = "symbol O";
if (x1.compareTo(x2) == 0 && y1.compareTo(y2) == 0) {
lambda = (((new BigInteger("3").multiply(x1.pow(2))).add(a))
.multiply(Modul1.getReverseNumber(
(new BigInteger("2").multiply(y1)), p)))
.mod(p);
x3 = ((lambda.pow(2)).subtract(new BigInteger("2").multiply(x1))).mod(p);
y3 = ((lambda.multiply(x1.subtract(x3))).subtract(y1)).mod(p);
System.out.println("lamda to: " + lambda);
System.out.println("x3: " + x3);
System.out.println("y3: " + y3);
System.out.println("Punkt P+P = (" + x3 + "," + y3 + ")");
} else if (x1.compareTo(x2) != 0) {
lambda = ((y2.subtract(y1)).multiply(
Modul1.getReverseNumber(x2.subtract(x1), p)
)).mod(p);
x3 = (((lambda.pow(2)).subtract(x1)).subtract(x2)).mod(p);
y3 = ((lambda.multiply(x1.subtract(x3))).subtract(y1)).mod(p);
System.out.println("Punkt P+Q = (" + x3 + "," + y3 + ")");
} else if (x1.compareTo(x2) == 0 && y1.compareTo(p.subtract(y2)) == 0) {
System.out.println("Infinity,Infinity");
}
}
}
我目前正在研究与密码学相关的算法。更具体地说,在椭圆曲线上添加点。有一个选项,我必须处理这样的情况,比如添加一个点,例如 P(x,y) = (1,4) 和一些中性点的符号,例如Q=(e, e)。这种“相加”的结果应该是点(1,4)。它 (e) 不能为零值,因为那时点将是 Q(qx,qy)=(0,0) 并且将激活另一个功能,因此结果也会不同。你能为 BigInteger 分配一个符号吗? 我需要类似
的东西if(qx == e){
BigInteger r1 = x1;
BigInteger r2 = x2;
}
这是完整的功能:
static void addPoints(BigInteger x1, BigInteger y1, BigInteger x2, BigInteger y2, BigInteger a, BigInteger b, BigInteger p) throws Exception {
BigInteger lambda = null;
BigInteger x3 = null;
BigInteger y3 = null;
if (x1.compareTo(x2) == 0 && y1.compareTo(y2) == 0) { //same points
lambda = (((new BigInteger("3").multiply(x1.pow(2))).add(a))
.multiply(Modul1.getReverseNumber(
(new BigInteger("2").multiply(y1)), p)))
.mod(p);
x3 = ((lambda.pow(2)).subtract(new BigInteger("2").multiply(x1))).mod(p);
y3 = ((lambda.multiply(x1.subtract(x3))).subtract(y1)).mod(p);
} else if (x1.compareTo(x2) != 0) { //points are diffrent
lambda = ((y2.subtract(y1)).multiply(
Modul1.getReverseNumber(x2.subtract(x1), p)
)).mod(p);
x3 = (((lambda.pow(2)).subtract(x1)).subtract(x2)).mod(p);
y3 = ((lambda.multiply(x1.subtract(x3))).subtract(y1)).mod(p);
} else if (x1.compareTo(x2) == 0 && y1.compareTo(p.subtract(y2)) == 0) { //y2 is negate
System.out.println(O);
} else { //Point add Neutral Point
System.out.println("Punkt P + neutral : (" + x1 + "," + y1 + ")");
}
}
我稍微解决了一下。我使用 String 作为函数参数有一点。如果它是无穷大符号,则结果是第一个 Point,否则 null BigInteger 将被赋予此 String 的值。
static void addPoints(BigInteger x1, BigInteger y1, String e1, String e2, BigInteger a, BigInteger b, BigInteger p) throws Exception {
BigInteger lambda = null;
BigInteger x3 = null;
BigInteger y3 = null;
if (e1.equals("e") || e2.equals("e")) {
System.out.println("Punkt P + O to: (" + x1 + "," + y1 + ")");
} else {
BigInteger x2 = new BigInteger(e1);
BigInteger y2 = new BigInteger(e2);
String O = "symbol O";
if (x1.compareTo(x2) == 0 && y1.compareTo(y2) == 0) {
lambda = (((new BigInteger("3").multiply(x1.pow(2))).add(a))
.multiply(Modul1.getReverseNumber(
(new BigInteger("2").multiply(y1)), p)))
.mod(p);
x3 = ((lambda.pow(2)).subtract(new BigInteger("2").multiply(x1))).mod(p);
y3 = ((lambda.multiply(x1.subtract(x3))).subtract(y1)).mod(p);
System.out.println("lamda to: " + lambda);
System.out.println("x3: " + x3);
System.out.println("y3: " + y3);
System.out.println("Punkt P+P = (" + x3 + "," + y3 + ")");
} else if (x1.compareTo(x2) != 0) {
lambda = ((y2.subtract(y1)).multiply(
Modul1.getReverseNumber(x2.subtract(x1), p)
)).mod(p);
x3 = (((lambda.pow(2)).subtract(x1)).subtract(x2)).mod(p);
y3 = ((lambda.multiply(x1.subtract(x3))).subtract(y1)).mod(p);
System.out.println("Punkt P+Q = (" + x3 + "," + y3 + ")");
} else if (x1.compareTo(x2) == 0 && y1.compareTo(p.subtract(y2)) == 0) {
System.out.println("Infinity,Infinity");
}
}
}