Tema 3

Algoritmos de cifrado

Se distinguen dos grupos: los clasicos y los modernos

Los clasicos: El mas "conocido" se usaban en tiempo de Julio Cesar y consistia en escribir los alfabetos desplazados:
        A B C D E F  ...  T U V W X Y Z    ==>  HOLA
        D E F G H I   ...  W X Y Z A B C     ==> KROD
El "algoritmo" para sacar este metodo seria: c = (M + 3) mod 256, donde 3 es la clave.
Es la forma más simple de cifrado por sustitución, y se denomina metodo Cesar.
Se denomina clave debil a aquella que da el mismo mensaje que sin cifrar (por ejemplo en el cesar poner clave 0 o una que de la vuelta completa al alfabeto).

También existen por sustitución multialfabetica, y según su ubicación, el mismo caracter se cambia por otro diferente (no siempre el mismo).

        A  B  C  D  E  F  G  H  ...
  3    D  E   F  G  H   I  J   K  ...
  6    G  H   I   J   K  L M N ...
  2    C  D  E   F  G  H  I   J  ...

Este es el metodo de Vigenere.

        ci= (mi + ki mod l  ) mod 256    i = 0, 1, 2 ...
                            |
                            |==> La clave cambia según la posición de la letra

Otro metodo es la transposición, donde el contenido no importa, solo la posición, porque simplemente se intercambian las letras de sitio.
Por ejemplo:
        6 = {5, 6,  1, 2, 4, 3 }
                1  2   3  4  5  6

Hola como estas  ==> la cHo etsom####as
Los simbolos # sirven para rellenar los espacios que quedan vacios, pero se deberia poner información aleatoria, para evitar que fuese más facil de deduir como se han realizado los cambios.

Otro forma de encriptar la información de forma bastante sencilla es escribir en filas y leer en columnas, pero es un algoritmo más dificil de implementar que los anteriores, ya que a cualquier metodo de cifrado se le exigirá que solamente tenga que pasar la información por el una vez.

Red de Feistel: Estos algoritmos tienen la propiedad de ser reversibles.
.            .

Li = Ri-1
R1 = Li-1 + f(Ri-1, Ki)        i = 1, ..., n-1
Ln = Ln-1 + f(Rn-1, Kn)        =============>    Ri-1 = Li                                  =======>   Ri-1 = L1
Rn = Rn-1                                                                     Li-1 = Ri + f(Ri-1, K1)                                 Li-1 = R1 + f(Li, Ki)

Obtención de f para DES

S-> Como CESAR pero más complicado. (Los bits que se pierden, son los que antes se habian expandido)
P -> Permutación de los bits

El DES es un cifrador por bloques (igual que el CAST, Blowfish, etc), y al igual que otros algoritmos no cumplen que las claves no forman estructuras de grupo, si se cifra un mensaje dos veces, no existe una clave que pueda descifrarlo de una sola vez:

        Triple DES :    Ek1(Dk2(Ek1(m)))    <-- Así se consigue una clave de 128 bits

ECB (Electronic Code Bloc): Es la forma de trabajar del DES, siendo cada cifrado completamente independiente de los anteriores.
El DES tiene varias claves debiles, es decir, que "no cifran". Lo que sale después de encriptar es igual que el texto plano que se le introduce, además de algunas claves semidebiles, que no queda igual pero se parece mucho. Como el DES conoce estas claves, si se introduce una, se rechaza, pero de todas formas como se usa ECB solo quedarian al descubierto los ocho bits cifrados con esta.

CBC (Cipher Bloc Chaning): En español "Encadenamiento de Bloque Cifrado" y sirve para evitar que todos los bloques iguales tengan la misma salida. Consiste en ir arrastrando los mensajes que se van cifrando y por tanto cada vez es más complicado.

Hay cifradores que trabajan byte a byte y se denominan stream o de flujo.
CFB (Cipher Feedback): Realimentación de cifrado. Los primertos 64 bits se escogen al azar, y se realimenta tantas veces como bytes se transmiten.

 

Cifrado de Clave Publica

e y d son dos numeros calculados con el metodo de Euler, por lo que son inversos

    (e,n) -> Clave pública
    (d,n) -> Clave privada

Como no conocemos  no podemos calcular d a partir de e.
Para cifrar: (RSA)

    C = me (mod n)   ->   n es muy grande y como e no es necesario que lo sea tanto se calcula bastante rapido.
    m = Cd (mod n)

    Demostración:  C = me    -->   Cd = med = m

Para conseguir n se congen dos primos fuertes y se hace n = p * q    (p y q han de ser secretos, entonces solamente conociendo n no se pueden calcular)

En la practica se suele hacer:  (e,n) -> n = 3 o 65535, aunque se puede utilizar cualquiera.

Se podria usar como clave privada, pero es mucho más lento que el DES (por eso no se utiliza para cifrar cosas grandes).
Uno de los inconvenientes de los algoritmos de clave publica es que al conocerse la clave de cifrado, se pueden cifrar textos para probar como encripta, además una clave RSA  de 512 bits se considera igual de devil  que una de 56 bis del DES, solo que al RSA se le puede aumentar el tamaño de la clave.

Confidencialidad y Autenticidad

Secreto -> Confidencialidad                                                                    Autenticidad
    C = EPb (m)                                                                                               C = EKa (m)
    DKb (C) =  DKb (EPb  (m)) = m                                                               DPa (C) = DPa  (EKa (m)) = m

Confidencialidad
Se genera un numero aleatorio y secreto (se usará como clave secreta) y será la clave de sesión (es una clave que solamente se usa para una sesión), esta clave será S y tiene que ser muy grande, utilizando la clave de sesión se consigue que vaya más rapido.
___________________
|  Es (m)  |   EPb (S)   |

Si se quiere enviar el mensaje a más personar, se puede colocar la clave publica de todos, de la forma:
_______________________________________
|  Es (m)  |   EPb (S)   |   EPc(S)    |    EPd (S)   |

Autenticidad
Función hash (resumen): Estas funciones cumplen que la entrada es un texto de un tamaño cualquiera, pero la salida siempre tiene un tamaño fijo.
Dado un mensaje y su función resumen (la salida), cualquier cambio, aunque sea minimo, tanto en el contenido como en la posición, crea unos cambios muy grandes en el resumen, por lo que es facilmente detectable un cambio.
También se ha de cumplir, que dado un resumen ha de ser extremadamente dificil encontrar un texto que fabrique ese resumen.

Ejemplos de funciones son: md5 (de 128 bits, creado por Rivesht), sha1 (de 160 bits), sha2 ...

Es importante que tenga por  lo menos 128 bits, ya que por fuerza bruta solo hay que probar 2bits / 2  claves.

____________________
| EKa ( H (m))   |    m    |  =  C

Donde H es la función de resumen y  [EKa ( H (m))] seria la firma electronica (F).
Tiene la ventaja que lo largo es m y como lo que se cifra es el resumen cuesta poco.
        _______
C = |  m  |  F  |    --->    H(m) = DPa (F)   <== Si esto se cumple, entonces es autentico, sino podemos leer el     mensaje, pero no sabemos si es autentico.

Lo normal es:
_____________________________
|   Es (m)   |   EPb (S)   |   EPa (S)   |   <-- Así el transmisor A puede leer su mensaje, sino no lo puede descifrar.

Si se quiere mandar para que sea seguro y autentico, se puede firmar y después cifrar, en este orden, porque al revés se puede saber que es un mensaje cifrado y firmado, pero de esta forma, no se ve nada.

C = EPb (EKa (H(m))    ==comprobación==>    m = DPa (DKb (C))

Lo habitual en la practica es:

El problema que tienen estos metodos es si las claves son realmente de quien dicen ser, para eso se pueden utilizar dos metodos:
    -Contacto directo.
    -Confianza (Según el estandar ISO, hay que utilizar un notario para que certifique que la clave es real, pero en la practica las comisiones certificadoras son empresas).
A la confianza en un notario se le llama confianza vertical, mientras que a la que se basa en confianza en "amigos"  (como la que usa PGP, por ejemplo) se le llama confianza horizontal.

Certificados

Campos de un Certificado

DN (Distinguised name) o tambien puede ser subject.
Esta parte en el x509 está formado por los campos:
    -Common name        (CN)  = Nombre de la persona
    -Organization Unit   (OU) = Departamento
    -Organization            (O)    = Organización
    -Country                    (C)    = País
    -Locality                    (L)    = Localidad
    -State                         (ST) = Estado, provincia o comunidad
    -Email                                 = Dirección de correo  (añadido después al x509)

  _______________________
|                                               |
|                   DN                      |
|               Subject                   | -->  DN del sujeto
|_______________________ |
|                                               |
|                   DN                      |
|                Issuer                    | -->  DN del emisor del certificado
|_______________________ |
|                                               | -->  Versión, numero de Serie, fecha de inicio y fin de validez, algoritmos,
|_______________________ |            clave publica del subject, firma del Issuer

Las claves publicas se introducen en  los certificados para autentificar que son de quien dicen ser, las claves de las autoridades certificadoras pueden estar firmadas por otras autoridades certificadoras, pero puede existir una unidad raiz que se autofirma el certificado y entonces vale la confianza.

Para conseguir un certificado, se introducen los datos personales, se elige el algoritmo de clave publica (normalmente RSA), se generan las claves (puede generarlas el usuario o la autoridad), despues se puede:

RSA lab. -(PKCS#10): Se genera una clave publica y una privada, se pone el DN y la clave publica y se firma con la privada (esto se denomina request), con esto se consigue que la autoridad sepa que la persona que lo ha creado tiene la clave privada.

La mayoria de autoridades certificadoras, lo que hacen es tener varios niveles de certificación, por ejemplo certificar el e-mail, o otra clase podria ser certificar el DN haciendo presentar un documento...

Si se pierde una clave privada, como las autoridades certificadoras no hacen dos certificados iguales se tiene que pedir una revocación del certificado. El CRL (lista de certificados revocados) es una lista de numeros de serie, el DN de la autoridad certificadora y esto firmado, hace falta la lista para saber si el certificado no está revocado, aunque también se están creando protocolos para conectar on-line con la autoridad certificadora y comprobar al momento que no está revocado.

Para evitar que se puedan presentar certificados caducados diciendo que cuando se enviaron aún estaban vigentes o casos por el estilo , se utiliza lo que se conoce como sellado de tiempo que consiste en que se le entrega  el documento a una entidad, que certifica el dia y la hora en que le llegó el documento.

Codificación

Estas reglas se utilizan para que se pueda compartir información binaria, y que cada uno no la almacene de una forma distinta.

Para convertir la información binaria en caracteres visibles, se utilizan expansores, como pueden ser:
    -uuencode
    -base64 -> este expansor usa un subconjunto del ASCII (minusculas, mayusculas, numeros), y para evitar que disminuya demasiado la entropia lo que hace es correr los bits, después estira tres bytes y consigue sacar cuatro bytes.

PEM -> (Private Enhaced Mail) Correo mejorado para privacidad: De esto ha quedado el formato y consiste en coger una información binaria, se pasa a base64 y se le añade delante y detrás unas "cabeceras" (un begin y un end):

    ---begin  loquesea---
    ñaslkfdasdhfkjelwblkewrbjkewñovgñfhdañlhwe3fsdaj
    lhfr34opqrhlrñweh l23kljñlekjhreaslhr39ikjasdflñkhreh
    eakhf938kjsfhadlh38nhañsdfñewrgpqjoiweroipwwqe3
    asldñkfj woe98lñiy3jlkhgspo596ñjverlñjtn4lkjhitñlangr
    ---end  loquesea---
                         |
                         |- Aquí podria ir por ejemplo 'Certificado'.

Toda la información que va antes del begin y después del end se ignora.

ASN1 -> Es el lenguaje que utiliza ISO para definir las estructuras de datos.