如何从33个字节重构33个字节的压缩NIST P-256公钥? [英] How to reconstruct 33-byte compressed NIST P-256 public key from 33 bytes?
问题描述
假设可以像这样创建33字节编码的公钥:
Supposed that the 33 bytes encoded Public Key can be created like this:
Security.addProvider(provider)
val generator = KeyPairGenerator.getInstance("ECDSA")
val ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1")
generator.initialize(ecSpec)
val keyPair = generator.generateKeyPair()
val privateKey = keyPair.private as ECPrivateKey
val publicKey = keyPair.public as ECPublicKey
val publicEncoded = publicKey.q.getEncoded(true)
如何从另一侧重新构建它(当我仅从此处发送33个字节时)?
How can I reconstruct it again on the other side (when I am having only the 33 bytes sent from here)?
我正在尝试以下代码:
val publicKey =KeyFactory.getInstance("EC").generatePublic(X509EncodedKeySpec(publicEncoded))
但是我想这是完全错误的,因为我得到了:
But I guess this is totally wrong, as I am getting the:
java.security.spec.InvalidKeySpecException:java.lang.RuntimeException:错误:0c000079:ASN.1编码例程:OPENSSL_internal:HEADER_TOO_LONG
java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0c000079:ASN.1 encoding routines:OPENSSL_internal:HEADER_TOO_LONG
我也在尝试:
val generator = KeyPairGenerator.getInstance("ECDSA")
val ecPublicKey = generator
.generatePublic(X509EncodedKeySpec((publicEncoded))) as ECPublicKey
但是错误是:
java.security.spec.InvalidKeySpecException:无法识别编码的密钥规范
java.security.spec.InvalidKeySpecException: encoded key spec not recognised
如何实现我的目标?
推荐答案
这应该可以完成:
import org.bouncycastle.jce.ECNamedCurveTable
import org.bouncycastle.jce.spec.ECPublicKeySpec
fun publicKeyFromCompressed(compressedPublicKey: ByteArray): PublicKey {
val ecSpec = ECNamedCurveTable.getParameterSpec("secp256r1")
val point = ecSpec.curve.decodePoint(compressedPublicKey)
val publicKeySpec = ECPublicKeySpec(point, ecSpec)
val keyFactory = KeyFactory.getInstance("ECDSA")
val publicKey = keyFactory.generatePublic(publicKeySpec)
return publicKey
}
这篇关于如何从33个字节重构33个字节的压缩NIST P-256公钥?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!