Usando BouncyCastle para encriptar con ECIES en Java
Estoy tratando de encriptar algunos contenidos usando el algoritmo ECC usando BouncyCastle en Java. Pero recibo una excepción de la biblioteca BouncyCastle que dice que no se puede emitirJCEECPublicKey
aIESKey
. Que entendí que la clave pública generada porKeyPairGenerator
esJCEECPublicKey
que no se puede usar en javaCipher.init
método. ¿Alguien puede decirme cómo convertirlo en clave pública o especificación X509 para que pueda usarlo encriptado?
Aquí está el código que probé
// add instance of provider class
Security.addProvider(new BouncyCastleProvider());
// initializing parameter specs secp256r1/prime192v1
ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("prime192v1");
// key pair generator to generate public and private key
KeyPairGenerator generator = KeyPairGenerator.getInstance("ECDH", new BouncyCastleProvider());
// initialize key pair generator
generator.initialize(ecSpec);
// Key pair to store public and private key
KeyPair keyPair = generator.generateKeyPair();
Cipher iesCipher = Cipher.getInstance("ECIES", new BouncyCastleProvider());
iesCipher.init(Cipher.ENCRYPT_MODE, keyPair.getPublic());
También intenté convertir la clave pública en X509EncodedSpec pero obtengo la misma excepción
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyPair.getPublic().getEncoded());
KeyFactory factory = KeyFactory.getInstance("ECDH");
PublicKey publicKey = factory.generatePublic(spec);
La excepción que estoy recibiendo es
java.lang.ClassCastException: org.bouncycastle.jce.provider.JCEECPublicKey cannot be cast to org.bouncycastle.jce.interfaces.IESKey
at org.bouncycastle.jce.provider.JCEIESCipher.engineGetKeySize(JCEIESCipher.java:49)
at javax.crypto.Cipher.passCryptoPermCheck(Cipher.java:1057)
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1015)
at javax.crypto.Cipher.init(Cipher.java:1229)
at javax.crypto.Cipher.init(Cipher.java:1173)
at com.test.EciesTest.main(EciesTest.java:45)
EDITAR
Según el comentario, la versión de JDK que estoy usando es JDK 7 - Declaraciones de Oracle Import que estoy usando:
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Security;
import java.security.spec.ECGenParameterSpec;
import javax.crypto.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;