Bueno, este post es continuación de
Por lo que si todavía no los leíste, te aconsejo que lo hagas antes de entrar con éste, de otra forma va a haber mucho que no va a resultar claro:
2 - Elementos de criptografía digital (II)
Otra de las ventajas que tiene la matemática binaria, es que yo puedo utilizar el 0 y el 1 como estados lógicos, o estados de verdad o afirmaciones y negaciones, y esto ya es todo un capítulo aparte, pues la matemática de los estados de verdad es todo un capitulo de las matemáticas, y tiene algunas reglas que no son comunes a la matemática ordinaria. Estas matemáticas reciben el nombre de Álgebra de Boole.
Una operacion lógica que es fácil de entender es la negación, la negación convierte un estado lógico en su opuesto, si yo digo "verdadero" la negación de esta proposición es "falso"; al negar "falso" obtengo "verdadero". Yo puedo decir por ejemplo "verdadero"=1 y "falso"=0
Entonces
1 negado = 0
0 negado = 1
Esta es una operación "unaria" o unitaria, yo necesito nada mas un valor de entrada y la operación para obtener un resultado, pero hay también operaciones lógicas binarias, en las cuales yo tengo dos entradas y el operador. Una operación binaria fácill de entender es la operación AND lógico o conjunción. Esta operación entrega un verdadero (1) sólo si las dos entradas son verdaderas. Las posibles opciones son:
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Otra operación fácil de entender es la operación OR o disyunción, esta operación entrega un verdadero (1) si al menos una de las entradas es verdadera:
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
La tercera operación mas utilizada es la operación XOR o disyunción excluyente, esta operación entrega un verdadero (1) si sólo una de las entradas es verdadera, y falso (0) en caso contrario:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
Bueno. ¿Y para que sirve todo esto?
las operaciones lógicas se hacen a nivel de bits, por lo que requieren realmente de muy poco proceso y se pueden hacer muy rápidamente y esto presenta una enorme ventaja cuando yo quiero codificar un mensaje.
Por ejemplo el caracter que representa la letra A se expresa en binario como 1000001.
A = 1000001
La palabra HOLA
H = 1001000
O = 1001111
L = 1001100
A = 1000001
H·O·L·A = 1001000·1001111·1001100·1000001
Un código sencillo sería negar a nivel de bits
H·O·L·A negado = 0110111·0110000·0110011·0111110 = 7·0·3·>
HOLA negado = 703>
Si yo vuelvo negar la salida obtengo nuevamente la entrada
703> negado = HOLA
En cierta forma es un código de sustitución muy sencillo, y aunque brinda una salida totalmente inintelegible, resulta fácil de romper. Mucho mas interesante es lo que se puede hacer con la función XOR.
Esta función me permite utilizar una "clave" que puede ser distinta cada vez ¿Cómo?
Bueno el caracter A = 1000001 y el caracter E = 1000101 si yo quiero codificar el carácter A con la clave E
hago XOR bit por bit:
1000001 (A)
1000101 (E)
_____________
0000100 (EOT) este es un caracter de función especial que ni siquiera tiene representación gráfica
La función XOR me permite obtener nuevamente los bits originales, si aplico nuevamente la clave al mensaje codificado
0000100 (EOT)
1000101 (E)
_____________
1000001 (A)
Puedo por ejemplo codificar HOLA con la clave PENA
1001000·1001111·1001100·1000001
1010000·1000101·1001110·1000001
_______________________________
0011000·0001010·0000010·0000000
Todos estos son caracteres especiales, que resultarían totalmente incomprensibles. Sin embargo y al fin y al cabo, resulta también una clave relativamente sencilla de romper utilizando técnicas de "fuerza bruta", pero ahora imaginemos que pasaría si yo pudiera ir rotando la "palabra mágica" (ver post anterior) a medida que voy codificando nuevas palabras,
bueno mas o menos así funcionan las claves WiFi, ahí está su mayor fortaleza y su mayor debilidad.
Tienen que ser rápidas, fáciles de calcular para poder codificar y descodificar paquetes con mucha rapidez, no deberían añadir una cantidad innecesaria de datos (notar que las claves XOR entregan resultados que tienen el mismo tamaño en bits que las entradas) pero también tienen que ser seguras. Prácticamente toda la seguridad de las redes WiFi se basa en como se obtiene y transmite esta "palabra mágica" rotatoria (normalmente se suele llamar Keystream - cadena clave) y aquí es donde principalmente difieren las claves WEP, WPA y WPA2.
En todas las codificaciones se suele utilizar un algoritmo para generar la keystream, este algoritmo produce una "palabra mágica" supuestamente pseudoaleatoria a partir de un vector de inicialización (ver post anterior), y una "clave de red" que es diferente en las diferentes codificaciones (WEP, WPA y WPA2)
Las codificaciones WEP hacen uso del algoritmo RC4 para generar la palabra mágica, y en estos casos la fortaleza de la clave depende del vector de inicialización y de la longitud de la "clave de red"
El vector de inicialización se encuentra incluído en el estándar (en la definción de la codificación) y debería ser rotatorio, esto significa que luego de un tiempo debería repetirse, además es enviado en la zona de datos del paquete sin codificar, por lo que es posible recuperarlo si se captura el suficiente número de paquetes como para atrapar el momento en que se reinicialice. Atrapando un par de paquetes de reinicialización es posible por metodos matemáticos deducir la clave de red, y a partir de ahí ya decodificar un mensaje es una tarea trivial. Esta sería la situación de mayor complejidad, con un vector de inicialización rotatorio, pero de hecho, en la práctica, la mayor parte de las veces, no se aprovecha la posibilidad de un vector de inicialización rotatorio, y en su lugar se utiliza uno fijo, lo que resulta todavía mucho mas vulnerable
Los pasos que sigue un dispositivo para encriptar por WEP son los siguientes:
1) Se toma un paquete y se calcula un CRC (un numero que permite comprobar la integridad del paquete) de 32 bits.
2) Se encadena la clave secreta de red a continuación del IV (vector de inicialización) formando el "seed" o semilla que servirá de base para generar la "palabra mágica" o Keystream.
3) A partir del seed el algoritmo de RC4 genera una secuencia de caracteres pseudoaleatorios (la "palabra mágica" o keystream), con la misma longitud en bits que los bits obtenidos en el punto 1.
4) Se calcula la función XOR de los caracteres del punto 1 con los del punto 3. El resultado es el mensaje cifrado.
5) Se envía el vector de inicialización (sin cifrar) y el mensaje cifrado dentro del campo de datos (frame body) del paquete.
El algoritmo para descifrar es similar al anterior, debido a que el otro extremo conoce el IV (que está definido en el estándar), y la clave secreta (introducida por el usuario), es posible generar entonces la "palabra mágica" y haciendo un XOR con las tramas codificadas es posible recuperar el mensaje original.
Como se ve, la codificación es prácticamente un chiste, ya que toda la fortaleza de esta codificación depende exclusivamente de la fortaleza de la clave secreta (introducida por el usuario), ya que el resto de los componentes de la codificación son conocidos por todo el mundo
La longitud de la clave indica mas o menos la cantidad de paquetes que harían falta capturar para poder decodificarla. No es una tarea difícil con la actual capacidad de proceso de los ordenadores particulares y aún una clave de 128 bits requiere como mucho un par de horas esnifando el aire para poder capturar los paquetes de reinicializacion.
WPA es un poco mas segura que WEP, pero es nada mas una solución temporaria, surgida como solución de transición para entre WEP y WPA2 para que los mismos equipos que utilizaban la codificación WEP pudieran utilizar la codificación WPA cambiando únicamente el sofware. Funciona casi casi de la misma forma que WEP, una función RC4 genera una "palabra mágica" (keystream) que es combinada por medio de una función XOR con el mensaje. En lo que se diferencian es en la forma en que se produce la semilla para la función RC4. Esta semilla se obtiene de una función mezcladora que combina la clave de red, el vector de inicialización, una clave de hash (un hash es un resumen numérico de los principales bits de un paquete, y sirve como "huella digital" y comprobación de identidad) y una clave temporal llamada TKIP, el vector de inicialización se sigue enviando con los paquetes, pero son tres los datos que combinados hacen que sea mas difícil obtener la palabra mágica, el hash del paquete, un vector de inicialización mas largo (48 bits en lugar de 40 de WEP) y la clave temporal. Esta clave se va renovando cada cierto tiempo, usualmente un par de minutos (ajustable), lo que hace muy dificil recuperar el keystream aunque se disponga de un montón de paquetes y de los vectores de inicialización. WPA/TKIP aún es susceptible a un ataque conocido como chopchop sobre canales QoS (aunque requiere unas condiciones bastante específicas) , pero habiendo ajustado correctamente estas condiciones el principal riesgo está dado por la captura de paquetes del "handshake" o saludo inicial.
Durante el saludo que se dan cliente y punto de acceso (autenticación) se transmiten vectores de inicialización y primera clave temporal, son sólo 4 paquetes, pero teniendo estos paquetes toda la seguridad de la red queda reducida únicamente a disponer de una buena clave de red. Un atacante que atrape estos paquetes puede deducir el keystream, por comparación, utilizando la clave temporal transmitida, el vector de inicialización y calculando diferentes keystreams para diferentes "claves". Usualmente los programas de crackeo ensayan miles de "claves de red" hasta que encuentran alguna que genera un keystream igual. El secreto entonces está en no utilizar una palabra clave común, cosas como "clave" o "12345" son reverendas estupideces porque aún los diccionarios mas sencillos las recogen. Esto lo vamos a tratar en "configurando WPA".
WPA2 bien utilizado es muy difícil de acceder, utiliza un protocolo de autenticación y encriptamiento (AES) que es bastante mas complejo que el de WEP y WPA/TKIP, y hasta donde yo conozco posee sólo una falla grave, una falla fundamental que tiene que ver con un protocolo de autenticación automático llamado WPS que se utiliza para facilitarle las cosas a los usuarios inexpertos, (por lo que conviene desactivarlo). Por lo demás utilizando un SSID oculto y una clave de red alfanumérica de al menos ocho dígitos (mejor si incluye caracteres especiales como # % / ", etc) brinda una seguridad mas que aceptable. Puede ser que nos molesten tratando de capturar el handshake, esto es el momento en que cliente y punto de acceso se dan la mano, se autentican y se transmiten los vectores de inicialización, pues es teóricamente posible recuperar la clave por medio de un ataque diccionario si se tienen estos paquetes, aunque en la práctica lleva muuucho tiempo y requiere disponer de un buen diccionario con cientos de miles de palabras. En el peor de los casos, configurando bien la seguridad WPA2 nos van a causar un par de desconexiones, pero no nos van a robar Internet:
Prácticamente no hace falta saber mucho mas para entender como configurar las claves WEP, WPA y WPA2,
Sin embargo, para quién esté interesado en conocer un poco más pongo a disposición este trabajo del analista en seguridad Guillaume Lehembre. El título es Seguridad WiFi - WEP, WPA y WPA2 , un excelente trabajo en formato .pdf donde se explica en un idioma relativamente sencillo como funcionan y como pueden ser vulnerados los diferentes protocolos.

Por lo que si todavía no los leíste, te aconsejo que lo hagas antes de entrar con éste, de otra forma va a haber mucho que no va a resultar claro:
2 - Elementos de criptografía digital (II)
Otra de las ventajas que tiene la matemática binaria, es que yo puedo utilizar el 0 y el 1 como estados lógicos, o estados de verdad o afirmaciones y negaciones, y esto ya es todo un capítulo aparte, pues la matemática de los estados de verdad es todo un capitulo de las matemáticas, y tiene algunas reglas que no son comunes a la matemática ordinaria. Estas matemáticas reciben el nombre de Álgebra de Boole.
Una operacion lógica que es fácil de entender es la negación, la negación convierte un estado lógico en su opuesto, si yo digo "verdadero" la negación de esta proposición es "falso"; al negar "falso" obtengo "verdadero". Yo puedo decir por ejemplo "verdadero"=1 y "falso"=0
Entonces
1 negado = 0
0 negado = 1
Esta es una operación "unaria" o unitaria, yo necesito nada mas un valor de entrada y la operación para obtener un resultado, pero hay también operaciones lógicas binarias, en las cuales yo tengo dos entradas y el operador. Una operación binaria fácill de entender es la operación AND lógico o conjunción. Esta operación entrega un verdadero (1) sólo si las dos entradas son verdaderas. Las posibles opciones son:
0 AND 0 = 0
0 AND 1 = 0
1 AND 0 = 0
1 AND 1 = 1
Otra operación fácil de entender es la operación OR o disyunción, esta operación entrega un verdadero (1) si al menos una de las entradas es verdadera:
0 OR 0 = 0
0 OR 1 = 1
1 OR 0 = 1
1 OR 1 = 1
La tercera operación mas utilizada es la operación XOR o disyunción excluyente, esta operación entrega un verdadero (1) si sólo una de las entradas es verdadera, y falso (0) en caso contrario:
0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0
Bueno. ¿Y para que sirve todo esto?

las operaciones lógicas se hacen a nivel de bits, por lo que requieren realmente de muy poco proceso y se pueden hacer muy rápidamente y esto presenta una enorme ventaja cuando yo quiero codificar un mensaje.
Por ejemplo el caracter que representa la letra A se expresa en binario como 1000001.
A = 1000001
La palabra HOLA
H = 1001000
O = 1001111
L = 1001100
A = 1000001
H·O·L·A = 1001000·1001111·1001100·1000001
Un código sencillo sería negar a nivel de bits
H·O·L·A negado = 0110111·0110000·0110011·0111110 = 7·0·3·>
HOLA negado = 703>
Si yo vuelvo negar la salida obtengo nuevamente la entrada
703> negado = HOLA
En cierta forma es un código de sustitución muy sencillo, y aunque brinda una salida totalmente inintelegible, resulta fácil de romper. Mucho mas interesante es lo que se puede hacer con la función XOR.
Esta función me permite utilizar una "clave" que puede ser distinta cada vez ¿Cómo?
Bueno el caracter A = 1000001 y el caracter E = 1000101 si yo quiero codificar el carácter A con la clave E
hago XOR bit por bit:
1000001 (A)
1000101 (E)
_____________
0000100 (EOT) este es un caracter de función especial que ni siquiera tiene representación gráfica
La función XOR me permite obtener nuevamente los bits originales, si aplico nuevamente la clave al mensaje codificado
0000100 (EOT)
1000101 (E)
_____________
1000001 (A)
Puedo por ejemplo codificar HOLA con la clave PENA
1001000·1001111·1001100·1000001
1010000·1000101·1001110·1000001
_______________________________
0011000·0001010·0000010·0000000
Todos estos son caracteres especiales, que resultarían totalmente incomprensibles. Sin embargo y al fin y al cabo, resulta también una clave relativamente sencilla de romper utilizando técnicas de "fuerza bruta", pero ahora imaginemos que pasaría si yo pudiera ir rotando la "palabra mágica" (ver post anterior) a medida que voy codificando nuevas palabras,

bueno mas o menos así funcionan las claves WiFi, ahí está su mayor fortaleza y su mayor debilidad.
Tienen que ser rápidas, fáciles de calcular para poder codificar y descodificar paquetes con mucha rapidez, no deberían añadir una cantidad innecesaria de datos (notar que las claves XOR entregan resultados que tienen el mismo tamaño en bits que las entradas) pero también tienen que ser seguras. Prácticamente toda la seguridad de las redes WiFi se basa en como se obtiene y transmite esta "palabra mágica" rotatoria (normalmente se suele llamar Keystream - cadena clave) y aquí es donde principalmente difieren las claves WEP, WPA y WPA2.
En todas las codificaciones se suele utilizar un algoritmo para generar la keystream, este algoritmo produce una "palabra mágica" supuestamente pseudoaleatoria a partir de un vector de inicialización (ver post anterior), y una "clave de red" que es diferente en las diferentes codificaciones (WEP, WPA y WPA2)
Las codificaciones WEP hacen uso del algoritmo RC4 para generar la palabra mágica, y en estos casos la fortaleza de la clave depende del vector de inicialización y de la longitud de la "clave de red"
El vector de inicialización se encuentra incluído en el estándar (en la definción de la codificación) y debería ser rotatorio, esto significa que luego de un tiempo debería repetirse, además es enviado en la zona de datos del paquete sin codificar, por lo que es posible recuperarlo si se captura el suficiente número de paquetes como para atrapar el momento en que se reinicialice. Atrapando un par de paquetes de reinicialización es posible por metodos matemáticos deducir la clave de red, y a partir de ahí ya decodificar un mensaje es una tarea trivial. Esta sería la situación de mayor complejidad, con un vector de inicialización rotatorio, pero de hecho, en la práctica, la mayor parte de las veces, no se aprovecha la posibilidad de un vector de inicialización rotatorio, y en su lugar se utiliza uno fijo, lo que resulta todavía mucho mas vulnerable

Los pasos que sigue un dispositivo para encriptar por WEP son los siguientes:
1) Se toma un paquete y se calcula un CRC (un numero que permite comprobar la integridad del paquete) de 32 bits.
2) Se encadena la clave secreta de red a continuación del IV (vector de inicialización) formando el "seed" o semilla que servirá de base para generar la "palabra mágica" o Keystream.
3) A partir del seed el algoritmo de RC4 genera una secuencia de caracteres pseudoaleatorios (la "palabra mágica" o keystream), con la misma longitud en bits que los bits obtenidos en el punto 1.
4) Se calcula la función XOR de los caracteres del punto 1 con los del punto 3. El resultado es el mensaje cifrado.
5) Se envía el vector de inicialización (sin cifrar) y el mensaje cifrado dentro del campo de datos (frame body) del paquete.
El algoritmo para descifrar es similar al anterior, debido a que el otro extremo conoce el IV (que está definido en el estándar), y la clave secreta (introducida por el usuario), es posible generar entonces la "palabra mágica" y haciendo un XOR con las tramas codificadas es posible recuperar el mensaje original.
Como se ve, la codificación es prácticamente un chiste, ya que toda la fortaleza de esta codificación depende exclusivamente de la fortaleza de la clave secreta (introducida por el usuario), ya que el resto de los componentes de la codificación son conocidos por todo el mundo

La longitud de la clave indica mas o menos la cantidad de paquetes que harían falta capturar para poder decodificarla. No es una tarea difícil con la actual capacidad de proceso de los ordenadores particulares y aún una clave de 128 bits requiere como mucho un par de horas esnifando el aire para poder capturar los paquetes de reinicializacion.
WPA es un poco mas segura que WEP, pero es nada mas una solución temporaria, surgida como solución de transición para entre WEP y WPA2 para que los mismos equipos que utilizaban la codificación WEP pudieran utilizar la codificación WPA cambiando únicamente el sofware. Funciona casi casi de la misma forma que WEP, una función RC4 genera una "palabra mágica" (keystream) que es combinada por medio de una función XOR con el mensaje. En lo que se diferencian es en la forma en que se produce la semilla para la función RC4. Esta semilla se obtiene de una función mezcladora que combina la clave de red, el vector de inicialización, una clave de hash (un hash es un resumen numérico de los principales bits de un paquete, y sirve como "huella digital" y comprobación de identidad) y una clave temporal llamada TKIP, el vector de inicialización se sigue enviando con los paquetes, pero son tres los datos que combinados hacen que sea mas difícil obtener la palabra mágica, el hash del paquete, un vector de inicialización mas largo (48 bits en lugar de 40 de WEP) y la clave temporal. Esta clave se va renovando cada cierto tiempo, usualmente un par de minutos (ajustable), lo que hace muy dificil recuperar el keystream aunque se disponga de un montón de paquetes y de los vectores de inicialización. WPA/TKIP aún es susceptible a un ataque conocido como chopchop sobre canales QoS (aunque requiere unas condiciones bastante específicas) , pero habiendo ajustado correctamente estas condiciones el principal riesgo está dado por la captura de paquetes del "handshake" o saludo inicial.
Durante el saludo que se dan cliente y punto de acceso (autenticación) se transmiten vectores de inicialización y primera clave temporal, son sólo 4 paquetes, pero teniendo estos paquetes toda la seguridad de la red queda reducida únicamente a disponer de una buena clave de red. Un atacante que atrape estos paquetes puede deducir el keystream, por comparación, utilizando la clave temporal transmitida, el vector de inicialización y calculando diferentes keystreams para diferentes "claves". Usualmente los programas de crackeo ensayan miles de "claves de red" hasta que encuentran alguna que genera un keystream igual. El secreto entonces está en no utilizar una palabra clave común, cosas como "clave" o "12345" son reverendas estupideces porque aún los diccionarios mas sencillos las recogen. Esto lo vamos a tratar en "configurando WPA".
WPA2 bien utilizado es muy difícil de acceder, utiliza un protocolo de autenticación y encriptamiento (AES) que es bastante mas complejo que el de WEP y WPA/TKIP, y hasta donde yo conozco posee sólo una falla grave, una falla fundamental que tiene que ver con un protocolo de autenticación automático llamado WPS que se utiliza para facilitarle las cosas a los usuarios inexpertos, (por lo que conviene desactivarlo). Por lo demás utilizando un SSID oculto y una clave de red alfanumérica de al menos ocho dígitos (mejor si incluye caracteres especiales como # % / ", etc) brinda una seguridad mas que aceptable. Puede ser que nos molesten tratando de capturar el handshake, esto es el momento en que cliente y punto de acceso se dan la mano, se autentican y se transmiten los vectores de inicialización, pues es teóricamente posible recuperar la clave por medio de un ataque diccionario si se tienen estos paquetes, aunque en la práctica lleva muuucho tiempo y requiere disponer de un buen diccionario con cientos de miles de palabras. En el peor de los casos, configurando bien la seguridad WPA2 nos van a causar un par de desconexiones, pero no nos van a robar Internet:

Prácticamente no hace falta saber mucho mas para entender como configurar las claves WEP, WPA y WPA2,
Sin embargo, para quién esté interesado en conocer un poco más pongo a disposición este trabajo del analista en seguridad Guillaume Lehembre. El título es Seguridad WiFi - WEP, WPA y WPA2 , un excelente trabajo en formato .pdf donde se explica en un idioma relativamente sencillo como funcionan y como pueden ser vulnerados los diferentes protocolos.