Nuestros arquitectos están tratando de usar un método no estándar utilizando criptografía asimétrica. Quieren que tanto las claves públicas como las privadas se mantengan privadas. Significa que tenemos 2 sistemas: el primer sistema funciona solo para cifrar datos y el segundo, solo funciona para descifrar datos. Ambos sistemas tienen una parte diferente de la clave. En base tenemos sistemas y sistemas de EC en JAVA.
Algoritmo asimétrico, significa que usted cifra con una clave pública, y descifra con lo privado. Pero en el almacén de claves no podemos almacenar la clave privada sin el público. (Público sin privado está bien, es como un almacén de confianza).
Intenté convertir el almacén de claves a p12 y hacer openssl pkcs12 -in yourP12File.p12 -nocerts -out privateKey.pem
Después:
PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile));
Object object = pemParser.readObject();
InputDecryptorProvider pkcs8Prov = new JceOpenSSLPKCS8DecryptorProviderBuilder().build("password".toCharArray());
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
PrivateKey privateKey = null;
if (object instanceof PKCS8EncryptedPrivateKeyInfo) {
final PrivateKeyInfo privateKeyInfo = ((PKCS8EncryptedPrivateKeyInfo) object).decryptPrivateKeyInfo(pkcs8Prov);
privateKey = converter.getPrivateKey(privateKeyInfo);
}
En esta clave privada veo una clave pública (reflexión), y puedo extraerla.
El comando openssl ec -in privkey.pem -pubout > key.pub
también funciona bien. Una forma, como veo, si leemos la clave privada de jks, no contiene el pubKey. Y podemos serializarlo a Java Serializable y guardarlo. ¿Es este un buen método para guardar la clave pública y privada por separado?