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.
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.
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.