Cómo descomprimir la coordenada X9.62

Nov 17 2020

Estoy pasando un byte [] a mi método y estoy intentando generar una clave pública. Mirando el error parece que primero necesito descomprimir antes de generar pubKey.

¿Cómo puedo decodificar una coordenada comprimida?

private static PublicKey getPublicKeyFromBytes(byte[] pubKey) throws NoSuchAlgorithmException, InvalidKeySpecException 
{
       
        ECPoint point = new ECPoint(new BigInteger(pubKey), BigInteger.ZERO);
        ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("prime256v1");
        KeyFactory kf = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());
        ECNamedCurveSpec params = new ECNamedCurveSpec("prime256v1", spec.getCurve(), spec.getG(), spec.getN());
        ECPublicKeySpec pubKeySpec = new ECPublicKeySpec(point, params);
        ECPublicKey pk = (ECPublicKey) kf.generatePublic(pubKeySpec);
        return pk;
}

Mensaje de error:

Exception in thread "main" java.security.spec.InvalidKeySpecException: invalid KeySpec: x value invalid for SecP256R1FieldElement
    at org.bouncycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi.engineGeneratePublic(Unknown Source)

Respuestas

1 RasmusFaber Nov 17 2020 at 17:04

Si su pubKeyes un punto X9.62 comprimido o sin comprimir, puede usar el decodePoint()método -en el ECCurve:

ECPoint point = spec.getCurve().decodePoint(pubKey);