Unidad II _Seguridad.pdf

Embed Size (px)

Citation preview

  • 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