Unidad II. Seguridad y Programacion
Seguridad Encriptacin y Autenticacin
Hash
Un hash podemos definirlo como el resultado de una funcin matemtica aplicada a una
entrada arbitraria de datos, de forma que el resultado es (idealmente) asociado nicamente a
la entrada dada y siempre obteniendo un resultado de longitud finita y concreta para el
mismo hash. Es decir, idealmente para los hash criptogrficos sera imposible volver a
obtener el mismo resultado con otros datos diferentes. La idea es poder convertir la
cantidad de datos que sea en un resultado de longitud fija (fijada por el propio hash). Veamos un ejemplo muy sencillo de esto. Imaginar uan funcin hash que realiza lo
siguiente sobre nmeros enteros:
Hash = numero1 + numero2 + numero3. MODULO 100
En dicho ejemplo el hash se calculara sumando cada numero de entrada dado y se le
realizara la operacin Mdulo 100. La operacin mdulo devuelve simplemente el resto de
la divisin, y dado que el divisor es 100, el resto ser siempre un nmero entre 0 y 99:
n1 = 500 n2 = 100 -> Hash = (500+100) MOD 100 = 600 MOD 100 = 0 Hash = 0 (600/100
= 6 y resto 0)
n1 = 1250 n2 = 25 n3 = 5460 Hash = (1250+25+5460) MOD 100 = 6735 MOD 100 = 35
Hash = 35 (6735/100 = 67 y resto 35)
Evidentemente esta funcin hash sera un tanto absurda desde un punto de vista
criptogrfico, dado que sera relativamente muy facil obtener el mismo resultado con dos
entradas de datos diferentes. Pero sirve para dejar ver ms o menos de lo que estamos
hablando. En este caso tan solo existen 100 posible resultados, pero se puede observar que
si modificsemos cualquier nmero este podra repercutir en un resultado completamente
diferente. Las funciones hash hacen ms o menos esto, aunque no con una precisin de 100
posibles valores y de una forma mucho ms eficiente, pero la idea es la misma. Pero no
solo es til pensar en criptografa, una funcin Hash puede tener un valor muy importante
simplemente en la deteccin de errores por ejemplo.
Para que sirve esto? Tiene una gran utilidad en muchsimos campos. Podemos decir que
existen tres tipos de Hash: Hash checksums, Hash CRC y Hash criptogrficos.
CheckSum
Sera el ejemplo ms bsico de Hash. El concepto apareci de la necesidad de verificar de
algn modo la integridad de la transferencia de los datos. Es decir, si estos se haban
transmitido de forma alguna de forma errnea. Pero como podemos verificar esto?
Podemos tratar los datos de entrada de tal forma que nos de un resultado, de modo que si el
resultado es diferente en el destino, los datos son erroneos. Generalmente un CheckSum es
una operacin matemtica basada en sumas. El ejemplo expuesto anteriormente sera un
posible ejemplo de checksum. El ejemplo de checksum ms simple es el bit de paridad.
Imaginar que sea cual sea el bloque de datos de entrada, se le computa la paridad al dato, y
esta se le aade al dato final. El checksums en s mismo es tan solo un bit, un cero o un uno
que corresponde a la paridad del dato inicial. Cuando los datos son recibidos por el destino,
el destino calcula de nuevo la paridad del bloque y la compara con la paridad recibida. Si
coincide los datos son vlidos. Evidentemente este checksum tan solo previene contra 1
posible cambio de valor en uno de los bits transmitidos. Vamos a verlo con un ejemplo:
Se desea transmitir la cadena Casa desde A hasta B. Imaginar que cada carcter es acompaado con un bit de paridad. Un carcter tiene un valor entre 0 y 255 segn la tabla
ASCII, es decir, un carcter ocupa 1Byte de datos (8 bits). El carcter C equivale al cdigo ASCII x43 (43 en hexadecimal), lo que en binario equivale a 01000011:
C -> 01000011 -> Se aplica Paridad Par por ejemplo (Hay nmero par de unos? si es asi el resultado es cero, de lo contrario es uno) -> 3 Unos, es impar, bit de paridad par = 1
C -> 01000011 + bit de paridad -> Datos transmitidos: 010000111
De este modo, el destino tan solo tiene que tomar los primeros 8 bits y realizar la misma
operacin. Si el resultado coincide no hay error o no se ha podido detectar. Si no coincide
se ha producido un error y los datos no puede tomarse como vlidos. En este caso caso, tan
solo se podra detectar con un bit un nmero impar de errores: 1, 3, 5 dado que si se produce un nmero par de errores el bit de paridad no cambiara.
Evidentemente existen Checksums ms eficientes, aunque todo depende del uso que se le
haga. En cambio todos los das tratamos con este tipo de sistemas, y no hay que profundizar
siquiera en la informtica. En la mayora de datos personales que puedan ser sensibles,
suele existir un carcter o caracteres de control que verifican que los datos introducidos son
vlidos. Por ejemplo la letra de nuestro DNI no es ms que un checksum, que se obtiene
aplicando un mdulo 23 al nmero de la divisin. Al resultado (entre 0 y 22), se le asigna
una letra ya espeificada. Por ejemplo, el Cero es la letra T, el tres es la letra A de tal forma que si damos o introducimos nuestro DNI de forma incorrecta, es posible verificarlo
simplemente comprobando la letra proporcionada y ver si coincide con la que debera de
ser. A este ejemplo se le suman los carcter de control de los nmeros de cuenta corriente,
de otros datos del DNI, nmero de la seguridad social es una forma simple y efectiva de detectar con prontitud cualquier error en los datos tomados.
Otro uso increblemente extendido es en la verificacin de datos en s mismos, no solo en la
transferencia de estos. As por ejemplo, si se quiere disponer de algn tipo de archivo que
pueda tener datos relativamente sensibles como bios, firmwares, datos personales lo normal es ir aplicando checksums a determinadas partes del archivo incrustando este
mismo en las diferentes partes del archivo. De este modo, el software a medida que va
procesando el archivo puede ir verificando cada bloque para asegurarse de que el archivo es
confiable. Pensar en una bios que se quiere actualizar y por cualquier motivo existe un error
en uno solo de sus bits. Es suficiente para que el PC no arranque. Para evitar esto, se
distribuye por toda la bios checksums que van verificando bloques menores,
Su uso no obstante se ha ido reduciendo con la aparicin de los Hash CRC, los cuales
suelen realizar operaciones similares pero de una forma mucho ms efectiva. No obstante
para pequeos bloques de datos o comprobaciones sencillas suele ser ms fcil y barato de
implementar Checksums. Entre los Checksums ms habituales encontramos Sum8, Sum16,
Sum32 o Sum64.
CRC
Se traduce como comprobacin de redundancia cclica. Su objetivo y uso es muy similar al
del checksum, de tal modo que no es raro ver lugares en los cuales el nombre de CRC no es
ms que un tipo de checksum. La necesidad de la verificacin de los datos es algo de suma
importancia, siendo quizs su mximo exponente la firma digital, de la cual ya hablaremos
de ella. Pero no solo la deteccin de errores es necesaria, a veces es necesaria tambin la
correccin de estos. Aunque un checksum puede usarse para esto, es ms normal ver este
tipo de correctores como CRC. Aun as, los sistemas de correccin de errores suelen ser
costosos en cuanto a rendimiento, precio, implementacin tanto que normalmente no compensa, y es mucho ms eficiente simplemente un buen sistema de deteccin, y si la
deteccin es erronea simplemente se retransmiten de nuevo los datos. Si bien los
checksums pueden ser una herramienta muy extendida dentro de los propios archivos, los
CRC suelen ser usado de forma mucho ms extensa en la transmisin de datos, aplicado
normalmente a bloques de datos de un tamao mayor.
El peor escenario que puede darse en una transmisin de datos o en un error en un archivo,
es que este no pueda detectarse, haciendo que los datos sean enviados o procesados como
legtimos. Y es esto lo que se debe de evitar a cualquier precio. Por ello, los CRC son
usados intensamente en la transmisin de datos sobre internet, telefona y por supuesto en la integridad de los datos en un disco duro, CD, pendrive y otros dispositivos. Cuando
hablo aqu de integridad no me estoy refiriendo a sistemas de checksums que puedan estar
implementados en la misma estructura del archivo, sino sistemas de ingreidad que poseen
los propios dispositivos. Gracias a la integracin hardware y la simplicidad de como opera
un CRC (la mayora de ellos), la gran mayora de nuestro hardware implementa funciones
CRC en l mismo, sin necesidad de un software. Es decir todo el proceso es transparente a nosotros.
El funcionamiento de un CRC es simple. A un bloque de entrada se le aade primero los
bits correspondiente al CRC, y el nuevo bloque se divide por un polinomio preestablecido.
El resto de dicha divisin binaria ser el CRC. Dicho CRC se aade al bloque original y se
retransmite. El destino tomar el bloque y lo dividir por el polinomio generador (que ser
el mismo que us el emisor). Si el resto es cero, no hay error de transmisin, o al menos no
hay error detectable. La eficiencia radica por lo cual en el polinomio generador usado y
evidentemente en el nmero de bits usados para el CRC. El caso ms simple de CRC sera
el bit de paridad, que correspondera a un bit de CRC tan solo, y el polinomio generador
sera X + 1, el cual se traducira como 11 como divisor del mensaje de entrada. Un polinomio generador tal como X
5+X
4+X+3 se traducira por lo tanto como 110011 y se tendra un CRC de 6 bits.
Aun en los CRC-32, no se puede considerar CRC un hash seguro, no est pensado como
resultado nico de una posible entrada ni como sistema de ocultacin o cifrado de datos,
sino como un sistema robusto de deteccin de errores, y francamente, hace su trabajo a la
perfeccin. Gracias a este tipo de funciones hash, a da de hoy disponemos de medios de
comunicacin fiables y con una gran tolerancia a fallos. Que no apreciemos este tipo de
tecnologas, no implica que las estemos usando constantemente. Para hacernos una idea de
la eficiencia de los CRC, un CRC-16 tienes el siguiente ndice de deteccin:
Deteccin del 100% de errores simples (errores que afectan tan solo a un bit) Deteccin del 100% de errores dobles de bits adyacentes (Si dos bits consecutivos son
errneos) Deteccin del 100% de los errores para datos de hasta 16 bits. Deteccin del 100% de todos los errores de dos bits que no estn separados uno del otro
exactamente a 216-1 bits Para el resto de posibles errores, se establece tan solo una no deteccin en un fallo de
cada 216
Es decir, un cRC-16 sera capaz de detectar aproximadamente el 99.995% de todos los
errores. Esto es mucho o es poco? Esto equivale a que cada 20.000 errores, uno no se
detecta. Teniendo en cuenta las comunicaciones ultrarpidas de hoy en da, la cantidad de
informacin que es manejada en segundos es simplemente impresionante, por lo cual
podemos afirmar que de cuando en cuando efectamente aparecern errores no detectados.
Esto se subsana tambin gracias a la fiabilidad cada vez mayor de las propias redes, con
menos ruido, con mejores equipos
Los CRC ms comunes son CRC8, CRC16, CRC32 aunque si se desea ver una lista de ellos con sus polinomios generadores tan solo hay que acudir a la Wikipedia, por ejemplo.
Criptografa
En realidad son los Hash que nos van a interesar a nosotros. Este tipo de hash se usan ya no
solo como detectores de errores (que pueden valer para ello tambin). Este tipo de Hash, al
igual que los que hemos visto, es u procedimiento determinista que devolver un resultado
de una longitud fija. Pero a diferencia de los CRC o checksums en los que su objetivo
principal es la deteccin de errores, la funcin de un hash criptogrfico va mucho ms all:
La imposibilidad de poder encontrar una cadena (un bloque de datos) cuyo resultado sea un hash dado.
La imposibilidad de modificacin de la cadena inicial, sin modificar el hash. La imposibilidad de encontrar una segunda cadena que verifique un hash de otra cadena. Un hash que sea computacionalmente eficiente y facil de implementar.
Hay que comprender que con imposibilidad no podemos asegurar que sea imposible, sino
que el coste computacional para ello sera tan ingente que de ninguna forma sera factible.
Esto evidentemente no es ms que la teora, en la prctica todo no es tan simple.
A diferencia de los CRC o los checksums que pueden comprenderse sin muchas nociones
de matemticas y parten de unos conceptos simples, los hash criptogrficos son bastante
ms complicado de comprender (las matemticas escondidas detrs de ellos). Cada
algoritmo hash tiene sus propios fundamentos, basados en premisas diferentes, siempre
intentando cumplir cada una de las premisas dadas. No obstante podemos citar los Hash
criptogrficos ms usados a da de hoy, como pueden ser: MD4, MD5, RIPEMD, SHA-1,
SHA-256, SHA-512. Por supuesto existen muchos otros, aunque menos usados.
Posiblemente a muchos algunas de esos nombres les sea conocido.
Al cumplir las premisas citadas, los Hash criptogrficos suelen ser usados de forma
intensiva en los siguientes campos:
Comprobaciones de archivos Firmas digitales Tablas Hash Integridad de un mensaje/contenido
Dado que un Hash puede ser usado para detectar errores en el envo y/o recepcin de los
datos, un Hash criptogrfico puede ejercer funcin de Comprobador de archivos.
Mientras que CRC o checksum suelen aplicarse normalmente a porciones de cdigo, tramas
en las comunicaciones, pequeos detectores este tipo de hash en realidad no se disean como correctores de errores o para que el contenido sea reenviado si no es correcto. Este
tipo de Hash se suelen aplicar sobre un archivo completo (o conjunto de ellos). Para estos
Hash, no importa lo grande o pequeo que sea el dato a verificar (pensado especialmente
para grandes cantidades de datos en comparacin con CRC o checksum claro est).
Comprender su funcin en este caso es simple. Al contenido original se le apluca un Hash
criptogrfico el cual se adjunta al software/archivo original. Cuando el receptor lo descarga,
tiene acceso a l solo tiene que calcular el mismo el mismo Hash y comprobarlo con el Hash que ha sido descargado desde la fuenta original. La idea es que sl el hash es el mismo,
tenemos la certeza de que el archivo no se ha corrompido por el envo y la recepcin ha
sido satisfactoria. Por un principio similar, se puede verificar la integridad y veracidad de
dicho archivo, que no ha sido modificado por nadie, que es legtimo. Podemos afirmar esto
dada las propiedades ya vistas de este tipo de Hash: La imposibilidad de poder encontrar o
crear otro archivo que pudiese coincidir con el hash del archivo original, y por otro lado no
sera posible modificar el contenido del archivo sin alterar el hash que se calculara en el
destino.
Ver esto es muy fcil con algunos ejemplos. Tan solo tenemos que buscar un software que
sea distribuido por razones de seguridad con su hash. En este caso vamos a usar por
ejemplo la imagen de Windows 7 x64 Ultimate ENG. Imaginad que no te quieres molestar
en ir a la tienda y encuentras un vendedor supuestamente autorizado que te permite
descargar una copia de la imagen de Windows 7 (la misma que he expuesto ahi). Pero
claro quieres asegurarte de que la imagen sea legtima, y no sea una imagen modificada a la que se le haya puesto una activacin o algn crack para poder instalarla. Solucin?
Conocer el Hash de la imagen legtima. Me pongo en contacto con Microsoft o investigo un
poco para conocer el Hash de la imagen original y lo que obtengo es lo siguiente:
Windows 7 Ultimate x64 ENG: 7600.16385.090713-1255_x64fre_client_en-
us_Retail_Ultimate-GRMCULXFRER_EN_DVD.ISO
MD5: F43D22E4FB07BF617D573ACD8785C028
SHA-1: 326327CC2FF9F05379F5058C41BE6BC5E004BAA7
Lo nico que se debe de hacer en este caso es verificar si los valores que yo obtengo al
calcular el hash son esos o difieren. En teora con el clculo de uno de ellos es suficiente.
Para hacer esto se puede usar por ejemplo la utilidad md5sum sha1sum:
E:\Windows 7 Ultimate Final (EN-DE-JP-AR)>md5sum 7600.16385.090713-
1255_x64fre_client_en-us_Retail_Ultimate-GRMCULXFRER_EN_DVD.iso
f43d22e4fb07bf617d573acd8785c028 *7600.16385.090713-1255_x64fre_client_en-
us_Retail_Ultimate-GRMCULXFRER_EN_DVD.iso
E:\Windows 7 Ultimate Final (EN-DE-JP-AR)>sha1sum 7600.16385.090713-
1255_x64fre_client_en-us_Retail_Ultimate-GRMCULXFRER_EN_DVD.iso
326327cc2ff9f05379f5058c41be6bc5e004baa7 *7600.16385.090713-
1255_x64fre_client_en-us_Retail_Ultimate-GRMCULXFRER_EN_DVD.iso
Si dicha imagen hubiese sufrido cualquier tipo de modificacin el resultado sera muy
diferente. Por ejemplo, si a la imagen le modifico simplemente el primer bit (que es un
cero, y lo establezco a uno con un editor hexadecimal) y le recalculo el hash MD5, esto es lo que obtengo:
4420bc0022a2ca8a361111b7a4d24ea7
Es decir, modificando tan solo un bit, el hash es completamente diferente. Por los mismos
principios sera en la prctica imposible modificar aleatoriamente (o a conciencia) los bits
de forma que pudiese obtener el mismo hash. Y he dicho en la prctica por una razn
concreta que ahora veremos.
Vamos a suponer el caso concreto del Hash MD5. El Hash MD5 es un hash de 128 bits, lo
que significa que cualquier contenido al que se le aplique este hash, se obtendr una salida
de 128 bits, una cadena de 32 caracteres hexadecimales. Es decir, sin entender siquiera de
paradojas o estadstica, podramos afirmar que podramos obtener un mximo de 2128
posibles hash. Esto es un nmero un tanto ingente, tanto que posiblemente una mente no es
capaz de cuantificar, hablamos de 3.4 * 1038
es decir 34 con 37 ceros a su derecha. Pero aun cuando este nmero es mentalmente imposible de imaginar, si es posible de imaginar
que en el peor de los casos, cada ese nmero de hash calculados estos se volvern a repetir,
lo cual implica evidentemente que sera tericamente posible encontrar dos archivos
exactamente con el mismo hash. Esta afirmacin en realidad no rompe los esquemas vistos,
dado que no se rompe la veracidad al decir que es improbable modificar un archivo para obtener un hash concreto o encontrar ese segundo archivo que verifique dicho hash.
Aunque tericamente esto es posible, aun cuando solo fuese de forma estadstica.
Este es por tanto uno de los principales problemas de los hash criptogrficos, y a esto se le
llama colisin. Al margen de lo bueno o malo que sea el Hash, estadsticamente es posible
encontrar dos hash iguales. En este caso concreto visto, aunque es posible tericamente, en
la prctica si el Hash est bien diseado sera imprcticable. Cuanto tiempo necesitara un
PC en ser capaz de encontrar una colisin? Pues haciendo nmeros muy por encima 15 * 10
10 aos en el supuesto de que toda la poblacin mundial tenga un procesador de 4 ncleos
trabajando al mismo tiempo en la misma tarea 24 horas al da. Es decir en el peor de los casos sera virtualmente imposible.
El problema es que esta lgica no es as. Cuando se habla de una colisin en un hash hay
que recordar la llamada Paradoja del cumpleaos. Cabe sealar de nuevo que es muy diferente encontrar un contenido que verifique un hash concreto a encontrar dos contenidos
disferentes que posean un mismo hash. Lo segundo es una colisin. Es cierto que para el
primer caso la probabilidad sera la ya citada, pero no para el segundo caso, y aqu aparece
lo que puede parecer increible: La paradoja del cumpleaos establece que en una habitacin
con 23 personas, existe un 50% de probabilidad de que dos personas cumplan aos el
mismo da, y si fuesen 60 personas la probabilidad sera del 99%. No hay truco,
simplemente se busca una coincidencia entre cualquiera de las 23 personas, no una
coincidencia concreta dentro de las 22 restantes. Teniendo esto en cuenta, MD5 posee tan
solo 232
posibilidades de encontrar una colisin. Es decir, 4294967296 hash calculados de
4294967296 archivos aleatorios, estadsticamente debera de existir alguna colisin, es
decir, dos archivos diferentes que poseen el mismo hash. Y es evidente que este nmero si
que es comprensible y relativamente bajo, dado que un PC normal podra generar colisiones
de hash MD5 con relativa facilidad, y esto comenzara a invalidar los puntos en los que se
asienta un Hash criptogrfico. Es por esto que MD5 ha dejado de considerarse un Hash
seguro, y es solo cuestin de tiempo que quede en desuso, a favor de otros Hash ms
seguros.
En teora cualquier Hash debera de presentar posibilidad de Colisin, aunque es evidente
que si esta probabilidad es computacionalmente imposible, podemos afirmar que no existe
colisin (aunque tericamente exista). Para tener presente esto, pensar que al Hash MD4 es
posible encontrarle colisiones con tan solo en 256 hash.
A raiz de las Colisiones, aparecieron las primeras herramientas que han empezado a romper
del todo el Hash MD5. A da de hoy existen herramientas capaces de generar dos
programas diferentes que satisfagan el mismo Hash MD5, con lo que se rompe la seguridad
de MD5 para la verificacin de integridad y comprobacin de un contenido. Es evidente
que esto tiene matices. A da de hoy continua siendo imposible generar un contenido nuevo
que satisfaga un hash buscado (lo cual rompera de forma definitiva el Hash). Pero en
cambio si es posible producir dos archivos o dos contenidos que satisface el mismo hash.
Esto qued de manifiesto por el doctor Xiaoyun Wang, el cual incluso liber el cdigo de
una aplicacin que es capaz de realizar esto (En la cabecera de este artculo se puede
encontrar)
SHA-1 es el segundo Hash ms usado a da de hoy. A diferencia de MD5 (aunque basado
en sus mismos principios) es un hash de 160 bits, al cual se le ha podido establecer un
ndice de colisiones de 252
en el mejor de los casos. En dicho caso el clculo de una colisin
sera relativamente prctica de llevar a acabo, quizs un ao o dos aos en poder lograr
encontrar dos contenidos que compartan el mismo hash. No obstante se le contina
considerando seguro.
SHA-2 (conocidos como SHA256 y SHA-512) funcionan de forma muy similar a SHA-1,
anque en este caso producen salidas de 256 y 512 bits respectivamente. En ambos casos no
se conocen colisiones posibles.
Ante todo esto y dado que podemos asumir que tanto MD5 o SHA-1 son algo as como
estndares, ya est en marcha el nuevo concurso que ser seleccionado como sucesor de SHA-1/SHA-2 y que posiblemente ser el prximo estandar en Hash dentro de un par de
aos. Actualmente se ha comenzado la segunda ronda, y a final de este ao debera de
quedar todo ms o menos finalizado. La idea es encontrar un Hash ms seguro y que sea
muy eficiente su clculo ,es decir la velocidad con la que se pueda calcular el hash a un contenido. Se puede acceder a una lista de todos los candidatos de la segunda ronda en la
web oficial del NIST (Instituto nacional de estndares y tecnologa)
El ltimo uso que deberamos explicar son las Tablas Hash. Antes de entrar en detalle
sobre este tipo de prcticas sera ms correcto hablar antes de la Sal o Salt (en ingls).
Hasta ahora hemos visto funciones de los Hash criptogrficos para comprobar la integridad
de los archivos, pero que sucede si queremos usar un Hash como una especie de
encriptador de contenido? Esto podra no tener mucho sentido dado que cualquier persona puede calcular un hash MD5 por ejemplo a cualquier entrada pero en cambio no es posible partir del hash para obtener el contenido. Esto adquiere mucha ms relevancia
cuando se usan un hash para proteger detrs de l un contenido pequeo como un nombre
de usuario o una contrasea, y es aqu donde aparece el trmino y la idea de Salt. Salt es un
apndice que se aade a una cadena de entrada para generar un Hash no intuituvo
Dentro de la web, las cookies y otros contenidos que puedan ser sensibles de cara al
exterior como nombres y contraseas puede ser sometido a un hash criptogrfico para
esconder su significado original. Esto nos dar como resultado una salida nica, con lo que se podra usar dicha salida como contrasea y nombre del usuario de cara a un servidor,
en vez del texto plano. Esto incrementa de forma exponencial la seguridad de cualquier
base de datos o sistema de control de acceso. Pero como hemos dicho la utilidad de esto
podra ser relativa. Vamos a ver esto con 3 ejemplos que ilustrarn la eficacia o no eficacia
de un Hash para estos procesos, as como la implicacin de Salt:
Imaginemos que hemos robado un archivo que guarda las credenciales de acceso a una
importante base de datos. Imaginemos que dichas credenciales pueden ser almacenadas en
dicho archivo como texto plano, MD5 y MD5+Salt. Si abrimos ese documento
encontraramos esto para cada una de las opciones:
1. Nombre: Theliel Contrasea: perico
2. Nombre: 5A04B2D961488CDA31CD065F259783BE Contrasea:
DFE483413E24A5B1506389D36EBFD05C
3. Nombre: 217B11413677EE9D4806967515D66607 Contrasea:
8E50E5A474DDAF3BC370F87DD97EC7F0
En el primer caso, es evidente que si est configurado como texto plano, las credenciales
sern tomadas de forma directa y rpidamente podremos acceder a la base de datos.
En el segundo caso no obstante n oparece que sea posible descifrar absolutamente nada pero que pasara si hacemos uso de la inteligencia? Podemos intuir que es un hash, y si
buscamos informacin del sistema podemos incluso conocer que se trata de un Hash MD5.
No podemos revertir el MD5 (a priori), pero en cambio si podemos presuponer el nombre
de usuario y ver si hay una coincidencia con el hash que tenemos. Dado que el atacante es
listo, comenzara por cotejar en un diccionario que ya tiene el hash. Su diccionario no es
ms que una lista precalculada con quizs millones de posibles nombres de usuarios a los
que ya se les ha calculado el hash correspondiente. Si el hash se encuentra en su
diccionario, obtendr de forma automtica le nombre de usuario. Esto mismo se puede
aplicar a la contrasea. Que usuarios se probarn primero? Admin, admin, theliel, Theliel y en este caso, el diccionario encontrara que dicho hash corresponde a la palabra Theliel. En caso de la contrasea es exactamente igual, si la palabra o frase empleada en la
contrasea existe en su diccionario, obtendr directamente la contrasea buscada. Es por
ello que siempre es importante tener una contrasea alfanumrica de una longitud decente.
En el tercer caso la cosa es ms complicada. El atacante agotara todos sus diccionarios y
no lograra encontrar el hash deseado. Por qu? Porque lo que no sabe el atacante es que el
programa que codific el hash us una Salt, un trozo de datos que simplemente aadi al
final del usuario y la contrasea. As si el usuario escribi el nombre de usuario: Theliel, el servidor jams lo tom como tal, sino que automticamente le aadi el Salt TATA (en este caso). Es decir, de cara al servidor cualquier dato introducido es concatenado con
TATA. As, el servidor no calculara el hash de Theliel o de perico (la contrasea), sino de ThelielTATA y pericoTATA. dicha modificacin es seguro que no aparecer en su diccionario. La nica opcin del atacante es conocer la Salt usada por dicho servidor,
y crear as un programa que automatice el proceso, recalculando todos los hash de su
diccionario con la Salt aplicada y as con suerte obtener algn resultado. Esto lo trataremos
mejor cuando se vean las diferentes tcnicas para romper la seguridad.
Pero volvamos a las tablas Hash. Hemos explicado que la Salt o la importancia que puede
tener un hash para esconder unos datos, pero qu es una tabla hash? Dado que el ndice de colisiones es relativamente alto, podemos presuponer que no ser posible dar la
casualidad de tener a dos nombres de usuarios que compartan el mismo hash. Si esto es
cierto, para un servidor es mucho ms seguro no guardar jamas en sus bases de datos el
usuario o la contrasea como tal, solo sus Hash. Al introducir los datos el usuario, son sus
hash los que alcanzan el servidor y este simplemente tiene que cotejar dicho hash (el
usuario) en su base de datos para comprobar si existe una coincidencia. Si existe tal
coincidencia verificar el hash de la contrasea con el hash de contrasea ya almacenado. De
este modo nuestros datos de sesin no seran jams enviados como tales. Pero la utilidad de
las tablas de hash radica no en la seguridad (que por supuesto tambin lo es) sino su
eficiencia.
Hemos dicho que el servidor debera de verificar si el hash de nombre de usuario existe en
su base de datos. Pero como hace esto? Si nuestra base de datos posee 100 registros, en el
peor de los casos la base de datos debera de hacer 100 comprobaciones, para acabar en el
ltimo registro que sera el que coincidiese con el hash del usuario introducido. Pero aun, si
el usuario introducido no se encontrase en la propia base de datos, esta la habra recorrido
entera buscando una coincidencia. Este proceso sera muy costoso para los servidores.
Ahora bien, partimos de la premisa que el ndice de colisin de un hash MD5 es
relativamente alta, 4 mil millones aproximadamente. Podramos calcularle simplemente el
mdulo a dicho Hash (en funcin del nmero de ndices que tengamos en la base de datos),
el resultado sera un nmero de 1 a X, siendo X el nmero de entradas posibles en nuestra
base de datos. Es decir, pongamos que nuestra base de datos tiene 100 registros insertados y
tiene una capacidad mxima de 997 (por ser un nmero primo). Es decir, se aplicara la
operacin mdulo 997 a cada hash de entrada. Esto convertira todos los hash de entrada en
un nmero que ira desde el 0 al 996. Este nmero s podra ser usado como ndice, luego el
acceso al registro en la base de datos sera inmediato. Por razones de precisin, usar un
nmero de 128 bits no es aconsejable, lo normal es acotar este nmero a una resolucin de
64bits, tomando por ello los 64 bits primeros del hash o los 64 bits ltimos de este. En el
ejemplo anterior, al Hash Theliel se le aplicara mdulo 997, y el resultado sera: 5A04B2D961488CDA31CD065F259783BE -> 5A04B2D961488CDA MOD 997 = 763.
Es decir, que el nombre de usuario Theliel sera convertido al ndice 763 en la base de
datos. De este modo, al introducir Theliel en el navegador, se calculara el Hash, en el servidor se truncara y dara como resultado un ndice. Con este ndice el acceso a la base
de datos sera directo, Acceso a elemento 763. Asociado a dicho ndice se podra encontrar por ejemplo el hash de la contrasea y se procedera a realizar una simple
comparacin, si los dos hash coinciden se obtiene el acceso.
Esto evidentemente multiplica exponencialmente la posibilidad de una colisin, dado que el
espacio disponible ahora es de tan solo 997 elementos. Como hemos dicho la posibilidad de
colisin depender en gran medida de la ocupacin del espacio disponible. Por la paradoja
del cumpleaos no obstante, se dara el caso que con unos 35-40 elementos introducidos la
probabilidad de una colisin sera de un 50%!!. Para evitar esto se acude a tablas muco
mucho mayores en relacin al indice esperado de ocupacin que se tendr. Es decir, se
sacrifica espacio en post de velocidad. En la Wikipedia aparece un ejemplo parejo, en el
que se dice que con 2500 elementos introducidos en una tabla de un milln de elementos, la
probabilidad de colisin ascendera al 95%. Que hacer en caso de colisin? Primero
evitarlas, ya sean con grandes tablas o con crecimiento dinmico de estas. Por otro lado
asumir que es posible que exista una colisin, y disear el sistema de forma que ante una
colisin sea necesaria una segunda bsqueda en los registros afectados para determinar el
destino final.
Cifrado de datos
Este no es un trmino nuevo, y desde tiempos inmemorables es algo que se ha ido haciendo
de un modo u otro. Y es que seamos honestos no nos suele gustar la idea de que puedan invadir nuestra intimidad o interceptar cartas, mensajes, ideas que van hacia otra persona. Evidentemente esto toma una importancia mayscula cuando esta informacin es sensible o
de suma importancia. Quzs el primer gran ejemplo de criptografa en el mbito de las
comunicaciones fue sin duda la mquina Enigma.
Para quien no lo sepa, la mquina Enigma fue un dispositivo similar a una mquina de
escribir diseada all por los aos 30, siendo famosa por ser usada por los Alemanes
durante la Segunda Guerra Mundial. Era un dispositivo creado con inteligencia. Digamos
que posea tres discos con 26 posiciones cada uno. En cada una de esas posiciones se
mapeaba una letra. Cada letra de cada disco a su vez se encontraba conectada con el disco
vecino, y dependiendo de la posicin inicial de cada uno de los discos, la letra era mapeada
de disco en disco en una o en otra. Se diseaba de tal modo que al presionar una tecla de la
mquina, esta quedaba asociada con una letra mapeada del primer disco. En el primer disco
la letra se mapeaba a la letra de salida del primer disco (que no corresponda a la de
entrada) y en dicha salida se conectaba el segundo disco. El segundo disco tomaba de
entrada la salida del primer disco e igualmente que como haca este, internamente esa letra
de entrada la mapeaba a la salida. El tercer disco haca lo propio, tomaba la letra de salida
del segundo y segn su posicin en dicho momento la transformaba en otra diferente a su
salida. Despues de todo esto, un 4 disco (no obligatorio) haca que existiese un camino de
retorno, de forma que se pasase de nuevo por el tercer disco, despues por el segundo y
despus por el primero. La salida se conectaba a una bombilla que indicaba la letra
codificada. Para evitar separaciones de palabra, todo el mensaje era enviado sin espacios.
Posiblemente fue la primera mquina seria para cifrar comunicaciones. Hay que decir que,
segn dicen, gracias a que la alianza fue capaz de desencriptar la mayora de las
comunicaciones de los alemanes (gracias a que pudieron romper en gran medida el sistema
de Enigma) la guerra dur dos aos menos de lo que podra haberse alargado. Un buen
ejemplo sin duda alguna de criptologa.
Para nosotros es cosa del pasado. Vivimos en un mundo digital y un mundo en el que las
comunicaciones juegan un papel a da de hoy imprescindible. Por lo tanto es de sentido
comn que existan sistemas que podamos considerar seguros tanto para almacenar datos de
forma protegida como para ser capaces de crear canales seguros de comunicacin entre dos
puntos cualquieras del mundo. Precisamente porque las comunicaciones se han convertido
en algo imprescindible y de uso constante, no podemos hacer odos sordos y pensar
errneamente que nuestros datos no son de la importancia de nadie. Dado que los canales
de los que hacemos uso son pblicos, nuestra informacin, nuestros datos estn expuestos a
todos. Puede que a nadie le importe que otros puedan saber en un momento dado en que
blog escribe, que vean las fotos que tienen guardadas o las recetas archivadas. Pero seguro
que a nadie le gustara que humeen en su correo, en sus cuentas bancarias, en todo aquello
que pueda ser de ndole personal. Lo que pasa es que se presupone que todo es seguro y que
no existir nunca una intervencin externa y esto no es as. Como vimos con el Spoofing o como veremos en otros artcuos como el Sniffing, la intencin rara vez encaja con la
realidad.
Por todo ello vamos a introducirnos un poquito en los sistemas reales de proteccin que
podemos encontrar a da de hoy. Y digo reales porque posblemente gracias tan solo al
cifrado de datos es posible garantizar una intimidad a la cual tiene derecho todas las
personas. No vamos a estudiar la mquina enigma de ningn modo, vamos a ver los dos
sistemas de cifrado que disponemos en la actualidad, cada uno con sus pros y sus contras,
claro est:
Cifrado Simtrico Cifrado Asimtrico
Cifrado Simtrico
Un cifrado simtrico no es ms que algn sistema por el cual se encripta un contenido
aplicndole una clave (o key, del ingles llave) y se desencripta usando la misma clave.
Podemos pensar de un modo ms especfico en una contrasea, pero esta no es ms que una
particularidad de un cifrado simtrico. Por ejemplo, la mquina enigma era un dispositivo
de cifrado simtrico, en el que la key era la posicin inicial de los discos y el cableado
interno que mapeaba las teclas a los discos. Se usaba por tanto la misma disposicin si se
deseaba recuperar el mensaje original. En la era digital, nuestras key suelen ser lo que
comunmente llamamos contraseas, aunque no todas las contraseas son para cifrar. As por ejemplo llamamos contrasea a la cadena de caracteres que debemos de teclear para
poder encriptar un documento, pero tambin llamamos contrasea a la cadena de caracteres
que debemos de teclear para acceder a nuestro correo, y no se usa en modo alguno para
cifrar nada, solo como mtodo de control de acceso. En cualquier caso, esta key (no
usaremos el termino contrasea) en los cifrados simtricos sera la misma para encriptar un dato que para desencriptarlo.
Como vimos en su momento con los Hash, podramos suponer que con el cifrado simtrico
lo que sucede es algo similar. A un dato de entrada se le aplica una funcin que depende de
una key para producir una salida. Pero a diferencia de los hash, la encriptacin no es un
camino nico, es decir, la salida puede convertirse bit a bit exactamente igual a la entrada
cuando el mensaje se desencripta. Esto implica que la funcin que sea aplicada a la entrada
no ser sino una serie de modificaciones que se realizarn a los datos de entrada para
ocultarlos. Esas modificaciones dependern ntegramente de una key.
Segn el sistema usado por el sistema de cifrado, se puede clasificar dos tipos de cifrados
simtricos: Cifrado de bloques y cifrado de flujo. Pese a que pueda ser ms o menos
complicada la matemticas detrs de cada algoritmo de cifrado, no lo es tanto comprender
su funcionamiento.
Primero veamos el cifrado simtrico de flujo. El cifrado de flujo se pens idealmente para
aquellas tareas en las que se desea cifrar algo que se est generando en tiempo real. Es
decir, en un principio pensado para las comunicaciones. Esto tiene su lgica, si deseamos
encriptar un archivo de 20MB en disco por ejemplo, conocemos a priori no solo el tamao
completo del archivo, sino tambin cada uno de sus byte. En cambio cuando los datos a
transmitir son en tiempo real (por ejemplo) el modelo anterior no vale, tan solo podemos ir
codificando pequeos fragmentos de un todo, fragmentos tan pequeos como bytes o
incluso bits. Es decir, cada byte (por ejemplo) que se genera, se encripta y se enva. El
fragmento enviado por tanto tiene significado propio, puesto que aunque pertenece a un
todo, el mismo byte (en este caso) se desencripta directamente en el destino.
Pese a la complicacin que esto pueda parecer, es relativamente simple en concepto. La
idea es poder cifrar unidades mnimas de contenido sin que estas dependan de nada ms.
Pero esto crea un problema Si la misma key fuese usada para todos los bytes, sin siquiera conocer la key sera muy facil atacar un cifrado en flujo, dado que las unidades codificadas
son muy pequeas, sera fcil encontrar mensajes o partes de estos, patrones Para evitar esto lo que se hace con los cifrados de flujos es generar tambin un flujo constante de keys.
Esto suena raro el algoritmo de cifrado simtrico de flujo aplica una serie de operaciones matemticas seguras para generar a su salida un flujo constante de bits, no predecibles claro est, que a su vez son los que son usados para cifrar a su vez el flujo de datos. Vamos
a ver un ejemplo sencillo de esto aplicando posiblemente uno de los cifrados ms bsicos
que existe, el cifrado XOR. XOR es una operacin lgica que dice lo siguiente:
style=text-align: justify;>Si A = B => A XOR B = 0. Es decir, se puede expresar como A XOR A = 0
style=text-align: justify;>Si A != B => A XOR B = 1. Es decir, se puede expresar como A XOR 0 = A
Al igual que con los hash, imaginemos una funcin tal que F (key) = Kflujo
Si tenemos lo anterior en cuenta, ahora imaginemos dos flujos de datos constantes de bits:
Es decir, el flujo
constante de datos a
enviar se combina
mediante una operacin
XOR con un flujo de
datos constantes tambin
generado por una Key
inicial gracias a un
algoritmo dado. El
receptor en nuestro ejempli tan solo tendra que generar el mismo flujo de datos desde la
key original y aplicar la misma operacion XOR a los datos recibidos, de ese modo el
mensaje original se reconstruira. De este modo, a partir de un cifrado simple y lleno de
problemas como pueda ser un cifrado XOR, se logra que sea consistente gracias al flujo
constante de bits derivados de la key original.
No obstante, por regla general los cifrados en flujo son mucho menos robustos que los
cifrados en bloques, y estos a su vez pueden actuar como cifrados en flujos, lo que poco a
poco deja a los cifrados simtricos de flujo en desuso. No obstante, a da de hoy continan
siendo una fuerte columna vertebral de las comunicaciones, siendo su buque insignia el
cifrado RC4. Aunque es un cifrado que ya no podramos considerar seguro dado a los
ataques pertrechados hacia l con relativo xito, contina siendo un cifrado
extremadamente simple de implementar y de procesar, lo que lo hace ideal para tareas en
las que la seguridad a lo mejor no es crucial, pero si importante. Por ejemplo, RC4 es el
cifrado que usan las redes WIFI que usan WEP, el algoritmo de cifrado es RC4, y como
todos sabemos WEP es un sistema a da de hoy completamente roto. Otros ejemplos de
RC4 fue su uso (cada vez menos habitual) en certificados digitales (ya veremos esto ms
adelante). Y posiblemente los amantes de las redes Torrent podrn ver en muchos de sus
clientes la opcin de cifrar todo mediante RC4. Como vemos, aunque no nos otorga un
grado de seguridad completo, para muchas tareas es bastante til. En la actualidad existen
otros cifrados de flujos ms seguros que RC4, como por ejemplo las alternativas eStream.
Personalmente no creo que vuelvan a ponerse de moda los cifrados en flujos, y que se
continuar con la tendencia de los cifrados en bloque.
El cifrado simtrico en bloques difiere en concepto del cifrado en flujo. En este caso no se
pretende a priori cifrar bit a bit un contenido, sino aplicar a un bloque de un tamao
preestablecido una serie de transformaciones (evidentemente reversibles) para dar como
resultado una salida encriptada de dicho bloque. La pregunta podra estar entonces, que si
dicho bloque es pequeo y el cifrado de flujos acta sobre unidades grandes, ambos conceptos podran ser iguales. Y esto es cierto.
En el caso del cifrado en flujo lo importante es la forma en la que se generar el flujo de
keys y el sistema que se realizar para combinar los dos flujos. Aqu el sistema es mucho ms complejo y slido normalmente. Normalmente un mensaje que se quiere cifrar es
dividido en bloques (de ah su nombre) de tamaos de 64-256 bits cada uno. Lo ideal por
tanto es siempre encriptar un contenido que sea cientos de veces dicho nmero, con lo que
Datos para Enviar Mensaje XOR Key Datos Enviados
Mensaje Original: 10100111 0 1011001
Kflujo: 11001011 1 1100100
Mensaje Final: 10100111 1 0111101
se tendran cientos de bloques independientes. Cada bloque suele funcionar del mismo
modo, las mismas operaciones que se aplican a uno se aplican a otro. No obstante, al igual
que sucediese con los cifrados de flujo, lo normal es que la key original tan solo sea key del
primer bloque, siendo la key del resto de ellos una key derivada ya no solo de esta, sino del
contenido encriptado, lo cual hace ya de por s complicada su bsqueda. La diferencia por lo tanto entre los diferentes cifrados de bloques radicar en esas transformaciones
realizadas dentro de los bloques para obtener el resultado.
Normalmente, a estas transformaciones se les denominan Etapas, y no es extrao ver cifrados de bloques con varias de ellas. Por ejemplo el Cifrado AES consta de entre 10 a 14
etapas, dependiendo de la longitud de su Key. Al final de todas las etapas de cada bloque,
se genera el mensaje cifrado, que en contraposicin con el cifrado de flujo, aqu
normalmente cada bloque cifrado es dependiente de todo su bloque, no existe una
correspondencia bit cifrado bit descifrado.
Pese a que cada algoritmo es diferente, los cifrados de bloques igualmente tienen diferente
modos de operacin. Cada uno de ellos no difieren por el tipo de transformaciones
aplicadas, sino ms bien por las interacciones entre sus bloques. As por ejemplo, el sistema
ms sencillo de cifrado por bloques sera aplicar a cada bloque una funcin matemtica tipo
Fbloque(Key) = Bloque_Cifrado. Es decir, a cada bloque se le aplicara siempre la misma key
de forma independiente. Este esquema se contempla, y se llama sin ir mss lejos ECB.
Un paso ms all sera algo similar a lo que se ha visto con el cifrado de flujos. En este caso
cada bloque no es independiente. En el modo CBC el bloque cifrado se combina mediante
una operacin lgica XOR con el bloque aun sin cifrar del siguiente bloque, y el resultado
ser el bloque que, ahora s, se pasar a cifrar. De este modo simple, se logra una
dependencia completa de cada uno de los bloques, haciendo inviable muchos ataques
criptogrficos.
Aunque existen otros sistemas de funcionamiento de los cifrados de bloques, la mayora
aplican el concepto explicado para CBC (Cifrado de bloques en cadena) pero en diferentes
partes. Por ejemplo, se podra realizar la operacin XOR en vez de entre el bloque cifrado y
el bloque siguiente sin cifrar entre el bloque sin cifrar y el bloque cifrado de un mismo
bloque y realizar a continuacin otra XOR con el bloque sin cifrar siguiente, y a esto se le
llamara PCBC.
Estos modos de funcionamiento que pueden parecer no tener importancia, la tienen y
mucha. Un test bastante conocido para comprobar la resistencia de un sistema de cifrado
frente a la posible repeticin de patrones, es la codificacin de una imagen. Una imagen
suele tener patrones que se repiten constantemente, es decir, en una imagen suelen existir
zonas uniformes que pueden tener el mismo contenido. Luego una imagen es un ejemplo
perfecto para atacar a un cifrado. Como se realiza esto? Una imagen no son ms que
puntos distribuidos uniformemente sobre toda una superficie, cada cual con un color. Si
quisisemos almacenar una imagen en nuestro sistema, el mtodo ms simple sera
simplemente tomar cada punto de la imagen de forma consecutiva e ir aadindolo a un
archivo binarios simplemente especificando su color. Esto se comprende mucho mejor con
un ejemplo. Pensar en que tenemos una imagen de 5 x 5 pixeles, cada uno de los pixeles
est codificado en RGB con 1 byte para cada canal, es decir, que cada punto se
representara en una matriz de (53)x5 en la cual cada elemento constituye un byte (un
valor entre 0 y 255) . Esta podra ser nuestra imagen expresada como una matriz de puntos:
128 045 135 236 002 237 112 222 012 087 158 255 000 055 099
128 045 135 236 002 237 112 222 012 087 158 255 000 055 099
128 045 135 236 002 237 112 222 012 087 158 255 000 055 099
128 045 135 236 002 237 112 222 012 087 158 255 000 055 099
128 045 135 236 002 237 112 222 012 087 158 255 000 055 099
En un archivo binario esto se almacenara simplemente un valor tras otro. Para visionar
dicha matriz de puntos tan solo tendramos que conocer esta distribucin y aplicarla a la
pantalla de nuestro monitor. Sabemos que es una imagen de 55 con 3 canales de color,
con lo que el PC tan solo debera de tomar los valores de 3 en 3. Cada 3 valores obtendr el
color de cada pixel, y su ubicacin dentro de la matriz corresponder a la ubicacin del
pixel en la pantalla. Este sistema no obstante no puede aplicarse a los algoritmos de
imgenes actuales como JPG, PNG, TIFF ya que estos de un modo u otro aplican compresin a las imgenes (ya sea con prdida o sin ella), y no se podra comprobar lo que
queremos explicar. Podramos llamar a esto una imagen RAW, el problema de llamarlo as
sera la confusin que ocasionara con las imgenes RAW de las cmaras de fotos.
Visto esto, veamos la aplicacin real. Primero partiremos de una Imagen RAW Fuente
creada para tal ejemplo a la que he llamado egocntricamente Theliel, Alma Oscura era muy largo para este propsito:
Evidentemente la imagen mostrada aqu no es una imagen RAW (Entendiendo RAW no
como imagen de las cmaras de fotos), es una conversin a png para que el navegador
pueda mostrarla. Pero que es lo que sucede cuando la codificamos con un algoritmo como
AES-256 (el cual veremos ms adelante)? Para ello se ha realizado dos simples
conversiones, una usando el mtodo ECB y otra usando el mtodo CBC:
La primera pertenece a la codificacin ECB, mientras que la segunda imagen corresponde a
la codificacin CBC. Ambas imgenes hablan por si mismas. Si se accede a las versiones
grandes, se puede comprobar aun mejor que incluso cuando se est codificando con AES-
256 (un cifrado muy fuerte), cuando se realiza en ECB la imagen puede ser adivinada,
incluso el texto es completamente legible. La imagen no es del todo clara, pero se puede
apreciar perfectamente el contorno de la manzana de Apple. Esto nos plantea lo que a mi
parecer es uno de los grandes problemas de la seguridad, y es que el problema no radica ya
en encontrar sistemas que sean seguros, sino en el uso que se den de ellos. Que exista el
mtodo ECB no implica que sea una buena opcin usarlo. El resultado de un cifrado en
ECB de cada bloque es el mismo si el bloque a encriptar no vara. En una imagen, no es
raro encontrar estos patrones, y dado que podemos representar de una forma grfica esta
encriptacin, obtenemos un resultado realmente curioso, como el que hemos mostrado. En
contrapartida, al usar CBC, cada bloque tenga o no tenga la misma informacin, ser
codificado de forma diferente, dado que la codificacin de cada bloque depende del
anterior. El resultado es una nube de pxeles de colores sin sentido alguno, quedando la
imagen real completamente oculta.
Los cifrados de bloques segn lo explicado, no obstante deja algunas incgnitas como que
sucede cuando el contenido a cifrar no corresponde a un tamao mltiplo del tamao de
bloque o que sucede con aquellos bloques que requieren de un bloque anterior (o posterior)
y no lo poseen dado que son el primero o el ltimo.
Respecto al primer problema, el tamao de bloque, se acude a una tcnica mas que
conocida por la mayora de los programadores, el Padding. Es decir rellenar. Si los bloques son por tanto de 64bits y el ltimo bloque tan solo tiene 32, los 32 bits restantes se
rellenaran. Esto hace a su vez aparecer un problema aadido la salida tendr un tamao siempre mayor que la entrada, dado que ser necesario aadir tantos bits como sea el caso
para poder completar el bloque. Y el segundo problema que aparece es con que datos
rellenar ese Padding, lo que produce a su vez que sea complicado esclarecer el tamao
REAL del mensaje original. Para esto existen diferentes tcnicas ms o menos elaboradas,
pero decir al menos que rellenarlo todo con simples carcteres null (nullo) no sera recomendado.
Respecto al segundo problema, lo normal es que exista una entrada adicional a la Key y al
contenido a cifrar en el sistema, que se denomina como vector de inicializacin (IV). No
obstante, dado que estos vectores no pertenecen al algoritmo dado y normalmente no es
dado tampoco como dato de entrada, lo normal es que la propia implementacin del
algoritmo lo establezca. Otra solucin sera no usarlo o suponer que de no expresarlo, el
vector de inicializacin ser una cadena de ceros.
No han sido pocos los cifrados de bloques que han existido y existen. Muchos de ellos
buscando siempre ser el mejor en cuanto a seguridad se refiere, otros por ser los ms
rpidos, otros por ser mejores en otros fines y se lleg al absurdo de que existan un sin fin de cifrados de bloques que eran usados. Todo ello por supuesto sin contar con el
secretismo. Antes se pensaba que cuanto ms secreto fuese un cifrado, ms invulnerable
era. Esto pareca lgico, si nadie sabe como se implementa o como funciona, lograr
desencriptarlo sera complicado. El problema no obstante es que un milln de cabezas
piensan ms y mejor que unas cuantas cabezas de ingenieros que en su da crearon dicho
algoritmo.
As, posiblemente el primer cifrado por bloques que lleg a convertirse en un estndar y
publicado como tal fue DES (Estandar de encriptacin de datos). DES contaba con una key
de 56bits, bloques de 64 bits y un total de 16 rondas. Al margen de lo seguro o no que
pudiese ser, hoy por hoy sera impensable un sistema de cifrado con key de 56bits. En el
peor de los casos por simple fuerza bruta seran necesarias 256
comprobaciones, y con el
hardware actual sera un valor fcilmente alcanzable. En 1998 se cre un hardware barato que fue capaz de obtener una key DES por fuerza bruta en tan solo 56 horas, aunque un ao
ms adelante tan solo necesit 22 horas. Esto hizo replantearse seriamente el uso de DES.
Despus de esto, se comenz con el uso del sucesor de DES, llamado Triple DES,
publicado en 1998 y que bsicamente era igual a DES, pero usaba un conjunto de 3 Key
DES de 56 bits cada una. En algunos esquemas estas Keys eran independientes, en otros
eran keys derivadas. Y aun que a da de hoy se puede considerar Triple DES como seguro,
la realidad es que en 2001 fue publicado oficialmente AES. Al igual que se hiciese con los
Hash SHA, el perodo de estandarizacin de AES fue de 5 aos. 5 aos en los que
compitieron los mejores algoritmos de cifrado de la poca, algunos de ellos conocidos
dentro del mundo de la criptografa: RC6, Serpernt, Blowfish y por supuesto el ganador: Rijndael, que pasara a ser llamado AES (Estandar avanzado de encriptacin). AES se
estandariz con 3 longitudes de key diferente, as existe a da de hoy AES-128 AES-192 y
AES-256, con un tamao de bloque de 128 bits. No obstante, el algoritmo original permita
bloques de diferente tamaos y keys.
AES a da de hoy es completamente seguro. Tal es as, que el gobierno de EEUU acept el
uso de AES-256 para su uso en su material clasificado como Alto secreto y AES-128 AES-192 para su material clasificado como Secreto. Es decir actualmente y posiblemente por muchos muchos aos, AES permanecer como cifrado simtrico estandar
y seguro.
El como funciona AES en realidad no es tan complejo si comprendemos el funcionamiento
de los cifrados de bloques. Lo nico que habra que conocer son las transformaciones que
se realizan en los boques, esas 10-14 etapas que se llevan a acabo en cada bloque. En
primer lugar lo que AES realiza es generar una subkey de bloque derivada de la key
original e interpreta la hilera de bits del bloque (128 bits) como una matriz de 44 bytes (1
Byte son 8 bits, 4x4x8 = 128 bits). Una vez se ha creado la estructura bsica del bloque, se
aplica el cifrado XOR a la matriz entre esta y la subkey de bloque generada. Una vez
realizada esta operacin, se realizan una series de operaciones en la matriz, como
desplazamiento de columnas, mezclado y otras operaciones no lineales. Para acabar se
realiza de nuevo una operacin XOR con la subkey que corresponda (diferente a la key de
la primera XOR). La matriz resultado se enva como bloque cifrado en una sucesin de
bytes.
Como vimos en el ejemplo anterior, AES-256 en realidad s que es extremadamente seguro,
pero es necesario siempre un buen uso de dichos cifrados. Para terminar un pequeo
ejemplo de un esquema de codificacin simtrica, mostrando muchos de los conceptos aqu
tratados:
CrypTool 2 Beta
En el esquema se puede observar como existen tres elementos principales de entrada: El
archivo a codificar llamado Original, la Key usada llamada Key y un generador aleatorio de IVs. Los bloques en azul claro corresponderan a los algoritmos de cifrado, en
este caso se ha usado AES-256 ECB y CBC y DES ECB. Por ltimo los archivos de salida
generados de los procesos aplicados. Se observa no obstante que para los mdulos AES no
se ha usado una entrada IVs. Lo que sucede es que el vector de inicializacin en este caso
sera 00000000000000000 (8 bytes). DES por el contrario requiere que se incluya, por
ello se ha usado un generador aleatorio de IVs, que no es ms que un generador aleatorio de
valores de 8 bytes en este caso, dado qeu DES requiere un IV de 8 bytes, es decir, del
tamao de cada bloque (64 bits). Cabe destacar que para la desencriptacin del archivo
cifrado DES sera necesario suministrar exactamente el mismo IVs, de lo contrario no sera
posible recuperar el archivo original. Para esto, siguiendo el esquema, sera tan siple como
incluir en la entrada del supuesto mdilo de desencriptacin DES otra salida del mismo
generador de IVs.
El cifrado simtrico es seguro cuando se usa un algoritmo y sistema de cifrado correcto.
Cifrado Asimtrico
El cifrado simtrico es seguro, es cierto pero estar siempre enfrentado a una serie de ataques que antes o despus es posible que sean rotos. Y su principal desventaja no es
esa es la key. El cifrado asimtrico apareci como alternativa a ello. Pero vamos a ver primero la necesidad del cifrado asimtrico, sera absurdo crear un sistema que no tenga
una utilidad.
Hemos dicho que el cifrado simtrico tiene dos problemas. El primero de ellos es que est
basado en algoritmos de dos sentidos, es decir, prcticamente (por no decir todas) todas las
transformaciones que sufre el bloque por las diferentes etapas son funciones invertibles que
a travs de la misma key se puede reconstruir el mensaje (dato) original. Esto implica que
la fortaleza del algoritmo simtrico recaiga tan solo en las transformaciones algebraica que
se realizan sobre el bloque. De ah que prcticamente todos los cifrados simtricos que se
han estudiado antes o despus se descubren diferentes ataques a sus diferentes etapas. Por
ejemplo, para AES existen ataques exitosos en versiones reducidas de este, es decir, AES
con menos etapas. Si AES-128 posee 10 etapas, a lo mejor se ha logrado ataques que
pueden considerarse una roptura (es decir, que son computacionalmente posibles) para
versiones de 6 o 7 etapas tan solo. La idea de estos ataques es ir logrando cada vez ms
romper cada etapa, de modo que al ir aadiendo una etapa ms, el coeste computacional
pueda considerarse factible. Si se llega a obtener un ataque a AES-128 en el que el coste
computacional obtenido sea de 280
(por ejemplo) se considerar una roptura, frente a 2128
posibilidades iniciales.
El segundo problema al que se enfrenta el cifrado simtrico es la Key. La key es necesaria
tanto para cifrar un mensaje como para desencriptarlo. Esto implica que tanto origen como
destino tengan que compartir dicha Key. Esto a simple vista puede carecer de importancia,
pero esto quiere decir que si queremos realmente una seguridad decente, en el mejor de los
casos tendramos que tener una key diferente de comunicacin con cada uno de los usuarios
con los que deseamos entablar una comunicacin segura, dado que no usaramos nunca la
misma key con otros usuarios, de ser as otros usuarios podran leer los mensajes que eran
destinados para otros. Esto provoca la necesidad de mltiples keys para cada usuario, lo
cual es engorroso e inseguro, dado que la comodidad podra implicar usar la misma key en
todas las comunicaciones y esto supondra un problema de seguridad.
El cifrado simtrico resuelve estas dos cuestiones. La primera de ella haciendo uso de lo
que podramos llamar Matemtica Imposible. En el cifrado simtrico se logra un algoritmo de cifrado de un nico sentido, el cual no es computacionalmente viable el
invertirlo. Podemos decir as que existen en realidad dos algoritmos diferentes dentro de un
esquema de cifrado asimtrico, un algoritmo que encripta y otro que desencripta. Y al
contrario que sucede con las transformaciones o la lgebra aplicada a un algoritmo
simtrico, en la criptografa asimtrica esta funcin suele ser mucho ms simple, lo cual no
implica que sea ms rpida, todo lo contrario. As por ejemplo el cifrado AES requiere de
10 etapas mnimas para completar el cifrado de un bloque, mientras que el el cifrado RSA
esto se limita a una simple funcin, aunque lo que no es simple es la teora y el clculo de dicha funcin. Estas funciones se basan en la premisa de que es imposible invertirlas, as
por ejemplo tenemos el problema matemtico de la factorizacin (usado en RSA) y el del
logaritmo discreto (usado en ElGamal). Vamos a basarnos por simplicidad y fcil
compresin en RSA. Posiblemente hasta los nios ms pequeos aprenden a temprana edad
que es la factorizacin de un nmero. Factorizar un nmero no es ms que encontrar sus
factores, es decir, los diferentes nmeros que lo dividen, es decir, aquellos nmeros que al
dividirlo dan como resto cero:
Factorizacin de 20: 1,2,4,5,10 ya que 20 mod 10 = 0 20 mod 5 = 0.
Todos sabemos factorizar un nmero, el problema radica en dicho mtodo. El problema
reside en que la nica forma real de obtener los diferentes factores de un nmero (as como
saber si dicho nnero es por ejemplo primo) radica en ir dividiendo dicho nmero por cada
uno de los nmeros desde el 2 (el 1 es factor de todos los nmeros) hasta n-1, siendo n el
nmero a factorizar. Si disponemos de un nmero relativamente pequeo como el 101,
podemos simplemente ir dividiendo este por 2, por 3, por 4 hasta llegar al 99. En realidad a la hora de encontrar los factores no es necesario llegar a dicho nmero, tan solo es
necesario realizar Raiz (n) operaciones. Es decir, en el caso que el nmero a factorizar
fuese 101, en realidad tan solo sera necesario ir probando Raiz (n) = 10 aprox, es decir,
despus de 10 operaciones podramos conocer si realmente 101 es primo: 101/2, 101/3,
101/4 101/10. Esto podra parecer no tener complicacin alguna, 10 operaciones podramos hacerlas incluso a mano. Pero que sucede cuando el nmero a factorizar es
infinitamente mayor? Podramos pensar que un PC actual podra manejarlo en segundos,
pero esto no es as. Existen diferentes algoritmos que intentan dar una opcin viable a la
factorizacin sin necesidad de usar divisiones una a una, el problema es que estos
algoritmos no son fiables al 100% ni mucho menos, produciendo lo que se conocen como
falsos nmeros primos. Aun as, cuando se manejan los nmeros tan ingentes que pronto
veremos, ni haciendo uso de estos algoritmos sera posible. Vemos por tanto en este caso,
que la matemtica detrs de la factorizacin es ms que conocida, es sencilla, pero es
computacionalmente imposible para grandes nmeros.
Respecto al segundo problema comentado, la key, en el cifrado asimtrico no existe una
sola key, sino dos. Una key se denomina como clave pblica y la otra como clave privada.
El concepto es simple. Cada una de las claves son complementarias y pueden ser usadas
tanto en el algoritmo de encriptado como en el de desencriptado, es decir, lo que encripta
una clave lo desencripta la otra. No hay que pensar en clave pblica como clave para
desencriptar, sino clave que se distribuye a todo aqul con el que deseamos entablar un
canal seguro. A diferencia que el cifrado simtrico en el que es necesario una key nica
para cada canal de comunicacin, aqu ser la clave pblica la que ser usada para todos.
Este concepto choca al principio, una clave que se da a conocer a todos. Por otro lado la
clave privada ser el mayor secreto para su dueo, y es aqu donde reside la vulnerabilidad
desde mi punto de vista del cifrado asimtrico. Visto esto, es lgico asumir que el par de
claves (privada y pblica) deben de estar relacionadas de modo alguno, pero sin que pueda
suponer un riesto el conocimiento de dicha clave pblica.
Estas dos caractersticas hacen que el cifrado asimtrico sea a da de hoy posiblemente el
sistema ms seguro en cuanto a encriptacin de datos, y ello puede verse diariamente.
Todas las comunicaciones cifradas a da de hoy que requieren de una privacidad
importante, estn basadas de un modo u otro en cifrado de clave pblica (o cifrado
asimtrico). No obstante no todo son ventajas. El cifrado asimtrico para empezar requiere
de una capacidad de computacin muy superior a la del cifrado simtrico para realizar la
encriptacin o desencriptacin, llegando a ser cientos de veces ms lento. Por otro lado se
requieren por regla general keys de una longitud muy superior a lo que es habitual
encontrar en el cifrado simtrico. Por ejemplo AES-256 (Key de 256 bits) frente a RSA,
que puede usar Keys de entre 1024-4096 bits. Aunque una Key de 4096 bits (512 Bytes)
sea un tamao irrisorio para las comunicaciones, nadie sera capaz de recordar jams una
clave de 512 caracteres. En contrapartida, con AES-256 (32 Bytes) por un lado no sera
complicado recordar una frase de 32 caracteres, pero adems no es necesario, dado que
generalmente las subkeys usadas son generadas apartir de nuestra clave introducida. Pero en el cifrado asimtrico esto no funciona as, no existen keys derivadas, una para encriptar
todo el mensaje, una para desencriptar todo el mensaje.
Este problema de keys grandes se une al echo de la necesidad de que una Key pblica sea
conocida. Si deseamos que alguien encripte un mensaje hacia nosotros, este mensaje deber
de cifrarlo usando nusetra key pblica, luego dicho usuario deber tener acceso a nuestra
key pblica. Del mismo modo si queremos responder a dicho mensaje, tendremos que o
usar la clave publica de dicho usuario para encriptar la contestacin o encriptar la
contestacin con nuestra clave privada, ya que el receptor dispondr de nuestra clave
pblica para desencriptarlo o su clave privada. Para que esto pueda ser posible, hace ya
mucho tiempo que se establecieron bases de datos de claves pblicas, de modo que
cualquier persona pued acceder a ellos de forma simple y conocer la clave pblica de
cualquier persona.
Posiblemente los dos algoritmos de cifrado asimtrico ms conocidos sean como hemos
dicho RSA y ElGamal. Cada uno de ellos se basa en una imposibilidad matemtica y por
comodidad vamos a explicar como funciona RSA a grandes rasgos.
RSA como hemos dicho se basa en la imposibilidad matemtica de factorizar un nmero
grande. El proceso no es muy complejo. Lo primero es generar las claves que sern usadas,
tanto la privada como la pblica:
1. Tomar dos nmeros primos, llamados p y q, los cuales por seguridad se requiere que ambos tengan una longitud de bits similar, para garantizar en caso de un posible ataque el peor de los casos posibles, y por otro lado que puedan escaparse a los algoritmos conocidos de bsqueda de primos. Estos dos nmeros es normal encontrarlos de al menos 512 bits de longitud, es decir, un nmero con ms de 154 cifras.
2. Se calcula n = p x q, y acto segido la funcin Phi de Eulerm definida como Phi (p x q) = (p-1)(q-1). La funcin Phi de Euler calcula el nmero de coprimos que existen a un nmero dado. dos nmeros son coprimos si no tienen ningn factor en comn salvo el 1. Es decir, aunque el 10 no es un nmero primo, el 14 es coprimo de 15, dado que tan solo comparten el factor comn uno. Dado que tanto p como q son nmeros primos (ta solo divisibles por 1 y por ellos mismos) poseern cada uno un nmero p-1 y q-1 de coprimos cada uno.
3. Se escoge un nmero e que se encuentre entre en el intervalo 1 < e < Phi(p x q), de modo que e y Phi sean coprimos entre ellos. Si e a su vez es primo mejor.
4. Se calcula d en la siguiente funcin: d x e = 1 (MOD Phi (pxq)). de = 1 MOD Phi(pq) es quizs el principal problema de comprensin en RSA. Esta funcin recibe el nombre de multiplicacin modular inversa, y se calcula de forma simple gracias al mtodo extendido de Euclides. En realidad es tan solo matemticas aplicadas. NOTA: Los Iguales que son especificados en estas igualdades en las que implican operaciones modulares, no son en realidad Iguales, sino Congruentes, es decir equivalentes. Escribir d x e = 1 (MOD Phi (pxq)) siendo ese Igual el smblo de congruencia, significa que 1 = dxe MOD Phi, siendo ese Igual un Igual de los de toda la vida.
Despus de estos 4 pasos, la clave privada y la clave pblica estarn ya creadas. La clave
privada corresponder entonces a la tupla Clave_privada (n, d), mientras que la clave
pblica a la tupla Clave_pblica (n, e). Una vez obtenidas sendas claves tan solo es
necesario aplicar la funcin de encriptacin o desencriptacin. Por cuestiones de Padding y
seguridad, el mensaje es convertido a un nmero entero m, menor a n:
me = Cifrado MOD n -> Se obtiene as un valor en Cifrado
Cifradod = m MOD n -> El valor Cifrado ser desencriptado por medio de dicha funcin y
se obtendr m, es decir el mensaje original. Tan solo es necesario deshacer el padding.
Como se pueden ver, en realidad las funciones de encriptado y desencriptado son sencillas.
Si quisisemos llevar esto a un ejemplo real a pequea escala (con nmeros pequeos):
a) p = 101, q = 103 -> Ambos nmeros son primos, de longitud similar (aunque nmeros
muy pequeos).
b) n = p x q = 101 x 103 => n = 10403. Phy (10403) = (101 1) (103 1) => Phi = 10200
c) 1 < e < Phi => 1 < e < 10200 => e = 13. 13 a su vez es primo y coprimo de 10200. Esto
puede comprobarse de forma sencilla gracias al algoritmo de Euclides.
d) d x e = 1 (MOD Phi (p x q)) => d x 13 = 1 MOD 10200. Esta ecuacin se expresa del
mismo modo como: d-1
= e MOD Phi. Si se aplica el mtodo extendido de Euclides se
puede obtener de forma sencilla la identidad de Bezout. El mtodo de euclides no es ms en
realidad que ir dividiendo dividendo entre divisor. Una vez se realiza la operacin, el
divisor pasa a ser dividendo y el resto divisor y se realiza otra iteracin, hasta que se
obtiene un resto de 1. A cada iteracin se le calcula sus dos coeficientes para generar as la
igualdad de Bezout. En nuestro caso para la iteracin 5 (en la cual el resto es 1) del mtodo
extendido de euclides estos son 5 y -3923. calcular estos coeficientes se obtienen por
sustitucin de las iteraciones anteriores. En la iteracin 3 se obtienen los coeficientes
sustituyendo en esta la igualdad de bezout obtenida en la iteracin una y dos. Las
iteraciones una y dos a su vez se conocen de antemano:
restoi= Combi = Comb (i-2) + Comb (i-1)
Ronda Divndo. Div. Cociente Resto Sustitucin Combinacin Coef.
1
Coef.
2
1 10200 13 - 10200 - 10200=10200*1+13*0 1 0
2 10200 13 - 13 - 13=10200*0+13*1 0 1
3 10200 13 784 8=10200-
13*784
8=(10200*1+13*0)-
(10200*0+13*1)* -
784
8=10200*1+13* -784 1 -784
4 13 8 1 5=13-8*1
5=(10200*0+13*1)-
(10200*1+13* -
784)*1
5=10200*-1+13* 785 -1 785
5 8 5 1 3=8-5*1
3=(10200*1+13* -
784)-(10200*-
1+13*785)*1
3=10200*2+13* -1569 2 -1565
6 5 3 1 2=5-3*1
2=(10200*-1+13*
785)-(10200*2+13* -
1569)*1
2=10200*-3+13*2354 -3 2354
7 3 2 1 1=3-2*1
1=(10200*2+13* -
1569)-(10200*-
3+13*2354)*1
1=10200*5+13* -3923 5 -3923
8 2 1 2 0=2-1*2
0=(10200*-
3+13*2354)-
(10200*5+13* -
3923)*2
0=10200*-
13+13*10200 -13
10200
Pese a la aparente complejidad, si se presta atencin al procedimiento realizado
rpidamente se comprende como se ha realizado. Una vez obtenido los dos coeficientes, tan
solo nos quedara que d = Phi + Coef. 2 (Resto 1) => d= 10200 3923 = > d = 6277. Si deseamos verificar esto: d x e = 1 MOD (Phi(pxq)) => 6277 * 13 = 1 MOD 10200 =>
81601 MOD 10200 = 1. Es decir, se cumple.
e) Con esto tendramos la claves privadas y pblicas calculadas:
Clave Privada (n->10403, d->6277), Clave Pblica (n->10403,e->13)
Cabe destacar que todo este proceso de 4 fases es tan solo llevado acabo una sola vez, y
estas claves sern las que sean usadas durante meses o aos sin ningn tipo de problemas.
Una vez se tienen estas dos claves, el resto tan solo es aplicar la funcin de encriptacin o
la funcin de desencriptacin. Continuando con el ejemplo imaginemos que quisisemos
encriptar la palabra Casas, y que estamos usando un sistema simple de translacin de dichos valores a ASCII en hexadecimal. Imaginar tambin que se tiene un Padding que
inserta en el mensaje un valor de 001 cada dos caracteres:
Mensaje Original: C -> 043 a -> 061 s -> 073 a -> 061 s -> 073
Mensaje Con Padding: 43 61 01 73 61 01 73. Es decir, cada dos bytes se incrusta un 01.
Tamao de la palabra: 2 Bytes. Es decir, se especifica la cantidad de Bytes que se van a
tomar para realizar la codificacin, en este caso por ejemplo 2. Es decir, se divide el
mensaje con el padding incorporado en grupos de 2 bytes, si el nmero es impar (como en
nuestro caso) se aade un byte ms de padding al final para rellenar
Codificacin 1- >4361, Codificacin 2 -> 0173 Codificacin 3 -> 6101 Codificacin 4 ->
7300
me = Cifrado MOD n ->Se cifrar usando la clave pblica. En caso de que se quisiese cifrar
con la clave privada, en vez de e se usara d.
436113
= Cifrado MOD 10403 => Cifrado = 436113
MOD 10403 = 7905
017313
= Cifrado MOD 10403 => Cifrado = 017313
MOD 10403 = 6398
610113
= Cifrado MOD 10403 => Cifrado = 610113
MOD 10403 = 3597
730013
= Cifrado MOD 10403 => Cifrado = 730013
MOD 10403 = 3217
En mensaje cifrado por tanto correspondera a la cadena hexadecimal: 79 05 63 98 35 97 32 17, algunos de esos valores tendran representacin en ASCII y otros no. El proceso de desencriptacin sera similar:
Cifradod = m MOD n
79056277
= m MOD 10403 => m = 79056277
MOD 10403 = 4361
63986277
= m MOD 10403 => m = 63986277
MOD 10403 = 0173
35976277
= m MOD 10403 => m = 35976277
MOD 10403 = 6101
32176277
= m MOD 10403 => m = 32176277
MOD 10403 = 7300
Para poder calcular el mdulo a tales cifras exponenciales no servir una calculadora
normal, es necesario recurrir a tcnicas concretas para el clculo de mdulos a
exponenciales. Un buen punto de partida para poder realizar esto sera: AQUI
Como se puede observar, los resultados obtenidos son exactamente los mismos que los
iniciales, la cadena desencriptada correspondera a 43 61 01 73 61 01 73 00, eliminando el Padding nos quedara 43 61 73 61 73 que se traducira en ASCII de nuevo como Casa.
Segn el esquema propuesto se puede ver la necesidad del Padding. El Padding en RSA
toma una importancia aun mayor, dado que no solo sirve para aadir al final bytes que
puedan faltar para rellenar, sino que es importante incluir ciertos bits o bytes (de forma
reversible) en el mensaje original, de este modo RSA se hace resistente a ataques conocidos
como textos especficos, aunque las vulnerabilidades sern tratados en el ltimo capitulo de este artculo. El Padding debe de ser conocido por todos, no debe de ser un secreto.
Como se puede comprobar, RSA (o los algoritmos de clave pblica en general) no son en
realidad complejos por sus funciones, sino por la carga matemtica que hay detrs de ellos.
Las funciones en RSA para cifrar son muy simples, 4 variables de las cuales se conocen
siempre 3 y dos operaciones, una exponencial y otra modular. La seguridad en cambio
radica en que es virtualmente imposible obtener a partir de la clave pblica la clave privada.
Como hemos visto, la clave privada corresponde a la tupla n y d. Mientras que n es tambin
un valor dado por la clave pblica, d es calculado desde la clave privada a la hora de
generar las claves. El clculo de d se podra intentar, pero como hemos visto anteriormente, d depende de Phi (p x q) y para calcular Phi (p x q) es necesario conocer p y q. Aqu es donde radica el problema de la factorizacin. Sabemos que n = p x q y es un dato conocido, pero no conocemos el valor de p y el valor de q necesario para poder calcular Phi y posteriormente d. Para poder obtener p y q sera necesaria la factorizacin de n, y esto como hemos dicho no es viable. Es computacionalmente sencillo obtener dos primos con un nmero de bits muy grande. Es computacionalmente
sencillo multiplicar dichos primos entre ellos. Y es computacionalmente imposible revertir
el proceso y obtener los factores de dicho producto, es un camino solo de ida, si
perdisemos q y p sera imposible volver a encontrarlos.
Para aquellos que les pueda interesar RSA, recuerdo bien el programa DisMat, una
herramienta para aprendizaje sobre RSA y otras cuestiones igualmente interesantes.
RSA no es el nico sistema de clave asimtrica que existe. En la otra cara de la moneda
tenemos ElGamal, que est basado en algunas asunciones similares pero en principios
diferentes. No voy a detallar el funcionamiento de ElGamal por dos razones. La primera
porque honestamente se escapa a los conocimientos matemticos del redactor (es decir, a
mi) y no sera tico buscar informacin sobre ello y plasmarla aqu sin comprenderla. Y por
otro lado, aunque ElGamal es un sistema libre (RSA est patentado), su popularidad es
relativa, siendo RSA inmensamente ms usado y popular. De todos modos ElGamal si
podemos decir que aplica otro principio de la matemtica imposible, llamado como
logaritmo discreto. Lo gracioso es que esto lo hemos visto a menos de pasada dentro de
RSA. El problema reside en esta ecuacin:
a = bx MOD n => x = log discretob (a)
Siendo a, b y n nmeros conocidos y X la incgnita. El problema es poder calcular X. En
RSA nos tenemos que enfrentar a esta ecuacin, pero en nuestro caso no tenemos que
calcular X, tan solo a. En ElGamal, poder obtener la clave privada implicara resolver dicha
ecuacin, y esta es imposible de resolver computacionalmente, es decir en un tiempo razonable, de nada sirve que pueda ser resuelto con un ordenador funcionando durante
miles de aos.
Los algoritmos de cifrado asimtrico como RSA son extremadamente seguros. El echo de
que sea lentos comparados a los sistemas de cifrado simtrico hace que normalmente se opte por sistemas hbridos de los que sern tratados en los prximos captulos. Dado que el
potencial de computacin es limitado estos sistemas suelen estar a salvo de cualquier
posible ataque contra el propio sistema (no implica que no sean vulnerables a otros
ataques), pero todos sabemos que la capacidad de clculo de los dispositivos actuales se
incrementa exponencialmente cada ao que pasa. Esto significa que cada da que pasa se
est un poco ms cerca de alcanzar el reto computacional que plantean tanto los cifrados
simtricos como AES-256 a cifrados asimtricos como RSA-1024. La ventaja de estos
segundos, es que estn diseado para trabajar con longitudes muy superiores, mientras que
no sucede lo mismo con los cifrados simtricos. Es probable que dentro de X aos, AES-
128 sea considerado inseguro, o incluso su sistema sea roto, como en su da lo fue RC4. En
cambio encontrar una roptura en sistemas como RSA es harto ms complicado.
Certificados y Firmas Digitales
El cifrado de datos es un mecanismo que garantiza que nuestros datos, aun cuando puedan
ser interceptados por otros, permanecern seguros. Por otro lado, los Hash nos dan un
mecanismo para poder garantizar la integridad de un mensaje. Fue hace ya tiempo cuando
se pens en una aplicacin prctica sencilla de estas dos tecnologas, y comenz a hablar de
Certificados digitales. Pronto fue igualmente necesario el concepto de firma digital, un
sistema de autentificar algo.
Una tecnologa se crea fundamentalmente pensando en algo. As, el fundamento del cifrado
de datos es simple, que cuando un mensaje sea interceptado no pueda ser ledo o
comprendido por una tercera persona a la cual no est destinado. Pero esto no impide que el
mensaje pueda ser modificado, deteriorado, falseado Imaginar una carta postal que se escribe con tinta invisible. Alguien que la intercepte quizs no pueda leer el contenido real de esta, pero puede coger otra carta, rellenarla con la informacin que desee y enviarla
de nuevo al destino de esta. La pregunta es Como podr el destino saber si dicha carta ha
sido modificada? En el caso de la carta quizs con un sello, una firma aqu el concepto
ser el mismo, y podramos decir que el fundamento de un Hash criptogrfico es
precisamente la integridad.
A raz de la necesidad tanto de proteger el contenido de los datos en las comunicaciones,
como de autentificar el emisor y el destino, como garantizar la integridad del mensaje, se
cre el concepto de Infraestructura de Clave Pblica (PKI). Este concepto no es ms que la aplicacin prctica en las comunicaciones de los conceptos que hemos visto
anteriormente (y alguno ms que veremos en este captulo): Hash, Cifrado Simtrico y
Cifrado Asimtrico.
En este captulo vamos a intentar comprender bsicamente cada uno de los elementos que
constituye una infraestructura de clave pblica (PKI), y veremos como cada siguiente
elemento se hace necesario para el correcto funcionamiento de todo el sistema:
Infraestructura bsica Certificado: Necesidad de asociacin usuario/empresa Claves Firma: Necesidad de autentificacin de todas las partes e integridad
Infraestructura bsica
Vamos a intentar aplicar todos los conceptos explicados a un entorno real que deseamos
que sea completamente seguro. Para hacer esto tenemos que tener una serie de
consideraciones, tendremos que crear una infraestructura en la cual podamos aplicar y
hacer viable nuestras necesidades. Hemos dicho que el objetivo ser triple a la hora de
desear crear un canal de comunicacin seguro entre dos partes: El cifrado, la autentificacin
y la integridad. Empezemos por lo tanto por la primera de las partes, el cifrado.
Lo primero que deseamos es que nuestros datos sean interceptados o no por una tercera
persona, esta no pueda acceder a ellos. Hemos dicho que para ello disponemos de dos
sistemas muy buenos, el cifrado simtrico y el cifrado asimtrico. Cada uno de ellos tiene
ventajas e inconvenientes. Cual es ms factible de usar? En principio vamos a pensar que
el cifrado asimtrico por una razn muy simple: Adems de ser ms seguro tan solo
requiere de un par de claves (publica y privada) para el nmero que sea de canales de
comunicacin a entablar. Realizar esto por medio de un cifrado simtrico sera muy costodo
en cuanto a infraestructura, dado que Como crearas una base de datos en la cual se
pudiese almacenar cada usuario un nmero sin fin de keys asociada cada una de ellas a un
usuario o entidad diferente? Sera impensable. En cambio mediante el cifrado por clave
pblica esto podra simplificarse, dado que tan solo es necesario hacer pblica una sola key
para todos los canales de comunicacin posibles, no una para cada canal. En realidad el
sistema actual usado es hbrido, pero esto se ver ms adelante, para nosotros simplemente
decir que se opta de momento por el cifrado asimtrico, en nuestro caso RSA.
Una vez definida la necesidad de un sistema de clave pblica y las ventajas que esta nos
aporta, aparece el primer problema: Distribucin. Hemos explicado que el sistema de
cifrado asimtrico es muy eficiente e increblemente verstil, lo que encripta una key
privada lo desencripta la pblica, lo que encripta la pblica lo desencripta la privada. De ah
la necesidad de que la clave pblica sea exactamente eso: Pblica. Pero como podemos
hacer que cualquier usuario del planeta pueda tener acceso a dicha Key? Aqu es donde
comienza a crearse la verdadera PKI, de la necesidad de ir solventando los por menores del
camino. La nica forma de que cualquier usuario conozca nuestra key pblica es disponer
de bases de datos en las que se encuentren almacenadas las claves pblicas de todos los
usuarios. A esto se le conoce como repositorios de claves pblicas. Ahora, cualquier
usuario puede enviar su clave pblica asociada a un correo electrnico, nombre, apellidos Pero de forma pareja aparece la necesidad de algn control sobre dichas bases de datos.
Que sucede si una key ha sido comprometida o ya no es vlida? Es necesario por tanto
otro Repositorio , en este caso un Repositorio de Revocacin de claves pblicas. Con
estos dos sistemas podramos garantizar el funcionamiento correcto del cifrado de datos
entre dos usuarios. Estos repositorios existen a da de hoy, la mayora de ellos se
encuentran sincronizados con los otros para que todos tengan los mismos datos. Por
ejemplo podemos visitar uno de ellos:
Rep