Cifrando con Java: Ejemplo práctico con clave pública

Para comprender mejor cómo funciona un criptosistema de clave pública, es fundamental ir más allá de la teoría. En esta entrada veremos un ejemplo práctico en Java usando el algoritmo RSA, uno de los más conocidos y utilizados.

Utilizaremos Java 17+ y la API de criptografía estándar (JCA – Java Cryptography Architecture). Esta práctica será útil para entender cómo generar claves, cifrar un mensaje con la clave pública y descifrarlo con la clave privada.

Requisitos técnicos

  • Java 17 o superior
  • Maven (Opcional)
  • IntelliJ IDEA (o cualquier IDE de tu preferencia)
  • No se requieren librerías externas

Empecemos

1. Generar el par de claves

import java.security.*;

public class KeyGeneratorExample {
    public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
        generator.initialize(2048); // Longitud de clave segura
        return generator.generateKeyPair();
    }
}

2. Cifrar un mensaje usando la clave pública

import javax.crypto.Cipher;
import java.security.PublicKey;
import java.util.Base64;

public class AsymmetricEncryption {

    public static String encrypt(String message, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedBytes = cipher.doFinal(message.getBytes());
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }
}

3. Descifrar el mensaje usando la clave privada

import java.security.PrivateKey;

public class AsymmetricDecryption {

    public static String decrypt(String encryptedMessage, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedMessage));
        return new String(decryptedBytes);
    }
}

4. Código principal para ejecutar

public class Main {
    public static void main(String[] args) throws Exception {
        // Generar claves
        KeyPair keyPair = KeyGeneratorExample.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        String originalMessage = "Hola, este es un mensaje secreto!";
        System.out.println("Mensaje original: " + originalMessage);

        // Cifrar
        String encrypted = AsymmetricEncryption.encrypt(originalMessage, publicKey);
        System.out.println("Mensaje cifrado: " + encrypted);

        // Descifrar
        String decrypted = AsymmetricDecryption.decrypt(encrypted, privateKey);
        System.out.println("Mensaje descifrado: " + decrypted);
    }
}

Resultado

Observaciones

  • La clave pública puede compartirse con cualquiera.
  • La clave privada debe almacenarse de forma segura, idealmente en un almacén de claves (keystore).
  • Este ejemplo no maneja excepciones específicas ni gestión de claves persistentes, lo que sería requerido en aplicaciones reales.

¿Dónde aplicar esto?

Este tipo de implementación se utiliza, por ejemplo, en:

  • Transacciones seguras en banca en línea.
  • Protección de comunicaciones en mensajería.
  • Intercambio seguro de claves simétricas para cifrados más rápidos.

Referencias

  • Hernández, L. (2016). Criptografía de clave asimétrica. En La criptografía (pp. 93–134). CSIC.
  • Java API Documentation – Oracle. (2024). Java Cryptography Architecture (JCA).
  • Maillo, J. (2017). Seguridad de la información. RA-MA Editorial.

Comentarios

Deja un comentario