[英]Web3j ECKeyPair to KeyPair
I'm trying to make an ECC with the generated key using web3j. 我正在尝试使用web3j使用生成的密钥创建ECC。 I have the ECKeyPair object, but
cipher.init()
requires 2nd parameter to be Key
object. 我有ECKeyPair对象,但
cipher.init()
要求第二个参数是Key
对象。 ECKeyPair returns BigInteger
of private key and public key, how can I convert them to KeyPair
which holds PrivateKey
and PublicKey
object? ECKeyPair返回私钥和公钥的
BigInteger
,如何将它们转换为包含PrivateKey
和PublicKey
对象的KeyPair
?
I've tried (reference: CryptoUtil.java ): 我试过了(参考: CryptoUtil.java ):
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)
}
but this returns an error: 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
但是这会返回一个错误:
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
Is there any other way to convert Web3j ECKeyPair to KeyPair
? 有没有其他方法将Web3j ECKeyPair转换为
KeyPair
?
I finally got it after exploring around https://www.programcreek.com . 我在探索https://www.programcreek.com后终于得到了它。 Main thing here was "how to generate ECPoint using the public key string".
这里的主要内容是“如何使用公钥字符串生成ECPoint”。
Here's how I did it, instead of transforming the whole EcKeyPair
object, I convert the keys separately. 这是我如何做到的,而不是转换整个
EcKeyPair
对象,我分别转换键。
Public Key String to ECPublicKey
: ECPublicKey
公钥字符串:
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
}
Private Key String to ECPrivateKey
: ECPrivateKey
私钥字符串:
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
}
String key inputs are generated from Web3j library. 字符串键输入是从Web3j库生成的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.