代码之家  ›  专栏  ›  技术社区  ›  K.Os

如何从33字节重建33字节压缩的NIST P-256公钥?

  •  0
  • K.Os  · 技术社区  · 7 年前

    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个字节时)?

    我正在尝试以下代码:

    val publicKey =KeyFactory.getInstance("EC").generatePublic(X509EncodedKeySpec(publicEncoded))
    

    但我想这是完全错误的,因为我得到了:

    我也在尝试:

    val generator = KeyPairGenerator.getInstance("ECDSA")
    val ecPublicKey = generator
            .generatePublic(X509EncodedKeySpec((publicEncoded))) as ECPublicKey
    

    但错误在于:

    java.security.spec.InvalidKeySpecException:未识别编码密钥规范

    2 回复  |  直到 7 年前
        1
  •  1
  •   Rasmus Faber    7 年前

    这应该可以做到:

    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
    }
    
        2
  •  2
  •   Kiskae    7 年前

    主要的问题是你的 publicEncoded ECPoint ( publicKey.q ). ECPublicKeySpec .

    1. ECNamedCurveTable.getParameterSpec("secp256r1") ecSpec.curve.decodePoint(publicEncoded) 重建不列颠哥伦比亚省 例如。
    2. 转动弹跳船 ECNamedCurveParameterSpec 进入 java.security.spec.ECParameterSpec 还有弹跳舱 埃克森 进入java java.security.spec.ECPoint . 然后构造适当的 ECPublicKeySpec ECDSA 密钥生成器以重新创建完整的 PublicKey .

    推荐文章