Separar clave pública y privada para EC

3

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?

    
pregunta Ilya K. 26.01.2016 - 20:50
fuente

1 respuesta

5

Es muy arriesgado hacer un uso no estándar de las funciones de cifrado. Todo tipo de problemas sutiles tienden a infiltrarse; Los problemas con las herramientas existentes son solo algunos de ellos.

Presumiblemente, este diseño fue elegido para garantizar tanto la confidencialidad como la autenticidad. Una mejor solución sería tener dos pares de claves: una que pertenezca al originador de los datos y la otra al receptor. Cada uno compartiría su clave pública y mantendría su clave privada en secreto. Al crear datos, el originador cifraría con la clave pública del receptor y luego firmaría los datos cifrados con su propia clave privada. El receptor primero verificará la firma y luego descifrará.

Esta solución proporcionará confidencialidad y autenticidad a la vez que funcionará bien con las herramientas y expectativas existentes.

    
respondido por el Neil Smithline 26.01.2016 - 21:02
fuente

Lea otras preguntas en las etiquetas