Usando o BouncyCastle para criptografar com o ECIES em Java
Estou tentando criptografar algum conteúdo usando o algoritmo ECC usando BouncyCastle em java. Mas estou recebendo uma exceção da biblioteca BouncyCastle dizendo que não é possível transmitirJCEECPublicKey
paraIESKey
. Que eu entendi que a chave pública gerada porKeyPairGenerator
éJCEECPublicKey
que não pode ser usado em javaCipher.init
método. Alguém pode me dizer como convertê-lo em chave pública ou especificação X509 para que eu possa usá-lo em criptografia.
Aqui está o código que eu tentei
// 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());
Também tentei converter a chave pública em X509EncodedSpec, mas recebo a mesma exceção
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyPair.getPublic().getEncoded());
KeyFactory factory = KeyFactory.getInstance("ECDH");
PublicKey publicKey = factory.generatePublic(spec);
A exceção que estou recebendo é
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
Com base no comentário, a versão do JDK que estou usando é JDK 7 - Instruções de importação do Oracle que estou 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;