## Generar las Claves Pública y Privada

Para poder crear una firma digital, necesitamos una clave privada. (Su correspondiente clave pública será necesaria para verificar la autenticidad de la firma.)

En algunos casos la pareja de claves (privada y pública) están ya disponibles en ficheros. En este caso el programa puede importar y usar la clave privada para firmar, como se muestra en Debilidades y Alternativas.

En otros casos el programa necesita generar la pareja de claves. Esto se puede hacer usando la clase KeyPairGenerator.

En este ejemplo generaremos una pareja de claves para el algoritmo Digital Signature Algorithm (DSA). Generaremos las claves con una longitud de 1024-bits.

La generación de la pareja de claves requiere varios pasos:

Crear un Key Pair Generator

> El primer paso es obtener el objeto "key-pair generator" para generar las claves para el algoritmo de firma DSA.

> Como con todas las clases motores, la forma de obtener un objeto KeyPairGenerator para un tipo particular de algoritmo es llamar al método de factoria estático getInstance de la clase KeyPairGenerator. Este método tiene dos formas, las dos tienen un primer argumento String algorithm; y una de ellas también tiene un segundo argumento String provider.

> Un llamador podría así opcionalmente especificar el nombre de un proporcionador, que garantizará que la implementación del algoritmo requerida es del proporcionador nombrado. El código de ejemplo de esta lección siempre especifica el proporcionado por defecto SUN incluido junto con el JDK.

> Ponemos la sisguiente sentencia después de línea

>     else try {

en el fichero creado en el paso anterior,Preparar la Estructura Inicial del Programa:

    KeyPairGenerator keyGen =
        KeyPairGenerator.getInstance("DSA", "SUN");

Inicializar el Key-Pair Generator

> El siguiente paso es inicializar el key-pair generator. Todos los objetos de este tipo comparten conceptos de tamaño de calve y una fuente aleatoria. La clase KeyPairGenerator tiene un método initialize que tiene estos dos tipos de argumentos.

> El tamaño de clave para un key generator DSA es la longitud de la clave (en bits), que debemos seleccionar a 1024.

> La fuente aleatorio deberá ser un ejemplar de la clase SecureRandom. Este ejemplo pide un ejemplar que usa el algoritmo de generación de números pseudoaleatorios SHA1PRNG, proporcionado por el proporcionador SUN interno. El ejemplo luego pasa el ejemplar de SecureRandom al método de inicialización del key-pair generator.

>     SecureRandom random =
>         SecureRandom.getInstance("SHA1PRNG", "SUN");
>     keyGen.initialize(1024, random);

> Nota: La implementación de SecureRandom intenta aleatorizar completamente el estado interno del propio generador a menos que llamador siga la llamada al método getInstance con una llamada al método setSeed. Si tenemos un valor de seed específico que queremos utilizar, deberíamos hacer los siguiente antes de llamar a initialize:

>     random.setSeed(seed);

Generar la Pareja de Claves

> El peso final es generar la pareja de claves y almacenarlas en los objetos PrivateKey y PublicKey:

>     KeyPair pair = keyGen.generateKeyPair();
>     PrivateKey priv = pair.getPrivate();
>     PublicKey pub = pair.getPublic();

Ozito