Está en la página 1de 7

Tutorial de JCA (Java Cryptographic Architecture)

SSI 2012/13 17 de septiembre de 2012

Indice
1. JCA: Java Cryptographics Architecture 1.1. Estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2. Documentaci on adicional 2. Provider BouncyCastle 2.1. Descarga y documentaci on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Instalaci on y uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3. Ejemplos 3.1. Funciones hash criptogr acas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2. Cifrado sim etrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3. Cifrado asim etrico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3.1. Creaci on de claves asim etricas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.4. Almacenamiento de claves . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5. Firmas digitales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.1. Generaci on de rmas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.5.2. Vericaci on de rmas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 2 2 2 2 3 3 4 5 5 6 6 6 7

1.

JCA: Java Cryptographics Architecture

Framework para criptograf a que forma parte de la distribuci on est andar de la JVM (m aquina virtual de Java). Reemplaza (y amplia) al API JCE (Java Cryptographic Extensions) Ofrece un API (application programming interface) que permite: generaci on de claves (claves secretas y pares de claves p ublica y privada) cifrado sim etrico (DES, 3DES, IDEA, etc) cifrado asim etrico (RSA, DSA, Die-Hellman, ElGamal...) funciones de resumen (MD5 y SHA1 ) y algoritmos MAC (Message Authentication Code) generaci on y validaci on de rmas acuerdo de claves 1

1.1.

Estructura

Las implementaciones de los distintos algoritmos de cifrado, generaci on de claves, etc son ofertadas por paquetes externos denominados providers. La distribuci on b asica de Java incluye por defecto el provider SUN con implementaciones de los algoritmos m as representativos. Otros fabricantes ofrencen providers adicionales que incluyen nuevos algoritmos o implementaciones alternativas de los ya existentes en el provider SUN. As es posible dotar a JCA de nuevas funcionalidades sin necesidad de cambiar el API b asica y permitir la distribuci on de algoritmos critpgr acos con limitaciones de exportaci on. Para usar las clases y m etodos del API JCA las aplicaciones tienen que importar, como m nimo, los siguientes paquetes: import java.security.*; import java.security.interfaces.*; import java.security.spec.*; import import import javax.crypto.*; javax.crypto.interfaces.*; javax.crypto.spec.*;

1.2.

Documentaci on adicional
Descripci on infraestructura de seguridad en Java SE 7 Descripci on de JCA (Java Criptographic API) Listado con los nombres est andar de los algoritmos en JCA/JCE Javadoc JCA: paquete java.security paquete javax.crypto Manual de cifrado con JCE (en espa nol)

2.

Provider BouncyCastle

Bouncy Castle es un proyecto de software libre que pretende desarrollar una serie de librer as criptogr acas libres y, entre otros, ofrece un provider para el JCA de java.

2.1.

Descarga y documentaci on

En la p agina web del proyecto (http://www.bouncycastle.orghttp://www.bouncycastle.org/java.html) es posible descargar la versi on actual del provider Bouncy Castle para distintas versiones de la m aquina virtual de Java. Tambi en incluye informaci on resumida y el javadoc completo de la distribuci on.

2.2.

Instalaci on y uso

Para usar las clases de JCA/JCE ofrecidas por BounceCastle, basta con incluir en el c odigo que lo utilice la sigueinte orden de importaci on: import org.bouncycastle.jce.provider.BouncyCastleProvider; 2

Dentro del c odigo ser a necesario indicar la carga del provider BouncyCastle del siguiente modo: Security.addProvider(new BouncyCastleProvider()); Este c odigo se deber a situar antes de cualquier uso que se realice de este provider. La abreviatura que identica a este provider es BC y deber a indicarse cuando se solicite alguna de las implementaciones de algoritmos que ofrece el provider BouncyCastle. Cipher cifrador = Cipher.getInstance("DES/ECB/PKCS1Padding", "BC"); KeyGenerator keyGen = KeyGenerator.getInstance("AES", "BC"); Para compilar y ejecutar estos programas ser a necesario indicar mediante el par ametro -classpath el chero .jar con las clases BouncyCastle adecuado a la m aquina virtual Java que est e instalada. $ javac -classpath ".:bcprov-jdk15on-147.jar" $ java -classpath ".:bcprov-jdk15on-147.jar" C:\ javac -classpath ".;bcprov-jdk15on-147.jar" C:\ java -classpath ".;bcprov-jdk15on-147.jar" XXX.java XXX XXX.java XXX

Otra opcion es copiar el chero JAR de BouncyCastle en el directorio de librerias externas de la instalacion del JDK o JRE, de modo que se incluya por defecto en el CLASSPATH de la maquina virtual Java. $ cp bcbcprov-jdk15on-147.jar /usr/lib/jvm/java-6-XXXXX/jre/lib/ext/

3.
3.1.

Ejemplos
Funciones hash criptogr acas

El uso de funciones Hash criptogr acas se lleva a cabio mediante instancias que hereden de MessageDigest Creaci on de instancias Mediante un m etodo factoria (no con new), ya que ser a el provider quien cree el objeto concreto con su implementaci on del correspondiente algoritmo. Se debe indicar el nombre (alias) del algoritmo de HASH y opcionalmente el nombre del provider. static MessageDigest getInstance(String algorithm) static MessageDigest getInstance(String algorithm, String provider) C alculo de res umenes Se debe alimentar al algoritmo con los datos a resumir (mediante los m etodos update()) void update(byte input) void update(byte[] input) void update(byte[] input, int offset, int len) Se obtiene el resumen invocando al m etodo digest() que naliza las operaciones byte[] digest() byte[] digest(byte[] input)

Ejemplo de uso del algoritmo MD5: EjemploHash $ javac EjemploHash.java $ java EjemploHash fichero.txt 3

3.2.

Cifrado sim etrico

El uso de cifradores sim etricos (y tambi en asim etricos) se hace mediante instancias que heredan de la clase Cypher Creaci on de instancias Mediante un m etodo factoria (no con new), ya que ser a el provider quien cree el objeto concreto con su implementaci on del correspondiente algoritmo. Se debe indicar el nombre (alias) del algoritmo de cifrado y, si son necesarios (en caso de cifradores de bloque), una especicaci on del modo de funcionamiento (ECB, CBC, ...) y del algoritmo de relleno. (Opcionalmente puede ser necesario indicar nombre del provider) static Cipher getInstance(String transformation) static Cipher getInstance(String transformation, String provider) Creaci on de la clave Las claves se gestionan mediante objetos que implementan el interfaz SecretKey (que a su vez hereda del interfaz Key) Las claves se crean empleando un objeto KeyGenerator. Creaci on del KeyGenerator empleando un m etodo factor a (se debe indicar el alias del algoritmo de cifrado y, opcionalmente, el nombre del provider) KeyGenerator generadorDES = KeyGenerator.getInstance("DES"); Conguraci on del KeyGenerator (normalmente especicaci on del tama no de clave) generadorDES.init(56); // clave de 56 bits Creaci on de la clave SecretKey clave = generadorDES.generateKey(); Cifrado y descrifrado Se debe establecer el modo de funcionamiento del cifrador (m etodo init(...))

DECRYPT_MODE : modo descifrado ENCRYPT_MODE : modo cifrado PRIVATE_KEY : clave para indicar el desempaquetado de una clave privada PUBLIC_KEY : clave para indicar el desempaquetado de una clave p ublica SECRET_KEY : clave para indicar el desempaquetado de una clave secreta (sim etrica) UNWRAP_MODE : modo desempaquetado de claves (descifrado de claves) WRAP_MODE : modo empaquetado de claves (cifrado de claves) cifrador.init(Cipher.ENCRYPT_MODE, clave); cifrador.init(Cipher.DECRYPT_MODE, clave);

Se debe alimentar al algoritmo con los datos a cifrar/descrifrar (mediante los m etodos update()) byte[] update(byte[] input) byte[] update(byte[] input, int offset, int len) Devuelve un array de byte con el resultado parcial del cifrado/descrifrado Se debe nalizar el cifrado/descrifrado invocando al m etodo doFinal() que naliza las operaciones (Importante: es necesario por si hay que manejar relleno) byte[] doFinal() byte[] doFinal(byte[] input) byte[] doFinal(byte[] input, int inputOffset, int inputLen)

Devuelve un array de byte con el resultado del cifrado/descrifrado del u ltimo bloque Ejemplo de uso del algoritmo DES: EjemploDES $ javac EjemploDES.java $ java EjemploDES fichero.txt

3.3.

Cifrado asim etrico

El funcinamiento de los cifradores asim etricos es id entico al de los sim etricos, medinte el uso de objetos que hereden de la clase Cypher. La u nica diferencia es el modo en que se generan los pares de claves p ublicas y privadas y el uso que se hace de ellas (en cifrado y/o descrifrado). 3.3.1. Creaci on de claves asim etricas

Las claves se gestionan mediante objetos que implementan el interfaz PublicKey y PrivateKey (que a su vez hereda del interfaz Key) Las claves se crean empleando un objeto KeyPairGenerator especico para cada algoritmo asimetrico. Creaci on del KeyPairGenerator empleando un m etodo factor a Se debe indicar el alias del algoritmo de cifrado y, OBLIGATORIAMENTE, el nombre del provider [inicialmente el provider por defecto SUN no inclu a RSA por limitaciones a la exportaci on de algoritmos de cifrado]) Security.addProvider(new BouncyCastleProvider()); ... // Cargar el provider BC

KeyPairGenerator keyGenRSA = KeyPairGenerator.getInstance("RSA", "BC");

// Usa BouncyCastle

Conguraci on del KeyPairGenerator (normalmente especicaci on del tama no de clave) gkeyGenRSA.initialize(512); // clave RSA de 512 bits

Creaci on del par de claves (y recuperaci on de las claes p ublica y privada) KeyPair clavesRSA = keyGenRSA.generateKeyPair(); PrivateKey clavePrivada = clavesRSA.getPrivate(); PublicKey clavePublica = clavesRSA.getPublic();

Nota: Se pueden inspeccionar los par ametros de las claves publica y privada RSA haciendo un cast a los interfaces RSAPrivateKey y RSAPublicKey

RSAPrivateKey clavePrivadaRSA = (RSAPrivateKey) clavePrivada; System.out.println("exponente descrifrado: " + clavePrivadaRSA.getPrivateExponent().toString( System.out.println("modulo: " + clavePrivadaRSA.getModulus().toString() ); RSAPublicKey clavePublicaRSA = (RSAPublicKey) clavePublica; System.out.println("exponente cifrado: " + clavePublicaRSA.getPublicExponent().toString() ); System.out.println("modulo: " + clavePublicaRSA.getModulus().toString() );

Ejemplo de uso del algoritmo RSA: EjemploRSA $ javac -classpath ".:bcprov-jdk15on-147.jar" EjemploRSA.java (en Linux) $ java -classpath ".:bcprov-jdk15on-147.jar" EjemploRSA (en Linux)

3.4.

Almacenamiento de claves

Dado que JCE tiene una arquitectura basada en providers donde las clases de implementaci on del provider son independientes de los interfaces gen ericos denidos en el API, son necesarios pasos intermedios para almacenar y recuperar las representaciones internas de las claves (especialmente en el caso de los pares de claves asim etricas). Uso de objetos KeyFactory y SecretKeyFactory para las conversiones entre claves gen ericas (SecrectKey, PublicKey, PrivateKey) y sus especicaciones Uso de X509EncodedKeySpec para gestinar la especicaci on de una clave p ublica (independiente del tipo de algoritmo real) Uso de PKCS8EncodedKeySpec para gestinar la especicaci on de una clave private (independiente del tipo de algoritmo real) Ejemplo de escritura/lectura de claves: AlmacenarClaves $ javac -classpath ".:bcprov-jdk15on-147.jar" EjemploRSA.java (en Linux) $ java -classpath ".:bcprov-jdk15on-147.jar" EjemploRSA (en Linux)

3.5.

Firmas digitales

JCA ofrece objetos Signature para simplicar la generaci on y validaci on de rmas digitales Otra alternativa es combinar el uso de funciones Hash con objetos Cypher a mano en modo cifrado con las claves privadas para generar rmas en modo descifrado con las claves p ublicas para validar rmas Creaci on de instancias Mediante un m etodo factoria (no con new), ya que ser a el provider quien cree el objeto concreto con su implementaci on del correspondiente algoritmo. Se debe indicar el nombre (alias) de la combinacion de algormitmo de Hash y del algoritmo asimetrico a utilizar (MD5withRSA, MD5withDSA, SHA1withRSA, SHA1withDSA), etc. Dependiendo del caso, suele ser necesario indicar tambien el nombre del provider. static Signature static Signature getInstance(String algorithm) getInstance(String algorithm, String provider)

3.5.1.

Generaci on de rmas

Congurar el modo rma del objeto Signature. Mediante un metodo initSign al que se le indica la clave privada de rma. void void initSign(PrivateKey privateKey) initSign(PrivateKey privateKey, SecureRandom random)

Alimentar los datos a rmar. Pasando un array de byte mediante los metodos update. 6

void void

update(byte[] data) update(byte[] data, int off, int len)

Generar la rma. Generar y recuperar la rma con los m etodos sign(). byte[] int sign() sign(byte[] outbuf, int offset, int len)

3.5.2.

Vericaci on de rmas

Congurar el modo vericacion del objeto Signature. Mediante un metodo initVerify al que se le indica la clave publica para validar la rma. void void initVerify(PublicKey publicKey) initVerify(Certificate certificate)

Alimentar los datos a validar. Pasando un array de byte mediante los metodos update. void void update(byte[] data) update(byte[] data, int off, int len)

Vericar la rma. Comprobar la validez de la rma con los m etodos verify() pasando como argumento un array de byte con la rma a validar. Devuelve un valor booleano indicado el resultado de la vericacion. boolean boolean verify(byte[] signature) verify(byte[] signature, int offset, int length)

También podría gustarte