区块链研习社

bitcoinj库的Hex类型私钥生成公钥java实现-sawt

2018-08-14  本文已影响7人  ywandy
From Myblog: ywandy.github.io import this   

From Myblog: yeweiandy.coding.me import this 

分析

按照以上的调用,通过readWif(String wif) 把私钥导入,确实能够生成以上对应的公钥,也证明了bitcoinj库是没有任何问题

私钥 :'20f34219eed055a8292767876e97cedc681cdee65f8d100f0c192d0b61cb13d6'  

公钥 :'02fe868857f1dcb31137b34c55cf1b6e031447b5fe7902e49a083eaf95c54aaecf'

解决方法:

  1. 我们首先观察example里面的Signing 类,发现里面调用的方法都是来自于ECKey这个类的,通过分析,首先在ECKey类里面的私钥都是使用BigInteger表示的,而我们sawtooth keygen生成的私钥是16位Hex格式的String
  2. 因此我们需要使用方法把导入的String从16位Hex读入再变成BigInteger对象,再使用ECKey的fromPrivate((BigInteger privKey)方法,由BigInteger对象生成一个ECKey的对象。
    具体的fromPrivate()方法如下:
    public static ECKey fromPrivate(BigInteger privKey) {
        return fromPrivate(privKey, true);
    }
  1. 最后通过getPublicKeyAsHex()方法即可得到由16位hex编码的String 公钥

具体实现代码:

public static String getPublicKeyFromHex(String key){
    BigInteger privateKeyBigInt = new BigInteger(key,16);
    ECKey privateKey = ECKey.fromPrivate(privateKeyBigInt);
    return privateKey.getPublicKeyAsHex();
}

实现的例子:

import org.bitcoinj.core.ECKey;
import java.math.BigInteger;

public class main {
    public static String getPublicKeyFromHex(String key){
        BigInteger privateKeyBigInt = new BigInteger(key,16);
        ECKey privateKey = ECKey.fromPrivate(privateKeyBigInt);
        return privateKey.getPublicKeyAsHex();
    }

    public static void main(String[] args) {

        //此处我输入我上文提到的公钥
        String privateKeyStr = "20f34219eed055a8292767876e97cedc681cdee65f8d100f0c192d0b61cb13d6";
        System.out.println(getPublicKeyFromHex(privateKeyStr));
    }
}
02fe868857f1dcb31137b34c55cf1b6e031447b5fe7902e49a083eaf95c54aaecf
上一篇下一篇

猜你喜欢

热点阅读