- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 web3j 使用生成的 key 创建 ECC。我有 ECKeyPair对象,但 cipher.init() 要求第二个参数是 Key 对象。 ECKeyPair返回私钥和公钥的 BigInteger
,如何将它们转换为包含 PrivateKey
和 PublicKey
对象的 KeyPair
?
我已经尝试过(引用: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)
}
但这会返回一个错误:引起:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“org.bouncycaSTLe.math.ec.ECCurve org.bouncycaSTLe.jce.spec.ECParameterSpec.getCurve()”
还有没有其他方法可以转换Web3j ECKeyPair到 key 对
?
最佳答案
在探索了https://www.programcreek.com之后我终于得到了它。 。这里的主要内容是“如何使用公钥字符串生成 ECPoint”。
这是我的做法,我没有转换整个 EcKeyPair
对象,而是单独转换 key 。
公钥字符串到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
}
私钥字符串到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
}
字符串键输入是从 Web3j 生成的图书馆。
关于java - Web3j ECKeyPair 到 KeyPair,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56215012/
我正在尝试使用 web3j 使用生成的 key 创建 ECC。我有 ECKeyPair对象,但 cipher.init() 要求第二个参数是 Key 对象。 ECKeyPair返回私钥和公钥的 Big
我是一名优秀的程序员,十分优秀!