首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web3j ECKeyPair to KeyPair

Web3j ECKeyPair to KeyPair
EN

Stack Overflow用户
提问于 2019-05-20 05:53:59
回答 1查看 1.3K关注 0票数 0

我正在尝试使用web3j使用生成的密钥生成一个ECC。我有ECKeyPair对象,但是cipher.init()需要第二个参数才能成为Key对象。ECKeyPair返回私钥和公钥的BigInteger,如何将它们转换为包含PrivateKeyPublicKey对象的KeyPair

我尝试过(参考:CryptoUtil.java):

代码语言:javascript
复制
private fun decodeKeyPair(ecKeyPair: ECKeyPair): KeyPair {
        val xp = getNamedCurveByName("secp256k1")
        val p = ECNamedCurveSpec("secp256k1", xp.curve, xp.g, xp.n, xp.h, null)
        val curve = convertCurve(p.curve)
        val g = EC5Util.convertPoint(curve, p.generator, false)
        val n = p.order
        val h = BigInteger.valueOf(p.cofactor.toLong())
        val dp = ECDomainParameters(curve, g, n, h)

        val bytes = Numeric.toBytesPadded(ecKeyPair.publicKey, 64)
        val x = Numeric.toBigInt(Arrays.copyOfRange(bytes, 0, 32))
        val y = Numeric.toBigInt(Arrays.copyOfRange(bytes, 32, 64))
        val q = curve.createPoint(x, y)
        val publicKey = BCECPublicKey(
           "EC",
            ECPublicKeyParameters(q, dp),
            BouncyCastleProvider.CONFIGURATION
        )
        val privateKey = BCECPrivateKey(
            "EC",
            ECPrivateKeyParameters(ecKeyPair.privateKey, dp),
            publicKey,
            p,
            BouncyCastleProvider.CONFIGURATION
        )
        return KeyPair(publicKey, privateKey)
    }

但是这会返回一个错误:Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'org.bouncycastle.math.ec.ECCurve org.bouncycastle.jce.spec.ECParameterSpec.getCurve()' on a null object reference

还有其他方法将Web3j ECKeyPair转换为KeyPair吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-20 11:10:15

在浏览了https://www.programcreek.com之后,我终于得到了它。这里的主要内容是“如何使用公钥字符串生成ECPoint”。

我是这样做的,而不是转换整个EcKeyPair对象,而是分别转换键。

ECPublicKey的公钥字符串

代码语言:javascript
复制
private fun toEcPublicKey(publicKey: String): ECPublicKey {
        val params = ECNamedCurveTable.getParameterSpec("secp256k1")
        val curveSpec = ECNamedCurveSpec("secp256k1", params.curve, params.g, params.n)

        //This is the part how to generate ECPoint manually from public key string.
        val pubKeyX = publicKey.substring(0, publicKey.length / 2)
        val pubKeyY = publicKey.substring(publicKey.length / 2)
        val ecPoint = ECPoint(BigInteger(pubKeyX, 16), BigInteger(pubKeyY, 16))

        val params2 = EC5Util.convertSpec(curveSpec.curve, params)

        val keySpec = java.security.spec.ECPublicKeySpec(ecPoint, params2)
        val factory = KeyFactory.getInstance("ECDSA")
        return factory.generatePublic(keySpec) as ECPublicKey
}

ECPrivateKey的私钥字符串

代码语言:javascript
复制
private fun toEcPrivateKey(privateKey: String): ECPrivateKey {
        val ecKeyPair = ECKeyPair.create(Numeric.hexStringToByteArray(privateKey))

        val params = ECNamedCurveTable.getParameterSpec("secp256k1")
        val curveSpec = ECNamedCurveSpec("secp256k1", params.curve, params.g, params.n)

        val keySpec = java.security.spec.ECPrivateKeySpec(
            ecKeyPair.privateKey,
            curveSpec)

        val factory = KeyFactory.getInstance("ECDSA")
        return factory.generatePrivate(keySpec) as ECPrivateKey
}

字符串键输入是从Web3j库生成的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56215012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档