miércoles, 26 de abril de 2017

Criptografía (LII): ataque de intermediario a RSA

En anteriores posts de este blog he tratado sobre diferentes ataques teóricamente posibles al cifrado RSA, pero que tal y como decía, al menos actualmente, son ineficientes con la potencia de cálculo de los ordenadores actuales. Sin embargo hay otros ataques posibles y que pueden tener más probabilidades de éxito.

Tal y como también he dicho en anteriores posts de esta serie sobre criptografía:

"El eslabón más débil de la cadena de seguridad (y la criptografía no es una excepción) lo constituimos las personas".

Es decir, podemos tener un criptosistema muy robusto (muy seguro conceptualmente), como es el caso de RSA, pero si las personas que lo administramos y/o utilizamos no hacemos un uso adecuado del mismo éste podría ser "roto" con relativa facilidad.

En este post, como ejemplo de ésto, me voy a referir al ataque de intermediario (MitM, por las siglas en inglés de: "Man-in-the-Middle"), que, aunque en el título de este post lo he indicado como ataque al cifrado RSA, realmente puede emplearse para atacar cualquier criptosistema de clave pública.

En este tipo de ataques el atacante no se hace con la clave privada de los usuarios que intercambian entre sí mensajes cifrados, pero está en disposición de leerlos (descifrarlos y obtener así el texto en claro) e incluso de modificarlos, sin que emisor ni destinatario se den cuenta de ello.

Supongamos que un atacante (C) tiene acceso al directorio donde se encuentran las claves públicas de dos usuarios (A y B), entonces podría almacenar ambas claves y sustituirlas por otras dos previamente generadas por él y, por tanto, de las que dispone de sus respectivas claves privadas, o bien, si el intercambio de claves públicas entre A y  B se produce mediante sendas comunicaciones por un canal no seguro y C es capaz de interceptarlas, entonces C podría enviar a cada uno de ellos una clave pública generada por él haciéndoles creer a ambos que la clave pública que reciben es la correspondiente a la otra parte.
De esta forma, B cree disponer de la clave pública de A (KA), cuando realmente es una clave pública de C (KC1), y lo mismo le ocurre a A, que no dispone de la clave pública de B(KB) sino de otra clave pública generada por C (KC2), estando este último en disposición de leer los mensajes cifrados que se intercambien A y B, e incluso, como ya he dicho, de modificarlos. Todo ello sin que ni A ni B se den cuenta de que sus comunicaciones están comprometidas.

Veamos cómo. Supongamos que A quiere mandar un mensaje cifrado a B, para lo que utilizaría la clave pública que cree que es de B pero que realmente es de C (KC2) y se lo enviaría a B. C intercepta el mensaje y lo descifra con la clave privada correspondiente a la clave pública con la que A lo cifró (K'C2) y obtiene el texto en claro, rompiendo así el secreto que se pretendía guardar. Después C puede o no alterar el mensaje, cifrarlo con la verdadera clave pública de B (KB) y enviárselo a B como si el emisor fuera A. B descifra el mensaje con su clave privada (K'B) y cree que nadie ha tenido acceso al mismo.

Este ataque funciona de igual forma en sentido contrario (mensaje de B a A) pero el atacante utilizaría para descifrar el mensaje la clave privada K'C1 y después lo volvería a cifrar con la verdadera clave pública de A (KA) y se lo enviaría a éste como si el emisor fuera B.

El ataque de intermediario, si no se toman medidas adecuadas para evitarlo, es posiblemente el más efectivo para "romper" un cifrado RSA y, como ya he dicho antes, cualquier otro criptosistema de clave pública.

Evidentemente, el problema en este caso consiste en que el emisor debe asegurarse de que la clave pública con la que va a cifrar los mensajes es realmente del destinatario al que van dirigidos y no de un atacante. Una forma de hacer esto consiste en la participación de una Autoridad de Certificación (CA por sus siglas en inglés) que a la hora de entregar la clave pública de un usuario (destinatario) a otro (emisor) garantice que ésta es realmente del primero.

martes, 7 de marzo de 2017

'Habemus' Troll

¡Ya era hora!.

Tras exactamente 2.434 días de que naciera este modesto blog, con 352 entradas y 370 comentarios hasta el momento, al fin y como cualquier blog que se precie,

¡Ya tenemos nuestro propio Troll!.

Pero, antes que nada, veamo la definición de Troll en la wikipedia:

"Un troll o trol es un vocablo de Internet que describe a una persona que sólo busca provocar intencionadamente a los usuarios o lectores, creando controversia, provocar reacciones predecibles, especialmente por parte de usuarios novatos, con fines diversos, desde el simple divertimento hasta interrumpir o desviar los temas de las discusiones, también trollean páginas de wikipedia o bien provocar flamewars, enfadando a sus participantes y enfrentándolos entre sí. El troll puede ser más o menos sofisticado, desde mensajes groseros, ofensivos o fuera de tema, sutiles provocaciones o mentiras difíciles de detectar, con la intención en cualquier caso de confundir o provocar la reacción de los demás".

Aunque el origen etimológico de este término parece que nada tiene que ver con "El Señor de los anillos", tal y como nos aclara también la wikipedia: su origen más probable es el de «morder el anzuelo» o «morder el anzuelo mucho más» (troll es un tipo de pesca en inglés), permítaseme la licencia de las imágenes que ilustran este post, ya que soy un fan de Tolkien y porque creo que estos seres encajarían mejor como origen etimológico de este término.

Pues bien, como decía, ya nos empezábamos a preocupar ("¡menuda mierda de blog que tenemos, no comenta ni un solo Troll!"), pero esto se acabó: ¡Ya tenemos nuestro propio Troll!. He borrado sus comentarios y no voy a reproducirlos porque, como todos sabemos, hay que tener mucho cuidado a la hora de alimentarles, es más, no se les debe dar de comer nunca porque mutan a subespecies que dan mucho más la tabarra.

Pero veamos, en concreto, a qué subespecie pertenece este Troll. Para ello fijémonos en varias de las características definitorias que nos pueden dar pistas para su catalogación: se ampara en el anonimato, sólo sabe poner groserías y carece de educación. Basándome en estas apreciaciones objetivas, yo diría que se trata de un Troll "tontolano" (bueno, ya sé que no es muy académico, pero es que no me encajaba exactamente en ninguna de las subespecies descritas hasta la fecha). En definitiva, creo que estamos ante una nueva subespecie aún sin catalogar y a la que me permito bautizar.  

Por favor, querido Troll (tú y yo sabemos quién eres), apúntate el número 1 para que cuando vuelvas a comentar en este blog te identifiques como Troll#1, así todos sabremos que eres tú otra vez, para no equivocarte con otros miembros de tu misma especie que nos visiten, ya que para nosotros tú siempre serás nuestro Troll.

En la medida que vayan visitándonos otros especímenes que pululan por Internet iremos escribiendo nuevos posts de bienvenida, catalogándoles y distinguiéndoles con el número correspondiente.

lunes, 6 de marzo de 2017

Criptografía (LI): el algoritmo DES (III)

En el post anterior puse un ejemplo de cifrado utilizando el algoritmo DES y decía que en éste, para ver si lo he comprendido y he hecho correctamente, voy a descifrar el criptograma que obtuve.

De forma análoga que en el cifrado, como paso previo al descifrado debemos obtener, a partir de la clave (K), de 64 bits, las 16 subclaves (Ki), de 48 bits cada una, que se emplearán en las 16 rondas de la red de Feistel de las que consta este algoritmo, una subclave por ronda.

Ya expliqué en un post anterior como hacerlo, siendo la clave de nuestro ejemplo y las subclaves calculadas a partir de ésta las siguientes:
Y ya estamos en disposición de descifrar el criptograma, para lo que hay que recordar que en este post decía que basta con aplicar las sucbclaves (Ki) en orden inverso que en el cifrado. En nuestro ejemplo el criptograma obtenido es el siguiente:

- En binario:

C = 1001101111111011111110111111010011010000111110010001011000000100

- En hexadecimal:

C = 9BFBFBF4D0F91604


1.- Permutación inicial (IP) de los bits del bloque del criptograma a descifrar:
2.- Red de Feistel de 16 rondas (aplicando las subclaves en el orden inverso al cifrado):

2.1.- Primera iteración:
2.2.- Segunda iteración:
2.3.- Tercera iteración:
2.4.- Cuarta iteración:
2.5.- Quinta iteración:
2.6.- Sexta iteración:
2.7.- Séptima iteración:
2.8.- Octava iteración:
2.9.- Novena iteración:
2.10.- Décima iteración:
2.11.- Undécima iteración:
2.12.- Duodécima iteración:
2.13.- Decimotercera iteración:
2.14.- Decimocuarta iteración:
2.15.- Decimoquinta iteración:
2.16.- Decimosexta iteración:
3.- Permutación final (IP-1) de los bits de la concatenación R16 || L16:
Con lo que el texto en claro (M) sería:

- En binario:

M = 0100010101001010010001010100110101010000010011000100111101001101

- En hexadecimal:

M = 454A454D504C4F4D

Como se observa, he obtenido el mismo texto en claro (M) que en el post anterior, por lo que concluyo que tanto el cifrado como el descifrado son correctos.

jueves, 2 de marzo de 2017

Criptografía (L): el algoritmo DES (II)

En el post anterior decía que iba a completar el ejemplo que puse de cifrado utilizando el algoritmo DES. Lo intento, pero bien entendido que sólo concluiré que es correcto, más o menos, cuando en el siguiente post consiga descifrar el criptograma (C) que obtengo en éste. Si no lo consigo algo habré hecho mal y corregiré este post y el anterior.

Como paso previo al cifrado debemos obtener, a partir de la clave (K), de 64 bits, las 16 subclaves (Ki), de 48 bits cada una, que se emplearán en las 16 rondas de la red de Feistel de las que consta este algoritmo, una subclave por ronda.

Ya expliqué en el post anterior como hacerlo, siendo la clave de nuestro ejemplo y las subclaves calculadas a partir de ésta las siguientes:
Y ya estamos en disposición de cifrar un texto en claro, para lo que hay que recordar que este algoritmo se aplica sobre bloques de 64 bits del mismo. En nuestro ejemplo proponía cifrar el siguiente bloque:

- En binario:

M = 0100010101001010010001010100110101010000010011000100111101001101

- En hexadecimal:

M = 454A454D504C4F4D

1.- Permutación inicial (IP) de los bits del bloque a cifrar:
2.- Red de Feistel de 16 rondas:

2.1.- Primera iteración:
2.2.- Segunda iteración:
2.3.- Tercera iteración:
2.4.- Cuarta iteración:
2.5.- Quinta iteración:
2.6.- Sexta iteración:
2.7.- Séptima iteración:
2.8.- Octava iteración:
2.9.- Novena iteración:
2.10.- Décima iteración:
2.11.- Undécima iteración:
2.12.- Duodécima iteración:
2.13.- Decimotercera iteración:
2.14.- Decimocuarta iteración:
2.15.- Decimoquinta iteración:
2.16.- Decimosexta iteración:
3.- Permutación final (IP-1) de los bits de la concatenación R16 || L16:
Con lo que el criptograma (C) sería:

- En binario:

C = 1001101111111011111110111111010011010000111110010001011000000100

- En hexadecimal:

C = 9BFBFBF4D0F91604


Lo dicho, en el siguiente post, para comprobar si lo he comprendido y he hecho correctamente, realizaré el descifrado de este criptograma. 

domingo, 26 de febrero de 2017

Criptografía (XLIX): el algoritmo DES (I)

DES (Data Encryption Standard) fue desarrollado por IBM a petición de la Oficina Nacional de Estandarización (National Bureau of Standards) de los Estados Unidos. Su diseño se basó en otro algoritmo anterior, Lucifer, y fue adoptado como estándar de cifrado en 1976 por el Gobierno de los EE.UU.

Es un algoritmo de cifrado simétrico (se utiliza la misma clave para cifrar y para descifrar) por bloques (la información a cifrar se divide en bloques y se aplica el algoritmo a cada uno de ellos) que se basa en una estructura denominada Red de Feistel (cifrado de producto iterativo de n rondas en el que la salida de cada una de ellas se usa como entrada en la siguiente).

Este algoritmo opera sobre bloques de 64 bits del texto en claro, dividiendo cada uno de ellos en dos mitades, L (los 32 bits de la izquierda) y R (los 32 bits de la derecha), y emplea una clave de 56 bits.

Básicamente, el cifrado consiste en una permutación inicial, una Red de Feistel de 16 rondas (16 iteraciones en las que se repiten una serie de operaciones: permutaciones, aritmética modular y sustituciones. Ver conceptos de difusión, confusión y cifrado de producto en este post) y una permutación final.

En principio la longitud de la clave (K) es de 64 bits, pero el bit menos significativo de cada byte se ignora, por lo que sólo se emplean 56 bits.

Si no lo he entendido mal, su funcionamiento sería el siguiente:

1.- Como paso previo al cifrado, a partir de la clave de 64 bits se calculan 16 subclaves (Ki) de 48 bits cada una (una para cada ronda).

1.1.- Permutación de los bits de K conforme a la posición de cada uno de ellos que se indica en la siguiente tabla:
Nótese que en esta tabla no figuran los bits menos significativos de cada byte (8, 16, 24, 32, 40, 48, 56 y 64), por lo que éstos son ignorados (como he dicho antes, en la práctica se emplean 56 bits de la clave).

Pongo un ejemplo:
1.2.- Ahora, los bits de la mitad izquierda (C0) y de la mitad derecha (D0), obtenidas tras la permutación PC-1, ambas de 28 bits, se van rotando circularmente a la izquierda conforme al número de bits a desplazar a la izquierda que se indica en la siguiente tabla:
Es decir, el número de bits a desplazar a la izquierda es 2, excepto para las iteraciones 1, 2, 9 y 16 en las que se desplaza sólo 1 bit a la izquierda.

En nuestro ejemplo:
1.3.- Tras cada una de las iteraciones anteriores se aplica la permutación PC-2 a  los bits de la concatenación de Ci || Di (donde £ i £ 16), conforme a la posición de cada uno de ellos que se indica en la siguiente tabla:
Y, de esta forma, se obtienen las 16 subclaves (Ki; donde £ i £ 16); como he dicho antes, cada una de ellas con una longitud de 48 bits. Siguiendo con nuestro ejemplo:
Hasta el momento, gráficamente:
Y ahora ya se está en disposición de cifrar el texto en claro.

2.- Cifrado: Supongamos que vamos a cifrar un bloque (64 bits) del texto en claro. El siguiente:

M = 0100 0101 0100 1010 0100 0101 0100 1101 0101 0000 0100 1100 0100 1111 0100 1101


2.1.- Se aplica una permutación inicial (IP) a los bits del bloque a cifrar conforme a la posición de cada uno de ellos que se indica en la siguiente tabla:
En nuestro ejemplo:
2.2.- A partir de aquí el algoritmo realiza 16 rondas utilizando una función (f), de la siguiente manera:
Es decir, en cada ronda, la mitad derecha pasa a ser la mitad izquierda de la siguiente iteración y la mitad izquierda, a la que se suma módulo 2 (operador lógico XOR u o-exclusivo) el resultado de la función f, pasa a ser la mitad derecha.

Gráficamente:
La función f consta de: una permutación de expansión (E) - que transforma el bloque de 32 bits de la entrada en uno de 48 bits, permutando los bits que recibe y duplicando algunos de ellos -, una operación XOR con el valor de la subclave correspondiente (Ki), 8 operaciones de sustitución aplicadas a cada uno de los 8 bloques de 6 bits en los que se divide el resultado de la operación XOR anterior y otra permutación (P).

Gráficamente:
2.2.1.- La permutación de expansión (E) se realiza conforme a la posición de cada uno de los bits de entrada que se indica en la siguiente tabla:
Nótese que algunos de los bits que recibe (32 bits) se duplican para obtener una salida de 48 bits, con objeto de poder realizar la operación XOR con la subclave (Ki) correspondiente, que tiene una longitud de 48 bits.

En nuestro ejemplo, para la primera iteración (entrada R0):
2.2.2.- Operación XOR con el valor de la subclave correspondiente:
En nuestro ejemplo y para la primera ronda:
2.2.3.- Las sustituciones se realizan mediante unas tablas denominadas S-Cajas (en inglés S-Boxes, Substitution Boxes).

Para ello, en primer lugar se divide el resultado anterior en 8 bloques de 6 bits cada uno, de la siguiente manera:
Y, posteriormente, cada uno de estos bloques es la entrada a su respectiva S-Caja, cada una de las cuales determina la sustitución a realizar de la siguiente manera:

El primer y último bit de cada bloque (Bi) indican la fila de la S-Caja (Si) a seleccionar y los cuatro bits centrales determinan la columna, devolviéndose el valor (4 bits) que se encuentra en la intersección de ambas.

En nuestro ejemplo, para la primera ronda y primera S-Caja (S1):
Las tablas de las S-Cajas son las siguientes:
2.2.4.- Por último, el resultado de la función f de cada ronda se obtiene aplicando una permutación (P) a la concatenación (32 bits) de los resultados obtenidos tras realizar cada una de las sustituciones anteriores, que devuelve un bloque también de 32 bits.
Y se repite el paso 2.2. hasta completar las 16 rondas.

2.3.- Finalmente, se aplica una permutación inversa a la permutación inicial (IP-1), conforme a la posición de cada uno de los bits de la concatenación de R16 y L16 obtenidos en la última ronda:
El resultado de aplicar esta permutación final es el criptograma (C).

Para ver si lo he entendido correctamente (con tanta confusión y difusión reconozco estar yo mismo un tanto confuso y difuso :)), en el próximo post pondré el resultado completo del cifrado del ejemplo y en otro posterior su descifrado, aunque ya adelanto que para el descifrado bastará con aplicar las subclaves (Ki) en orden inverso.