Title: Seguridad Informtica
1Seguridad Informática
Cifrado Java SE Security Micael.Gallego_at_urjc.es
Seguridad en Java
2Introducción
- Cifrado de información con algoritmos de cifrado
(ciphers) - Se puede utilizar para
- Guardar información en disco
- Enviar información por una red pública
Seguridad en Java
3Algoritmo de Cifra
- Clase javax.crypto.Cipher
- Tiene métodos para cifrar y descifrar (encriptar
y desencriptar) - Arrays de información
- Flujos de datos (streams)
- Los objetos de esta clase se obtienen con este
método indicando como parámetro el algoritmo
concreto y su configuración
Static Cipher getInstance(String transformation)
Seguridad en Java
4Algoritmo de Cifra
- Algoritmos
- DES
- Data Encriptation Algorithm. Gobierno EEUU
- DESede
- Triple DES
- Se realizan 3 rondas de encriptación DES con
varias claves - Blowfish
- Algoritmo no patentado
- Bruce Schneier
Seguridad en Java
5Algoritmo de Cifra
- Algoritmos
- PBEWithMD5AndDES
- PBE Cifrado basado en contraseña (Password-Based
Encryptation) con MD5 de la contraseña y DES para
el cifrado - Otros
- RSA, DESedeWrap, PBEWithMD5AndTripleDES,
PBEWithSHA1AndRC2_40, PBEWithSHA1AndDESede, AES,
AESWrap, RC2, ARCFOUR, RSA/ECB/PKCS1Padding
Seguridad en Java
6Algoritmo de Cifra
- Modos de funcionamiento
- El cifrado se realiza por bloques (de uno a
varios bytes, por defecto 8 bytes) - El modo de funcionamiento indica como han de
manejarse esos bloques para cifrar - Cifrar cada bloque de forma independiente
- Hacer que el cifrado de un bloque influya en el
siguiente bloque (encadenado)
Seguridad en Java
7Algoritmo de Cifra
- Modos de funcionamiento
- Hay modos que permiten un cifrado más fuerte en
el caso de que los datos a cifrar tengan patrones
repetitivos - Cabecera y pie en documentos de texto
- Si el bloque es de 1 byte, se tiene un algoritmo
de cifrado de flujos (streams) - Algunos modos de funcionamiento requieren
información inicial para descifrar
(initialization vector)
Seguridad en Java
8Algoritmo de Cifra
- Modos de funcionamiento
- ECB (electronic cookbook)
- Cifra cada bloque de 8 bytes de forma
independiente - Recomendado para binario o texto sin patrones
- CBC (cipher block chaining)
- Los datos de un bloque afectan al cifrado del
siguiente bloque (encadenado) - Recomendado para texto con patrones
- Único compatible con el algoritmo
PBEWithMD5AndDES - Requiere vector de inicialización para descifrar
Seguridad en Java
9Algoritmo de Cifra
- Modos de funcionamiento
- CFB (cipher-feedback)
- Los datos de un bloque afectan al cifrado del
siguiente bloque (encadenado) - Recomendado para cifrar texto
- Requiere vector de inicialización para descifrar
- Se puede especificar el tamaño del bloque en bits
(múltiplos de 8) - CFB8, CFB16, CFB24, , CFB64 (defecto)
- OFB
- PCBC
Seguridad en Java
10Algoritmo de Cifra
- Esquemas de relleno
- Padding schemes
- Si la información a cifrar no se ajusta a un
número exacto de bloques se necesita un criterio
para completar el último bloque - Si el tamaño del bloque es 8 bits (1 byte) no se
necesita relleno
Seguridad en Java
11Algoritmo de Cifra
- Esquemas de relleno
- PKCS5Padding
- Asegura que la información se puede dividir en
bloques de 8 bytes - NoPadding
- No realiza relleno
- Los datos de entrada al algoritmo de cifra deben
ajustarse al tamaño de bloque o se producirá un
fallo
Seguridad en Java
12Algoritmo de Cifra
// Obtenemos la clave. Debe mantenerse en
secreto KeyGenerator kg KeyGenerator.getInstance
("DES") Cipher c Cipher.getInstance("DES/CBC/PK
CS5Padding") Key key kg.generateKey() //
Inicializamos en algoritmo de cifrado c.init(Ciphe
r.ENCRYPT_MODE, key) // Obtenemos el vector de
inicio. Puede enviarse en claro byte iv
c.getIV() byte input "Stand and unfold
yourself".getBytes() // Encriptamos byte
encrypted c.doFinal(input) //
Desencriptado IvParameterSpec dps new
IvParameterSpec(iv) c.init(Cipher.DECRYPT_MODE,
key, dps) byte output c.doFinal(encrypted)
System.out.println("The string was "new
String(output))
Seguridad en Java
13Algoritmo de Cifra
Obtenemos la clave. En Este caso la hemos
creado, en otros caso la podemos obtener de un
keystore o la podemos generar con un algoritmo de
acuerto de claves (key agreement algorithm)
// Obtenemos la clave. Debe mantenerse en
secreto KeyGenerator kg KeyGenerator.getInstance
("DES") Cipher c Cipher.getInstance("DES/CBC/PK
CS5Padding") Key key kg.generateKey() //
Inicializamos en algoritmo de cifrado c.init(Ciphe
r.ENCRYPT_MODE, key) // Obtenemos el vector de
inicio. Puede enviarse en claro byte iv
c.getIV() byte input "Stand and unfold
yourself".getBytes() // Encriptamos byte
encrypted c.doFinal(input) //
Desencriptado IvParameterSpec dps new
IvParameterSpec(iv) c.init(Cipher.DECRYPT_MODE,
key, dps) byte output c.doFinal(encrypted)
System.out.println("The string was "new
String(output))
Seguridad en Java
14Algoritmo de Cifra
// Obtenemos la clave. Debe mantenerse en
secreto KeyGenerator kg KeyGenerator.getInstance
("DES") Cipher c Cipher.getInstance("DES/CBC/PK
CS5Padding") Key key kg.generateKey() //
Inicializamos en algoritmo de cifrado c.init(Ciphe
r.ENCRYPT_MODE, key) // Obtenemos el vector de
inicio. Puede enviarse en claro byte iv
c.getIV() byte input "Stand and unfold
yourself".getBytes() // Encriptamos byte
encrypted c.doFinal(input) //
Desencriptado IvParameterSpec dps new
IvParameterSpec(iv) c.init(Cipher.DECRYPT_MODE,
key, dps) byte output c.doFinal(encrypted)
System.out.println("The string was "new
String(output))
Iniciamos el algoritmo de cifrado para cifrar
Seguridad en Java
15Algoritmo de Cifra
// Obtenemos la clave. Debe mantenerse en
secreto KeyGenerator kg KeyGenerator.getInstance
("DES") Cipher c Cipher.getInstance("DES/CBC/PK
CS5Padding") Key key kg.generateKey() //
Inicializamos en algoritmo de cifrado c.init(Ciphe
r.ENCRYPT_MODE, key) // Obtenemos el vector de
inicio. Puede enviarse en claro byte iv
c.getIV() byte input "Stand and unfold
yourself".getBytes() // Encriptamos byte
encrypted c.doFinal(input) //
Desencriptado IvParameterSpec dps new
IvParameterSpec(iv) c.init(Cipher.DECRYPT_MODE,
key, dps) byte output c.doFinal(encrypted)
System.out.println("The string was "new
String(output))
Obtenemos el vector inicial que puede ser
necesario para descifrar
Seguridad en Java
16Algoritmo de Cifra
// Obtenemos la clave. Debe mantenerse en
secreto KeyGenerator kg KeyGenerator.getInstance
("DES") Cipher c Cipher.getInstance("DES/CBC/PK
CS5Padding") Key key kg.generateKey() //
Inicializamos en algoritmo de cifrado c.init(Ciphe
r.ENCRYPT_MODE, key) // Obtenemos el vector de
inicio. Puede enviarse en claro byte iv
c.getIV() byte input "Stand and unfold
yourself".getBytes() // Encriptamos byte
encrypted c.doFinal(input) //
Desencriptado IvParameterSpec dps new
IvParameterSpec(iv) c.init(Cipher.DECRYPT_MODE,
key, dps) byte output c.doFinal(encrypted)
System.out.println("The string was "new
String(output))
Para encriptar tenemos que llamar en último lugar
al método doFinal() antes tenemos que llamar al
método update()
Seguridad en Java
17Algoritmo de Cifra
// Obtenemos la clave. Debe mantenerse en
secreto KeyGenerator kg KeyGenerator.getInstance
("DES") Cipher c Cipher.getInstance("DES/CBC/PK
CS5Padding") Key key kg.generateKey() //
Inicializamos en algoritmo de cifrado c.init(Ciphe
r.ENCRYPT_MODE, key) // Obtenemos el vector de
inicio. Puede enviarse en claro byte iv
c.getIV() byte input "Stand and unfold
yourself".getBytes() // Encriptamos byte
encrypted c.doFinal(input) //
Desencriptado IvParameterSpec dps new
IvParameterSpec(iv) c.init(Cipher.DECRYPT_MODE,
key, dps) byte output c.doFinal(encrypted)
System.out.println("The string was "new
String(output))
Creamos el parámetro de vector de inicio
Seguridad en Java
18Algoritmo de Cifra
// Obtenemos la clave. Debe mantenerse en
secreto KeyGenerator kg KeyGenerator.getInstance
("DES") Cipher c Cipher.getInstance("DES/CBC/PK
CS5Padding") Key key kg.generateKey() //
Inicializamos en algoritmo de cifrado c.init(Ciphe
r.ENCRYPT_MODE, key) // Obtenemos el vector de
inicio. Puede enviarse en claro byte iv
c.getIV() byte input "Stand and unfold
yourself".getBytes() // Encriptamos byte
encrypted c.doFinal(input) //
Desencriptado IvParameterSpec dps new
IvParameterSpec(iv) c.init(Cipher.DECRYPT_MODE,
key, dps) byte output c.doFinal(encrypted)
System.out.println("The string was "new
String(output))
Reiniciamos el algoritmo de cifrado para descifrar
Seguridad en Java
19Algoritmo de Cifra
// Obtenemos la clave. Debe mantenerse en
secreto KeyGenerator kg KeyGenerator.getInstance
("DES") Cipher c Cipher.getInstance("DES/CBC/PK
CS5Padding") Key key kg.generateKey() //
Inicializamos en algoritmo de cifrado c.init(Ciphe
r.ENCRYPT_MODE, key) // Obtenemos el vector de
inicio. Puede enviarse en claro byte iv
c.getIV() byte input "Stand and unfold
yourself".getBytes() // Encriptamos byte
encrypted c.doFinal(input) //
Desencriptado IvParameterSpec dps new
IvParameterSpec(iv) c.init(Cipher.DECRYPT_MODE,
key, dps) byte output c.doFinal(encrypted)
System.out.println("The string was "new
String(output))
Desciframos el último fragmento. Si tuviésemos
más habrÃa que llamar a update
Seguridad en Java