私鑰是隨機生成的,不與任何錢包關聯。我想為比特幣準備公鑰生成的自定義(簡單)實現。然而,經過幾次嘗試,我的結果是不正確的。我將它們與在線生成器進行了比較。我發現我使用了除法而不是 modinv。不幸的是,在將 division 更改為 modinv 之后,我得到了“java.lang.ArithmeticException: BigInteger not invertible.”。我厭倦了關注https://www.mobilefish.com/services/cryptocurrency/cryptocurrency.html#refProdedure和https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication你能幫我認出我在哪里做錯了嗎?public class ECDSAUtils { private static final CurvePoint G = new CurvePoint(new BigInteger("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", 16), new BigInteger("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", 16)); private static CurvePoint zero; private static BigInteger base; private static final BigInteger three = new BigInteger("3", 10); public static void main(String[] args){ ECDSAUtils e = new ECDSAUtils(); BigInteger privateKey = new BigInteger("fdc668381ab251673ef8552851a2c7cf346a6e09ea86be0f55a94d2a12253557", 16); CurvePoint r = e.mult(G, privateKey); System.out.println(r.x.toString(16).toUpperCase() + " " + r.y.toString(16).toUpperCase()); } public ECDSAUtils(){ zero = new CurvePoint(new BigInteger("0", 16), new BigInteger("0", 16)); base = new BigInteger("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", 16); } public static CurvePoint add(CurvePoint p, CurvePoint q){ CurvePoint result = null; if (p.equals(zero)){ result = q; } else if (q.equals(zero)){ result = p; } else { BigInteger lambda = q.y.subtract(p.y).modInverse(q.x.subtract(p.x)).mod(base); BigInteger x = lambda.multiply(lambda).subtract(p.x).subtract(q.x).mod(base); BigInteger y = lambda.multiply(p.x.subtract(x)).subtract(p.y).mod(base); result = new CurvePoint(x, y); } return result;
添加回答
舉報
0/150
提交
取消