私は楕円曲線のために私自身のライブラリを作ろうとしています。 一部の機能は動作しますが、一部の機能は動作しません。楕円曲線乗算関数
秘密鍵から公開鍵を計算するには、ジェネレータポイントに秘密鍵を掛けて、別のポイント、公開鍵Point(ECPoint = BigInteger * ECPoint)を取得する必要があります。
私はプライベートキーを持っています。これにSecp256k1カーブのGenerator Pointを乗算します。私は鍵を手に入れますが、それは鍵ではありません。
これは私のJavaコードです:
import java.math.BigInteger;
public class Point{
public static final Point INFINITY = new Point();
private final BigInteger x;
private final BigInteger y;
private Point(){
this.x = null;
this.y = null;
}
public Point(BigInteger x,BigInteger y){
if(x==null || y==null){
throw new NullPointerException("x or y is null");
}
this.x = x;
this.y = y;
}
public BigInteger getX(){
return this.x;
}
public BigInteger getY(){
return this.y;
}
public boolean isInfinite(){
return this.x==null || this.y==null;
}
public Point add(Curve ec,Point Q){
Point P = this;
if(P.isInfinite()){
return Q;
}
if(Q.isInfinite()){
return P;
}
if(P.getX().equals(Q.getX()) && P.getY().equals(Q.getY())){
return this.twice(ec);
}
BigInteger lambda = Q.getY().subtract(P.getY()).divide(Q.getX().subtract(P.getX()));
BigInteger xR = lambda.pow(2).subtract(P.getX()).subtract(Q.getX());
BigInteger yR = lambda.multiply(P.getX().subtract(xR)).subtract(P.getY());
Point R = new Point(xR,yR);
return R;
}
public Point twice(Curve ec){
if(this.isInfinite()){
return this;
}
BigInteger lambda = BigInteger.valueOf(3).multiply(this.getX().pow(2)).add(ec.getA()).divide(BigInteger.valueOf(2).multiply(this.getY()));
BigInteger xR = lambda.pow(2).subtract(this.getX()).subtract(this.getX());
BigInteger yR = lambda.multiply(this.getX().subtract(xR)).subtract(this.getY());
Point R = new Point(xR,yR);
return R;
}
public Point multiply(Curve ec,BigInteger k){
//Point P = this;
//Point R = Point.INFINITY;
if(this.isInfinite()){
return this;
}
if(k.signum()==0){
return Point.INFINITY;
}
BigInteger h = k.multiply(BigInteger.valueOf(3));
Point neg = this.negate();
Point R = this;
for(int i=h.bitLength()-2;i>0;i--){
R = R.twice(ec);
boolean hBit = h.testBit(i);
boolean eBit = k.testBit(i);
if(hBit!=eBit){
R = R.add(ec,(hBit?this:neg));
}
}
return R;
}
public Point negate(){
if(this.isInfinite()){
return this;
}
return new Point(this.x,this.y.negate());
}
}
は私のコードで何かはありますか? secp256k1の特定の乗数アルゴリズムはありますか?
あなたの入力、予想される出力、および現在の出力は何ですか? – tima
入力= 059E2BF5E2C7A4098C164B29A91CF70508D2FD1A256A60656FD2593BDB980FAA /期待出力に含ま= 04 +(DA43096D079CED007CDF810ECB27030FFBDBCCAB0400A5A040D282EF8049805B、A4F8D0BE0BDABE528524245B5BBD5A125835A302F61156CE6BE48530B8F53C66) –