Sunteți pe pagina 1din 34

CRIPTOGRAFA ASIMETRICA (www.elhacker.

net)

Captulo I. Bueno, como promet, hoy comenzamos con el taller de criptografa asimtrica. Vamos a empezar con las bases y despues iremos ampliando la informacin. La idea es que yo voy a explicar lo mejor posible todos los conceptos y luego voy a dar links (Algunos ya existentes en el foro) para ampliar la informacin ya dada. Estas son interpretaciones con el fin de hacer ms legible y accesible la informacin que puede resultar compleja, vale aclarar que todo lo expuesto, va a ser basado de otras fuentes, que van a ser aclaradas al final. Quiero poner unas reglas bsicas para como vamos a manejarnos en el taller: - Todas las preguntas sobre lo expuesto en este thread, deben seguir las siguientes indicaciones: 1) Aclarar a qu parte del taller est referida la pregunta. 2) Ser clara y lo ms explcita posible. 3) No utilizar "escritura sms", utilizar signos de puntuacin, maysculas y espacios y tratar de mantener las faltas de ortografa a un mnimo. 4) No preguntar cosas que ya se han preguntado. 5) Las palabras "encriptar" y "desencriptar" son anglicismos que no deben ser utilizadas. Las palabras correctas son "Cifrar" y "Descifrar". cifrar viene del ingls "Encrypt" y descifrar de "Decrypt". Voy a comenzar un pequeo glosario de trminos que a medida que avanzemos se ir llenando, si se hace muy grande, lo pasar a un post aparte: - Plaintext: Mensaje antes de ser cifrado. - Ciphertext: Mensaje despus de ser cifrado. - Cifrar: Aplicar un algoritmo matemtico que tiene como fin hacer tericamente imposible la lectura de un mensaje. - Descifrar: Aplicar un algoritmo matemtico que tiene como fin volver a hacer legible un mensaje cifrado. - Charset: Conjunto de caracteres que pueden llegar a componer a una clave (Ej: Minsculas, Maysculas, espacios, nmeros, caracteres especiales, todo el espectro ASCII). - Brute Force: Metodo de crackeo de claves que consiste en probar secuencialmente claves hasta dar con la correcta, suele ser lento, consumidor de recursos y generalmente infeasible. - Infeasible: Anglicismo que se utiliza para denominar hechos que en teora son posibles, pero la cantidad de tiempo o recursos necesarios para lograr dichos hechos, excede en tal manera que los hace extremadamente impracticos. - A.K.A.: "Also Known As" = "Tambin conocido como". Comenzemos entonces: Captulo I. Este captulo fue escrito mientras se escuchaba: Die Toten Hosen (Opium Frs Volk). Qu es la criptografa asimtrica? Cita de: Wikipedia La criptografa (Del griego, literalmente escritura oculta) asimtrica es el mtodo criptogrfico que usa un par de claves para el envo de mensajes. Las dos claves pertenecen a la misma persona a la que se ha enviado el mensaje. Una clave es pblica y se puede entregar a cualquier persona, la otra clave es privada y el propietario debe guardarla de modo que nadie tenga acceso a ella. Entonces: El algoritmo de cifrado asimtrico, crea dos claves, una pblica con la que solo se debe cifrar los datos, y una privada, que permite descifrar los datos.

Cul es la diferencia entre un algoritmo asimtrico y uno simtrico? Un algoritmo simtrico permite que la misma clave se pueda utilizar para cifrar y para descifrar. La ventaja del algoritmo simtrico sobre el asimtrico, es que los simtricos suelen ser mucho ms seguros con claves ms pequeas, esto significa, utilizando un ejemplo, que para obtener la seguridad que tiene un AES 128 bits (Simtrico) se debe utilizar al menos una clave de RSA 1024 bits. Otra de las ventajas de los algoritmos simtricos es que suelen ser decena de veces ms rpidos para computar las claves y para cifrar los datos. Para qu entonces utilizar criptografa asimtrica? Sin embargo, una de las grandes fallas que tienen los algoritmos simtricos sobre los asimtricos, es el intercambio de claves, esto se explica a continuacin con un ejemplo prctico. Agustin y Bernardo quieren comunicarse por un canal, Eva, sin embargo, puede ver los paquetes que se transportan por dicho canal. Agustin y Bernardo entonces, deciden utilizar la criptografa para evitar que Eva pueda ver su comunicacin. Comienzan utilizando criptografa simtrica. Agustn, le enva a Bernardo la clave que van a utilizar para establecer el canal seguro. Pero Eva tambin puede ver esta clave. Agustn cifra los datos que quiere enviar y Bernardo los recibe, sin embargo, Eva tiene la clave simtrica y los datos, entonces puede ver la comunicacin entre Agustn y Bernardo. Canal seguro: FAIL! Entonces, Agustn y Bernardo, deciden utilizar criptografa asimtrica. Agustn y Bernardo crean cada uno un par de claves Pblica y Privada. Vamos a llamarlas E(A), E(B), D(A) y D(B), siendo E(A) la clave pblica de Agustn, E(B) la clave pblica de Bernardo, D(A) la clave privada de Agustn y D(B) la clave privada de Bernardo. 1) Agustn le enva a Bernardo E(A) y Bernardo le enva a Agustn E(B). 2) Agustn cifra con E(B) los datos que le quiere mandar a Bernardo y Bernardo cifra con E(A) los datos que le quiere mandar a Agustn. 3) Agustn descifra con D(A) los datos que recibi de Bernardo y Bernardo descifra con D(B) los datos que recibi de Agustn. 4) Eva, lo nico que puede ver en el canal, son las dos claves pblicas y los datos cifrados, entonces, esta no va a poder ver los datos que Agustn y Bernardo comparten. Canal seguro: OK!! Para los que entienden mejor con interpretaciones grficas, aqui les presento un par:

Bases de la criptografa asimtrica. Cita de: Wikipedia Los sistemas de cifrado de clave pblica se basan en funciones-trampa de un solo sentido que aprovechan propiedades particulares, por ejemplo de los nmeros primos. Una funcin de un solo sentido es aquella cuya computacin es fcil, mientras que su inversin resulta extremadamente difcil. Por ejemplo, es fcil multiplicar dos nmeros primos juntos para obtener uno compuesto, pero es difcil factorizar uno compuesto en sus componentes primos. Una funcin-trampa de un sentido es algo parecido, pero tiene una "trampa". Esto quiere decir que si se conociera alguna pieza de la informacin, sera fcil computar el inverso. Por ejemplo, si tenemos un nmero compuesto por dos factores primos y conocemos uno de los factores, es fcil computar el segundo. Dado un cifrado de clave pblica basado en factorizacin de nmeros primos, la clave pblica contiene un nmero compuesto de dos factores primos grandes, y el algoritmo de cifrado usa ese compuesto para cifrar el mensaje. El algoritmo para descifrar el mensaje requiere el conocimiento de los factores primos, para que el descifrado sea fcil si poseemos la clave privada que contiene uno de los factores, pero extremadamente difcil en caso contrario. Fuentes: - http://es.wikipedia.org/wiki/Criptograf%C3%ADa_asim%C3%A9trica - http://es.wikipedia.org/wiki/Criptograf%C3%ADa_sim%C3%A9trica - https://zonatic.usatudni.es/es/aprendizaje/aprende-sobre-el-dnie/57-aspectos-tecnicos/196criptografia-y-esquemas-de-clave-publica.html Cualquier duda que tengan, posteenla en ESTE thread, cuando vea que no hay ms preguntas, pongo el siguiente tema. Un abrazo APOKLIPTICO. Toda la informacin expuesta en este taller, est protegida bajo licencia Creative Commons Attribution-NonCommercial-ShareAlike 2.5.

Captulo II. Este captulo fue escrito mientras se escuchaba: Pink Floyd (Animals & The Wall).

Algoritmos asimtricos ya existentes. En este captulo, vamos a explorar los cifrados asimtricos ya existentes, cada uno va a ser explicado en profundidad, es posible que necesite continuar esta entrega en el captulo III, ya que en este momento son las 23.06 pm (GMT -3), no tengo sueo por ahora, pero veremos que tan tarde se hace.

RSA
RSA es un algoritmo de cifrado asimtrico, creado por Ron Rivest, Adi Shamir y Len Adleman, del Instituto Tecnolgico de Massachusetts (MIT) en el ao 1977. Como ven, RSA son las siglas de "Rivest" "Shamir" y "Adleman". Es el primer algoritmo de cifrado asimtrico en la historia y an es el ms usado. La gran fortaleza que mantiene al RSA entre los algoritmos ms seguros, es la infeasibilidad de descomponer un nmero grande en producto de primos. Generacin de claves: Cita de: Wikipedia 1. Cada usuario elige dos nmeros primos distintos p y q. * Por motivos de seguridad, estos nmeros deben escogerse de forma aleatoria y deben tener una longitud en bits parecida. Se pueden hallar primos fcilmente mediante test de primalidad. "Deben escogerse de forma aleatoria" no significa que uno tiene que pensar en un nmero y ponerlo apretando teclas en el numpad. Es cierto que el ser humano es una excelente mquina generadora de aleatoriedad, pero la mejor manera de generar nmeros aleatorios, es utilizando lo que se conoce como "generadores pseudo-aleatorios", este trmino es largo de explicar, y por eso inclu un apartado sobre generadores pseudo-aleatorios al final del captulo. Como semilla, se utilizan fuentes de aleatoriedad, por ejemplo, movimientos del mouse, temperaturas de los dispositivos, etc. Cita de: Wikipedia 2. Se calcula n = p*q. * n se usa como el mdulo para ambas claves, pblica y privada. Mdulo: En este caso, el mdulo se define como el resto de una divisin. Ej: 100 mod 6 = 4. 100/6 = 16 resto "4". Cita de: Wikipedia 3. Se calcula (n)=(p-1)(q-1), donde es la funcin de Euler. Tranquilos!! Ahora explico la funcion de Euler!. La funcin (n) de Euler (phi), se define como el nmero de enteros positivos menores o iguales a n y coprimos con n. Osea, la cantidad de nmeros menores o iguales a "n" que son coprimos con "n", es decir que no tienen ningun divisor comn que no sea 1. Por ejemplo: (36): Primero factorizamos 36: 36 = 2 * 2 * 3 * 3 = 2^2 * 3^2. Agarramos los primos que dividen a 36 osea "2" y "3", y aplicamos esta frmula: n * (1-1/p1) * (1-1/p2) * (1-1/p3) [...] (1-1/px). Siendo cada uno de los "p" los primos que dividen a 36. Aplicamos la frmula y nos queda: 36 * (1-1/2) * (1-1/3) = 36 * 2/3 * 1/2 = 12. Esto significa, que existen 12 nmeros menores a 36 que no son divisibles ni por 2 ni por 3, estos son: 1, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, y 35. Fun right?.

Cita de: Wikipedia 4. Se escoge un entero positivo e menor que (n), que sea coprimo con (n). * "e" se da a conocer como el exponente de la clave pblica. * Un exponente e muy pequeo (p. ej. e = 3) podra suponer un riesgo para la seguridad. Volviendo al ejemplo anterior, un nmero entero positivo "e" menor que (n), que sea coprimo con (n) podra ser: 5, 7 11. No tienen por qu ser primos, con un "n" ms grande, obtendramos "e" que no fuesen primos. Cita de: Wikipedia 5. Se determina un d (mediante aritmtica modular) que satisfaga la congruencia de cong(1) mod (n) * Expresado de otra manera, de 1 es dividido por a (n)=(p-1)(q-1). * Esto suele calcularse mediante el algoritmo de Euclides extendido. * d se guarda como el exponente de la clave privada. El algoritmo de Euclides Extendido, se puede utilizar para calcular "d". Siendo que este algoritmo requiere conocimientos algebricos y de matrices que realmente no tiene ningun sentido ponerse a explicar y en caso de que hiciese falta aplicarlo en algn cdigo, este se puede conseguir googleando un rato, voy a saltar explicarlo y vamos a pasar directamente al resultado. Ejemplo: 1) p = 61 q = 53. 2) n = 61 * 53 = 3233 3) (n) = (p - 1) * (q - 1) = 3120. 4) e = 17. (Coprimo con 3120). (Este es el exponente pblico). 5) d = 2753 Recordemos que 17*2753 - 1 = 46800. Y que 46800 / 3120 = 15 (es exacta). La clave pblica est compuesta por "e" y por "n", osea el exponente pblico y el mdulo. La clave privada est compuesta por "d" y por "n", osea el exponente privado y el mdulo. Cifrando: Primero, se divide el mensaje en bloques, de tal manera, que esos bloques, se puedan representar en nmeros menores a "n". Ejemplo: Tengo el plaintext "APOKLIPTICO". Yo se que si lo quisiese expresar en nmeros, estos seran 65, 80, 79, 75, 76, 73, 80, 84, 73, 68 y 79 (en la tabla ASCII). Obviamente este es un mtodo ineficiente de dividir el mensaje, pero para la base terica sirve. Entonces, para cifrar: m^e mod n = c. Siendo: "m" el bloque del plaintext, "e" el exponente pblico, "n" el mdulo y "c" el bloque del ciphertext. Ejemplo: Mensaje = "APOKLIPTICO". n = 3233 e = 17 d = 2753 Bloques: 65, 80, 79, 75, 76, 73, 80, 84, 73, 68 y 79 (uno para cada letra). Aplicando la frmula: 65^17 mod 3233 = 2790. 80^17 mod 3233 = 2933. [...] 68^17 mod 3233 = 1759. 79^17 mod 3233 = 1370.

Descifrando: Se obtienen los paquetes cifrados y se les aplica esta frmula: c^d mod n = m. Siendo: "c" el bloque del ciphertext, "d" el exponente privado, "n" el mdulo y "m" es el bloque original del plaintext. Comprobmoslo con un ejemplo: 2790^2753 mod 3233 = 65 2933^2753 mod 3233 = 80 [...] 1759^2753 mod 3233 = 68 1370^2753 mod 3233 = 79 Ahora, ustedes se preguntarn como hago para elevar 2790 a la 2753ava potencia. La respuesta es muy simple: No hace falta hacerlo. Se utiliza un mtodo llamado "exponenciacin modular" que en definitiva, es aplicar el mdulo cada vez que multiplicamos por la base. Ejemplo: 77^6 mod 10: 77*77 mod 10 = 9 (Exponente = 2). 9*77 mod 10 = 3 (Exponente = 3). 3*77 mod 10 = 1 (Exponente = 4). 1*77 mod 10 = 7 (Exponente = 5). 3*77 mod 10 = 9 (Exponente = 6). Resultado: 9. Si uno agarra la calculadora y hace 77^6 = 208422380089 mod 10 = 9. Esto con un pequeo loop en un programa se puede hacer rpidamente. Cdigo
function modular_pow(base, exponent, modulus) c := 1 for e_prime = 1 to exponent c := (c * base) mod modulus return c

Eso es en pseudocdigo para los entendidos. Fuentes y lecturas recomendadas: http://es.wikipedia.org/wiki/RSA http://foro.elhacker.net/criptografia/rsa_para_no_iniciados-t67109.0.html http://es.wikipedia.org/wiki/N%C3%BAmeros_primos_entre_s%C3%AD http://es.wikipedia.org/wiki/Algoritmo_de_Euclides#Algoritmo_de_Euclides_extendido

Diffie-Hellman
Algoritmo de intercambio de claves Diffie-Hellman por Braulio.

ElGamal

Elgamal, es un cifrado asimtrico basado en el intercambio de claves Diffie-Hellman, este algoritmo fue creado en 1985 por Taher Elgamal. Este algoritmo se puede utilizar tanto para cifrar datos como para crear firmas digitales. Este algoritmo se utiliza en el conocido sistema de cifrado y firmas digitales PGP y en su equivalente freeware GPG. Su fortaleza se basa en la imposibilidad de calcular eficientemente el logaritmo discreto. Generacin de claves. Se elige "p" que va a ser un nmero primo grande. Se elige "g" que es un generador del grupo multiplicativo Gp, esto es un nmero que elevado a sucesivas potencias modulo "p", va a dar todos los nmeros del conjunto exctamente una vez, este conjunto, est formado por todos los nmeros que son coprimos con "p", como "p" es primo, ese conjunto contendr todos los nmeros de 1 a p-1: Ejemplo: p = 19 g = 2. Todas las exponenciaciones son mod p: 2^1 = 2 2^7 = 14 2^13 = 3 2^2 = 4 2^8 = 9 2^14 = 6 2^3 = 8 2^9 = 18 2^15 = 12 2^4 = 16 2^10 = 17 2^16 = 5 2^5 = 13 2^11 = 15 2^17 = 10 2^6 = 7 2^12 = 11 2^18 = 1 Como ven, todos los numeros aparecen en las primeras 18 potencias. Las siguientes 18 potencias darn devuelta la misma seguidilla de nmeros. Se elige "k" tal que 2 <= k <= (p -2). La clave pblica ser entonces compuesta por p, a y (a^k mod p). La clave privada ser entonces "k". Cifrado Se recibe la clave pblica compuesta por p, a y (a^k mod p). Se divide en bloques el plaintext como se hizo con RSA, cada bloque "m" de tal manera que queden menores a "p". Se elige un entero aleatorio "l" tal que 2 <= l <= (p-2). Se calcula: d = a^l mod p e = m * (a^k)^l mod p. El ciphertext entonces ser "d" y "e". Descifrado Se utiliza la clave privada "k" para computar: m = d^(p-1-k)*e mod p. "m" es el bloque del plaintext. Ejemplo: Elegimos "p" = 541 y "a" = 2. Comprobamos que "a" sea generador del grupo multiplicativo finito Ap. Para esto, podemos usar herramientas existentes o programar nuestra propia pieza de cdigo, yo hice una en c++, es muy ineficiente y hay algoritmos de aproximacion ya existentes que lo hacen ms facil, este lo pueden encontrar en el apndice "B". Elegimos "k" = 113 tal que 2 <= k <= (p-2). Definimos entonces: Clave pblica = p, a y a^k mod p = 541; 2; 454.

Clave privada = 113. Plaintext = hola. Lo dividimos por caracter segn su valor ascii: 104, 111, 108, 97. Elegimos "l" = 14. Calculamos el ciphertext: 2^14 mod 541 = 154. 104 * 454^14 mod 541 = 279. [...] El primer bloque cifrado sera: 154; 279. Si lo queremos descifrar: 154^(541-1-113)*279 mod 541 = 104. Tenemos devuelta el plaintext. Recuerden que todas esas exponenciaciones, se deben resolver por una cuestion de aprovechamiento de recursos y facilidad, con exponenciacin modular. Fuentes y lecturas recomendadas: http://www.usna.edu/Users/math/wdj/book/node48.html http://www.informatics.indiana.edu/markus/i400/lecture7.ppt (Ignoren la ltima parte sobre criptoanlisis, zero-knowledge y escrow method). http://es.wikipedia.org/wiki/Cifrado_ElGamal (Bastante complicado de entender, conocimientos de lgebra de grupos)

Apndice A: Generadores de nmeros Pseudo-aleatorios. A.K.A. PRNG (Pseudo-Random Number Generator). Un generador pseudo-aleatorio, es una frmula matemtica que basado en un nmero base, llamado "semilla" o "seed", da como salida nmeros que tratan de asemejar aleatoriedad. Por qu digo "Asemejar"? Ninguna frmula matemtica puede por si sola generar una secuencia de nmeros realmente aleatorios, ya que en las matemticas, hay una serie de causa-consecuencia que lleva a un resultado final, que siempre va a ser el mismo. Para ponerlo en trminos ms simples 2 + 2 va a ser siempre 4. Los PRNG ms famosos son el Blum Blum Shub, el Fortuna y el Mersenne Twister. Los PRNG, estn presentes en gran parte de los algoritmos, ya sea como parte del cifrado en si o en la generacin de claves, lo que hace que sean importantsimos para la seguridad del algoritmo, para ser seguros, deben cumplir con estas caractersticas: a) Dar una salida que incluya todo el rango de nmeros que se le pide de manera distribuida, maximizando la entropa, osea, tratando de que haya igual cantidad de cada nmero. b) No ser previsibles. c) La semilla no debe ser posible de conseguir teniendo la salida. Otro factor que hace inseguros los PRNG, es la complejidad de la semilla, si un PRNG se le da como semilla un nmero "n", la salida de dicho PRNG ser siempre la misma hasta que se cambie dicho nmero. Entonces, si uno tiene como semilla al crear una clave criptogrfica algo demasiado simple, otra persona podra usar esa semilla para producir sus propias claves, haciendo intil el cifrado de datos.

Apndice B: Pequeo cdigo para comprobar si "g" es generador de grupo multiplicativo finito "Gp". Cdigo

#include <iostream> #include <math.h> #define GENERATOR 2 #define MODULUS 19 using namespace std; long modpow(long modulus, long base, long exponent); int main() { bool testarray[MODULUS]; bool gen = true; for(int i = 0; i < MODULUS - 1;i++) testarray[i] = false; for(int i = 0; i < MODULUS - 1;i++) { long long r = modpow(MODULUS, GENERATOR, i+1); if(testarray[r]) { gen = false; break; } testarray[r] = true; if(i%10000 == 0) cout << i << endl; } if (gen) for(int i = 1; i < MODULUS; i++) if(!testarray[i]) { gen = false; break; } if (gen) cout << "Generator!" << endl; else cout << "Not a generator" << endl; } long modpow(long modulus, long base, long exponent) { long Output = 1; for(int i = 1; i <= exponent; i++) { Output = (Output * base)%modulus; } return Output; }

Como ven, defin la funcion modpow que es como haba dicho antes, la exponenciacin modular.

Bueno, por una cuestin de que ya tienen suficiente con estos algoritmos, el algoritmo DSA, ser puesto en la siguiente entrega. Cuando vea que ya no hay ms preguntas, pondr el siguiente Captulo. Cualquier error que se llegue a encontrar, por favor comunicarmelo por PM. Un abrazo APOKLIPTICO
Toda la informacin expuesta en este taller, est protegida bajo licencia Creative Commons Attribution-NonCommercial-ShareAlike 2.5.

Captulo III. Este captulo fue escrito mientras se escuchaba: Yes (The Ladder + Fragile + Union) y Genesis (Foxtrot + From Genesis to revelation + Nursery crime). Continuamos entonces con lo dejado en el captulo anterior, faltaba describir DSA, luego vamos a hacer un pequeo vistazo sobre hashes y algoritmos de cifrado simtricos, no tanto en profundidad como los asimtricos, pero suficiente como para que puedan entender la siguiente entrega (Public Key Infraestructure, Certificados y sistemas de autenticacin). Comenzemos entonces: DSA (Digital Signature Algorithm). NOTA: Para los que no tienen ni idea de lo que es un hash, recomiendo que lean primero esa parte, y luego comenzar con DSA, ya que este tiene contenidos sobre hashes. Cita de: Wikipedia DSA (Digital Signature Algorithm, en espaol Algoritmo de Firma digital) es un estndar del Gobierno Federal de los Estados Unidos de Amrica o FIPS para firmas digitales. Fue un Algoritmo propuesto por el Instituto Nacional de Normas y Tecnologa de los Estados Unidos para su uso en su Estndar de Firma Digital(DSS), especificado en el FIPS 186. DSA se hizo pblico el 30 de agosto de 1991, este algoritmo como su nombre lo indica, sirve para firmar y no para cifrar informacin. Una desventaja de este algoritmo es que requiere mucho ms tiempo de cmputo que RSA. Como ven, estamos hablando de un algoritmo de firma digital, no de cifrado. Una firma digital, es una manera de comprobar que un archivo determinado est siendo enviado por la persona correcta. Es decir, evitar que un documento sea manipulado mientras se transmite por canales inseguros. Generacin de claves: 1) Se elige un algoritmo de Hash estndar, generalmente se suele usar SHA-1 o SHA-256, para ms seguridad. 2) Se elige la longitud de la clave en bits, utilizando dos valores "L" y "N", siendo "L" un mltiplo de 64, generalmente por una cuestin de seguridad de ms de 1024 bits, y "N" la longitud de la salida del Hash. 3) Se elige un nmero primo "q" de como mximo "N" bits de longitud. 4) Se elige un nmero primo "p" de como mximo "L" bits de longitud, que se utilizar como mdulo. (p-1) debe ser mltiplo de "q". 5) Se calcula "g" de esta manera: g = h^((p-1) /q) mod p, siendo "h" un nmero arbitrario entre [2, p1). Si esta frmula da como resultado "1" se debe elegir otro "h". Generalmente por cuestiones de eficiencia se suele elegir h = 2. Se publican "p" "q" y "g" a los dems usuarios del sistema, estos sern los parmetros que les permitirn a los dems usuarios calcular sus propias claves autenticadas: 1) Se elige "x" por un mtodo suficientemente aleatorio tal que 0 < x < q. 2) Se calcula y = g^x mod p. La clave pblica ser (p, q, g, y). La privada es "x". Recordemos que la exponenciacin modular es calculable utilizando la frmula ya expuesta, y que no es necesario calcular primero la exponenciacin y luego el mdulo. Firmando. 1) Ya se conoce la funcin hash utilizada "H". 2) Se genera un nmero aleatorio "k" creado para el mensaje tal que 0 < k < q. Se descarta este "k" una vez utilizado.

3) Se calcula r = (g^k mod p) mod q. 4) Se calcula s = (k^-1 * (H(m) + x*r)) mod q. Recordemos que H(m) es la funcin de hash aplicada al mensaje a firmar "m". 5) Se debe recalcular la firma en caso de que r = 0 o s = 0, a pesar de que dichos escenarios son bastante poco probables. La firma digital ser entonces (r, s). Verificando la firma. 1) La firma ser invlida si las condiciones "0 < r < q" y "0 < s < q" no son satisfechas. 2) Se calcula w = s^-1 mod q. 3) Se calcula u1 = (H(m) * w) mod q. 4) Se calcula u2 = (r*w) mod q. 5) Se calcula v = ((g^u1 * y^u2) mod p) mod q. Aclaracin: k^-1 mod q, representa el inverso multiplicativo de "k", que en este caso, no es solo 1/k. k^-1 mod q se define tal que k^-1 * k mod q = 1. Por ejemplo: k = 21 q = 100. k^-1 mod 100 = 81. Ya que 21 * 81 mod 100 = 1. Se puede calcular tanto con fuerza bruta (lo que puede llevar mucho tiempo), como con el algoritmo de euclides extendido (el mismo que se utiliza para calcular el exponente privado de RSA). La firma se valida si v = r. Como ven, en este algoritmo la clave privada se utiliza para firmar, y la pblica se utiliza para comprobar la firma. Los parmetros Ejemplo: Generamos una clave: 1) Elijo como algoritmo de Hash uno ficticio, por cuestiones de practicidad para el ejemplo. 2) Como longitud de claves en bits, elijo L = 64 y N = 8. Devuelta, para hacerlo prctico para el ejemplo. 3) Elijo un nmero primo "q" de hasta 8 bits. q = 97. 4) Elijo un nmero primo "p" de hasta 64 bits, que se utilizar como mdulo tal que (p-1) es mltiplo de "q". p = 389. 388 = 97 * 4. 5) g = 2^((389-1)/97) mod 389 = 16. Tenemos entonces los parmetros (389, 97, 16). Ahora calculamos las claves: 1) Elegimos "x" = 25. 2) Calculamos y = 16^25 mod 389 = 142. Clave pblica = (389, 97, 16, 142). Clave privada = 25. Firmamos un mensaje: 1) Tenemos la funcin de hash ficticia con una salida de 8 bits. Supongamos que H(m) = 75. 2) Se genera un nmero aleatorio "k" = 66. 3) Se calcula r = (16^66 mod 389) mod 97 = 76. 4) Se calcula s = (66^-1 * (75 + 25*76)) mod 97 = 2 (66^-1 mod 97 = 25). 5) Se debe recalcular la firma en caso de que r = 0 o s = 0, a pesar de que dichos escenarios son bastante poco probables. La firma entonces va a ser (76, 2).

Verificamos la firma. 1) 0 < 76 < 97 y 0 < 2 < 97. 2) Se calcula w = 2^-1 mod q = 49. 3) Se calcula u1 = (75 * 49) mod 97 = 86. 4) Se calcula u2 = (76*49) mod 97 = 38. 5) Se calcula v = ((16^86 * 142^38) mod 389) mod 97= 76. 6) r = v --> Firma verificada!. Fuentes: http://www.itl.nist.gov/fipspubs/fip186.htm http://es.wikipedia.org/wiki/DSA

Hashes Cita de: Wikipedia En informtica, hash se refiere a una funcin o mtodo para generar claves o llaves que representen de manera casi unvoca a un documento, registro, archivo, etc., resumir o identificar un dato a travs de la probabilidad, utilizando una funcin hash o algoritmo hash. Un hash es el resultado de dicha funcin o algoritmo. Una funcin de hash es una funcin para resumir o identificar probabilsticamente un gran conjunto de informacin, dando como resultado un conjunto imagen finito generalmente menor (un subconjunto de los nmeros naturales por ejemplo). No se dejen confundir con la palabra "claves", esta no tiene nada que ver con las claves que se utilizan en criptografa para cifrar o descifrar datos. Probablemente la definicin de wikipedia sea un poco confusa al principio, asi que vamos a hecharle un poco de claridad: Tenemos un texto, documento o cualquier informacin, la llamaremos "m". Tenemos tambin una funcin de hash o resumen, la llamaremos H(). Entonces: Cuando se aplica H(m), se realizan un conjunto de operaciones matemticas, que dan como resultado un resumen del mensaje original, que en un algoritmo real y seguro, debe tener las siguientes caractersticas: - Determinado. Esto quiere decir, que dado un valor de entrada igual, la salida debe de ser igual, es decir: Si se calcula H(m) = x Y luego H(m) = y Entonces x = y. - Uniforme. Esto siginifica que la salida debe de ser lo ms uniforme posible, es decir se debe utilizar todo el rango de salida de manera pareja y maximizando la entropa. - Irreversible. Si se calcula H(m) = x, resultar infeasible calcular "m" teniendo "x". Esto se puede lograr utilizando funciones "trampa" como el mdulo y los operadores binarios "AND" "OR" y "NOT". - No relacin entre tamaos de salida/entrada. Esto singifica que el tamao de la salida no debe ser afectado por el tamao de la entrada, ya sea que la entrada es muy pequea, o muy grande, el tamao de salida no debe de estar conectado con el de entrada. - Tamao mximo de salida fijo. Esto significa que cada algoritmo debe ajustarse a un tamao de salida estandarizado, los valores no pueden superar este tamao mximo. Por ejemplo, en MD5, el tamao mximo es 128 bits.

- Eficiente. Se busca que el algoritmo de hash consuma la menor cantidad de recursos, sin perder seguridad. Algoritmos de Hash ms conocidos: GOST 256 bits HAS-160 160 bits HAVAL 128 to 256 bits MD2 128 bits MD4 128 bits MD5 128 bits RadioGatn Up to 1216 bits RIPEMD-64 64 bits RIPEMD-160 160 bits RIPEMD-320 320 bits SHA-1 160 bits SHA-224 224 bits SHA-256 256 bits SHA-384 384 bits SHA-512 512 bits Skein 256, 512 or 1024 bits Snefru 128 or 256 bits Tiger 192 bits Whirlpool 512 bits FSB 160 to 512 bits ECOH 224 to 512 bits SWIFFT 512 bits Colisiones de Hash. Una colisin de Hash, es cuando la salida de un algoritmo de hash, es idntica para dos mensajes diferentes, es decir: H(m1) = x H(m2) = y x = y. m1 <> m2. Probabilsticamente hablando, es imposible crear una funcin de hash que tenga una salida diferente para cada mensaje, ya que el tamao del valor de entrada puede ser [0, inf) y la salida, puede ser [0, Hmax] siendo Hmax el tamao mximo de salida de un Hash. Sin embargo, se considera generalmente infeasible encontrar dos mensajes diferentes m1 y m2 tal que H(m1) = H(m2), debido a la regla de uniformidad y irreversibilidad, que asegura que la salida no va a tener ninguna correlacin aparente con la entrada. Calcular con fuerza bruta una colisin de hash, requiere muchsimos recursos, se ha logrado nicamente utilizando redes de cmputo. Por ejemplo, MD5, tiene una salida de 128 bits, eso significa que hay 2^128 posibilidades distintas o 256^16. Utilizando software de cracking que utiliza la GPU para crackear, yo puedo calcular 950 Millones de hashes por segundo, an as, si quisiese calcular el espectro entero de md5, tardara aproximadamente 11358 trillones de aos en calcularlo. Sin embargo, se han encontrado vulnerabilidades de hashes, que hacen que crear colisiones con ataques especializados sean no solo feasibles, sino extremadamente simples de lograr. Como ejemplo,

el algoritmo de hashing md5, fue quebrado por Tao Xie y Dengguo Feng de tal manera que se puede calcular una colision en una fraccin de segundo. Por si les interesa crackear hashes con su GPU: http://foro.elhacker.net/criptografia/rompiendo_hashes_y_passwords_rar_con_la_gpu-t277060.0.html Fuentes: http://en.wikipedia.org/wiki/Hash_function (La versin en espaol no es muy buena). http://es.wikipedia.org/wiki/Colisi%C3%B3n_%28hash%29 http://en.wikipedia.org/wiki/MD5

Criptografa Simtrica Cita de: Wikipedia La criptografa simtrica es un mtodo criptogrfico en el cual se usa una misma clave para cifrar y descifrar mensajes. Las dos partes que se comunican han de ponerse de acuerdo de antemano sobre la clave a usar. Una vez ambas tienen acceso a esta clave, el remitente cifra un mensaje usndola, lo enva al destinatario, y ste lo descifra con la misma. Como ya vimos en otras entregas, generalmente se suele utilizar la criptografa simtrica conjunta con la asimtrica, ya que la asimtrica provee un canal seguro para compartir la clave, pero no posee la eficiencia y velocidad de un algoritmo simtrico. Ejemplos de algoritmos simtricos muy usados son: Twofish 128, 192 o 256 bits. Serpent 128, 192 o 256 bits AES (Rijndael) 128, 192 o 256 bits Blowfish 8448 bits en mltiplos de 8 bits. CAST5 40-128 bits. RC4 402048 bits TDES 168, 112 o 56 bits IDEA 128 bits Por qu utilizar criptografa simtrica? - Mayor velocidad. Si analizamos un cifrado asimtrico muy comn como RSA con uno simtrico como AES, veremos que AES utiliza pocas operaciones y estas operaciones son generalmente lineales, es decir, se computan rpidamente. Las claves generadas para AES, se generan pseudoaleatoriamente y no deben tener ninguna caracterstica especial. Sin embargo, RSA utiliza bastantes operaciones que requieren exponenciacin modular, que con exponentes grandes, necesitar miles de veces la cantidad de ciclos que se utilizan para una operacin de AES. Por otro lado, la generacin de claves para RSA requiere test de primalidad que requieren mucha capacidad de cmputo y esta aumenta de manera no lineal con el tamao de las claves, es decir, calcular una clave de 2048 bits va a tardar mucho ms que el doble que una de 1024 bits. - Mayor seguridad con claves ms pequeas. Debido a que se reducen las posibles claves con RSA debido a que los valores generadores son nmeros primos, este requiere que sean mucho ms grandes que si fuese una clave simtrica, que puede ser cualquier nmero.

Una clave de 1024 bits de un algoritmo asimtrico, da la misma seguridad que una clave de aproximadamente 80 bits de un algoritmo simtrico, una de 2048 bits asimtrica da la misma seguridad que una de 112 bits simtrica y una de 3072 bits es equivalente a una de 128 bits. Esto vara dependiendo de los cifrados involucrados. Por otro lado, una clave de 256 bits simtrica, solo se iguala con una clave de 15360 bits asimtricos. Calcular una clave de tal tamao, puede tardar muchisimo tiempo computacional. - Poseen un riesgo mucho menor de ser rotos por la computacin cuntica. En este momento se estn haciendo investigaciones sobre la siguiente era de la informacin, la computacin cuntica, gracias al algoritmo de Shor, se podra factorizar una multiplicacin de dos primos utilizando una de estas computadoras feasiblemente, dando por concluida la era de los algoritmos asimtricos actuales. En otras palabras, se tardara el mismo tiempo en utlizar una clave asimtrica en una computadora normal, que crackearla en una computadora cuntica equivalente. Los algoritmos simtricos, reduciran su complejidad de crackeo a la mitad gracias a la computacin cuntica, es decir que una clave de 128 bits, equivaldra a una de 64 bits en seguridad. Sin embargo, esto se puede solucionar duplicando el tamao de las claves, a expensas de un tiempo de cmputo ligeramente mayor. Esto quiere decir: Si van a guardar informacin cifrada por mucho tiempo, utilizen un algoritmo simtrico y claves muy grandes. Fuentes: http://en.wikipedia.org/wiki/Advanced_Encryption_Standard (Muy bueno). http://www.mscs.dal.ca/~selinger/md5collision/ http://es.wikipedia.org/wiki/Criptograf%C3%ADa_sim%C3%A9trica http://en.wikipedia.org/wiki/Key_size

Apndice A: Entropa. Cita de: Wikipedia Entropa es un concepto en termodinmica, mecnica estadstica y teora de la informacin. La entropa se concibe como una "medida del desorden" o la "peculiaridad de ciertas combinaciones". Como la entropa puede ser considerada una medida de la incertidumbre, y la informacin tiene que ver con cualquier proceso que permite acotar, reducir o eliminar la incertidumbre; resulta que el concepto de informacin y el de entropa estn ampliamente relacionados entre s, aunque se necesitaron aos de desarrollo de la mecnica estadstica y de la teora de la informacin antes de que esto deviniera aparente. Vamos a explicarlo con un ejemplo prctico: Tenemos un archivo, este archivo, puede contener cualquiera de los caracteres en el cdigo ascii, cada uno representado por un nmero del 0 al 255. Podemos entonces contar la cantidad de cada caracter en ese archivo, es decir la frecuencia. Por ejemplo: "0" = 10, "1" = 3, "2" = 1, (...), "254" = 4, "255" = 0. Una vez contados la cantidad de caracteres, calculamos las frecuencias relativas, es decir, xi/n, siendo "n" el tamao del archivo en bytes. Por ejemplo: "0" = 0.025, "1" = 0.050, etc. Una vez que hicimos todos esos clculos, calculamos la entropa del archivo: Entropia = sum(-xir[ i ] * log(xir[ i ], 2)) Siendo: xir[ i ] la frecuencia relativa de cada elemento "i", log(x,y) es el logaritmo de "x" base "y" y sum() es la sumatoria. Esto va a dar un nmero entre 0 y 8. Este nmero, representa la entropa del archivo, siendo "0" sin

entropa y "8" con entropa mxima, es decir que existe la misma cantidad de los 256 caracteres. Los buenos algoritmos de compresin y de cifrado, dan como salida una entropa cercana a 8, sin importar la entropa de la entrada. Este es el primer criterio que se utiliza para el criptoanlisis de un algoritmo, ya que si su entropa de salida es baja, se considera que no es lo suficientemente seguro. Fuente: http://es.wikipedia.org/wiki/Entrop%C3%ADa_%28informaci%C3%B3n%29 Les paso un cdigo que hice: http://foro.elhacker.net/criptografia/calcular_entropia_de_un_archivo_en_c-t237720.0.html

Bueno, la siguiente entrega, vamos a tratar sistemas criptogrficos como PKI, Certificados y sistemas de autenticacin, vayan leyendo, posteen sus preguntas y como siempre en ESTE thread, cuando no haya ms preguntas, posteo la siguiente entrega. Un abrazo APOKLIPTICO Toda la informacin expuesta en este taller, est protegida bajo licencia Creative Commons Attribution-NonCommercial-ShareAlike 2.5.

Captulo IV. Este captulo fue escrito mientras se escuchaba: Yes (Magnification), Pink Floyd (The Final Cut), Green Day (Dookie), Oasis (Dig out your soul). Guten tag homies! Volvemos entonces a metaforicamente encontrarnos, esta vez con la intencin de conocer en profundidad las PKI (Public Key Infraestructure), en la que est incluido los certificados y los sistemas de autenticacin. Tambin, a pedido de la gente, va a haber un apndice con los test de primalidad ms usados. Let us begin then: PKI (Public Key Infraestructure). Cita de: Wikipedia. En criptografa, una infraestructura de clave publica (o, en ingls, PKI, Public Key Infrastructure) es una combinacin de hardware y software, polticas y procedimientos de seguridad que permiten la ejecucin con garantas de operaciones criptogrficas como el cifrado, la firma digital o el no repudio de transacciones electrnicas. En definitiva, las PKI son las nicas formas de realmente reducir al mnimo los riesgos de seguridad debido a canales inseguros de comunicacin. Ya que se crean certificados que luego servirn para firmar las claves publicas de cifrados asimtricos, que a su vez se utilizarn para cifrar claves simtricas y que estas a su vez se utilizaran para crear los canales seguros. Las PKI, se conforman de la siguiente manera:

- CA (Certificate Authority o Autoridad de Certificacin): Encargada de firmar las claves criptogrficas, generando certificados. La seguridad que se le atribuye a un determinado certificado, se basa en la confianza que se le tiene a la CA. Si uno no puede confiar en un determinado CA, no se puede confiar en el certificado.

- Certificados digitales: Son en definitiva claves pblicas firmadas digitalmente, utilizadas para generar canales seguros. Para una explicacin ms profunda, ver el apartado "Certificados Digitales". - Computadoras y servidores: Estos son los que gozarn de los beneficios de las PKI, ya sea firmando sus claves gracias al CA, verificando que una clave pblica venga de donde tiene que venir y no haya sido modificada o autentificandose utilizando claves firmadas. - VA(Verification Authority o Autoridad de Verificacin), LDAP (Lightweight Directory Access Protocol) o directorios X.500: Estos son los encargados de guardar todas las claves y suministrarlos a los que lo solicitan, siempre y cuando tengan los privilegios para pedirlos. Generalmente los certificados de autenticacin son dados a todos los que lo soliciten, para verificar que las claves sean vlidas. Estas son tambin las encargadas de verificar cuales son los certificados digitales que han expirado o han sido revocados. - RA (Registration Authorities o Autoridad de Registracin): Los RA's son necesarios cuando el CA no puede manejar todo el volumen de registraciones/revocaciones de claves, las RA's son las encargadas de manejar todos los datos, ordenarlos y filtrarlos y luego enviarlos a la CA para que firme las claves. Es decir, si una persona quiere firmar una clave, debe ir a la RA, hacer todos los trmites necesarios, y luego el CA recibe la clave, la firma y la reenva al RA, que luego se la suministrar a la persona original. Pongamos un ejemplo para verlo ms claramente. APOK quiere crear su servidor web, destinado a un e-commerce. Como ley los tutoriales en el elhacker.net, sabe que debe tener conexiones seguras para sus clientes. 1) Elige como algoritmo simtrico AES-256 bits y para cifrar las claves del mismo, RSA-2048 bits. 2) Crea su clave RSA-2048 bits y contrata a un CA, le enva su clave pblica y esta la firma con la clave de firmado y le devuelve un certificado digital. 3) Una vez creado el servidor, un cliente intenta conectarse: 4) El cliente, recibe el certificado digital, como la CA es una entidad conocida y su sistema operativo ya tiene cargado el certificado de verificacin, este lo verifica como vlido. 5) El cliente crea una clave aleatoria simtrica para el cifrado AES-256 bits y se la enva al server. Una vez creado el canal seguro, ambos pueden comenzar a intercambiar datos. Esta es la base del Handshake de TLS(Transport Layer Security) que es el sucesor de SSL (Secure Sockets Layer). Fuentes: http://en.wikipedia.org/wiki/Public_key_infrastructure http://en.wikipedia.org/wiki/Transport_Layer_Security - Cryptography for Dummies by Chey Cobb. (No puedo poner el link ya que est bajo Copyright, pero entre nos, google es su amigo). Parecer medio estpido por el nombre, pero es un libro muy didctico y explicativo. Lo recomiendo.

Certificados digitales. Cita de: Wikipedia. Un certificado digital es un documento digital mediante el cual un tercero confiable (una autoridad de certificacin) garantiza la vinculacin entre la identidad de un sujeto o entidad y su clave pblica. El certificado contiene usualmente el nombre de la entidad certificada, nmero de serie, fecha de expiracin, una copia de la clave pblica del titular del certificado (utilizada para la verificacin de su

firma digital) y la firma digital de la autoridad emisora del certificado de forma que el receptor pueda verificar que esta ltima ha establecido realmente la asociacin. Recuerdan cuando vimos que la criptografa asimtrica estaba expuesta a ataques de MITM (Man in the middle)? Bueno, los certificados son la manera de evitar estos ataques MITM. Recordemos un poco: Un ataque MITM, es una tcnica que se utiliza para capturar y/o modificar informacin que transita una red de computadoras. Se basa en, utlizando diversas tcnicas (Arp poisoning, redes switcheadas, captura de paquetes wi fi, etc), situarse entre dos o ms computadores, de tal manera que se pueda ver y/o modificar los paquetes que se transmiten entre las mismas. Entonces:

Si uno lo traslada a la criptografa asimtrica, un atacante "Eve" (de Eavesdropper = Escuchar secretamente), podra modificar las claves pblicas que se transmiten entre Alice y Bob, con unas creadas por l mismo, permitiendo de esta manera descifrar cualquier paquete que transite el canal supuestamente seguro. Para evitar esto, se crearon los Certificados digitales, que permiten que las claves pblicas creadas por una persona que intenta crear un canal seguro, puedan ser identificadas como seguras, es decir que no fueron manipuladas. Para esto, la clave va a ser firmada digitalmente por una "CA", "Certificate Authority" o "Autoridad de Certificacin". Esta va a ser la encargada de crear y revocar certificados digitales, asi como de hacer de "Autoridad de confianza" (Trusted Third Party), dando seguridad de que las claves no fueron manipuladas. Generando un certificado. Para generar un certificado, primero tenemos que elegir que algoritmos utilizaremos, los tamaos de las claves y parametros de los algoritmos y si vamos a utilizar un CA o vamos a hacer como nuestro propio CA. Una herramienta para crear claves y certificados, es la conocida OpenSSL, opensource y distribuida bajo GNU. En caso de que contratemos un CA, lo nico que tendremos que hacer, es crear nuestra propio par de claves y enviarle la clave pblica al CA, de esta manera, el CA la firma y nos la devuelve firmada, este ser nuestro certificado. OpenSSL por ejemplo, crear dos archivos con extension .key y .csr siendo la clave privada y pblica respectivamente. El certificado, ser un archivo con extensin .crt. Si quieren, pueden analizar un certificado conectndose a una pgina de manera segura y descargndolo. En firefox, se hace yendo al candadado de abajo a la derecha, en la tab de seguridad "ver certificado", "Detalles" y luego "exportar". Esto guardar el archivo .crt y lo podremos examinar. Si queremos hacer de nuestro propio CA, vamos a tener que crear nuestro certificado CA. Primero, debemos crear nuestro CA. Esto genera la clave privada (que ser usada para firmar) y la clave pblica o certificado CA (que ser utilizado para verificar las firmas). La clave privada debe ser guardada, ya que cualquiera en posesin de esta clave, podra generar claves firmadas, que luego podran ser utilizadas para ataques MITM. La clave pblica o certificado CA, debe ser distribuido a

todas las personas que vayan a recibir claves pblicas firmadas por nuestro CA, para que puedan verificarlas. Luego, generaremos nuestro par de claves publica y privada y firmaremos la clave pblica utilizando nuestra clave privada del CA. Ahora tenemos nuestro par de claves para ser utilizadas en cualquier conexin segura (HTTPS, FTPS, etc.). Obviamente es mucho ms facil hacer firmar nuestro par de claves por una entidad reconocida, pero esto suele costar dinero. Fuentes: http://es.wikipedia.org/wiki/Infraestructura_de_clave_p%C3%BAblica http://en.wikipedia.org/wiki/Transport_Layer_Security http://www.openssl.org/ http://es.wikipedia.org/wiki/Certificado_digital http://www.akadia.com/services/ssh_test_certificate.html

Apndice A: Tests de Primalidad. Los tests de primalidad tienen el fin de probar con certeza si un nmero natural es primo, es decir que solo es divisible por si mismo y por 1. Estos nmeros son muy importantes para los algoritmos asimtricos como ya hemos visto. Existen dos tipos de test de primalidad: los determinsticos y los probabilsticos. Los primeros, determinan con un 100% de seguridad, que el nmero es primo. Los segundos, determinan con un porcentaje menor al 100% de probabilidad, cuanto ms tiempo se los deja funcionar, menor va a ser la probabilidad de que un nmero no sea primo. 1) Test simple o test ingenuo. (Deterministico). Este es el ms conocido de todos los tests, y se trata simplemente de probar dividiendo todos los nmeros naturales entre 2 y n-1 siendo "n-1" el supuesto nmero primo. Este test es el menos eficiente de todos, es decir el que ms tiempo toma, sin embargo, se le puede hacer optimizaciones para mejorar su eficiencia: a) Probar slo hasta la raiz cuadrada de "n". Esto es debido a que si n es compuesto, puede ser factorizado en al menos dos valores, y al menos uno de estos valores debe ser menor o igual a la raiz cuadrada de n. b) Se pueden saltear la prueba de divisibilidad no probando los nmeros mltiplos de 2 excepto 2. Esto es debido a que si un nmero es divisible por un mltiplo de dos, ser divisible por 2 tambin. c) Se puede optimizar an ms si se observa que todos los primos excepto por 2 y 3 pueden ser formados con la frmula 6*k +/- 1 siendo "k" un nmero natural (esto no significa que todos los nmeros 6*k +/- 1 sean primos. Ej:k=4 6*4+1 = 25) . Esto acelera al menos 3 veces el test de primalidad. d) Tambin se pueden ir guardando todos los nmeros primos que se vayan encontrando, de esta manera se puede acelerar an ms la prueba, pero esto requiere mucha memoria para guardar los mismo. Les dejo un cdigo en C++ que incluye las optimizaciones a, b y c y su diferencia en velocidad. Cdigo
#include <ctime> #include <stdlib.h> #include <iostream> #include <math.h> using namespace std;

bool IsPrime0(long long number); bool IsPrime1(long long number); bool IsPrime2(long long number); bool IsPrime3(long long number); long long modpow(long long modulus, long long base, long long exponent); int main() { long long number = 0; int tantes = 0; int tdesp = 0; bool prime; cout << "Introduzca un numero para probar su primalidad: "; cin >> number; if(number == 0 || number == 1) { cout << "\nError: Numero introducido invalido." << endl; return 0; } cout << "Calculando sin optimizacion..."; tantes = clock(); prime = IsPrime0(number); cout << number % 3; tdesp = clock(); if(prime) cout << "\nNumero primo\n"; else cout << "\nNumero no primo\n"; cout << "Tiempo de calculo: " << (tdesp - tantes) / (float) CLOCKS_PER_SEC " Segundos." << endl << endl; cout << "Calculando con 1 optimizacion..."; tantes = clock(); prime = IsPrime1(number); tdesp = clock(); if(prime) cout << "\nNumero primo\n"; else cout << "\nNumero no primo\n"; cout << "Tiempo de calculo: " << (tdesp - tantes) / (float) CLOCKS_PER_SEC " Segundos." << endl << endl; cout << "Calculando con 2 optimizaciones..."; tantes = clock(); prime = IsPrime2(number); tdesp = clock(); if(prime) cout << "\nNumero primo\n"; else cout << "\nNumero no primo\n"; cout << "Tiempo de calculo: " << (tdesp - tantes) / (float) CLOCKS_PER_SEC " Segundos." << endl << endl; cout << "Calculando con 3 optimizaciones..."; tantes = clock(); prime = IsPrime3(number); tdesp = clock(); if(prime) cout << "\nNumero primo\n"; else cout << "\nNumero no primo\n"; cout << "Tiempo de calculo: " << (tdesp - tantes) / (float) CLOCKS_PER_SEC " Segundos." << endl; return 0; } bool IsPrime0(long long number) { for(long long i = 2; i < number; i++) { if(number%i == 0) {

<<

<<

<<

<<

return false; } } return true; } bool IsPrime1(long long number) { for(long long i = 2; i <= sqrt(number); i++) { if(number%i == 0) { return false; } } return true; } bool IsPrime2(long long number) { if(number%2 == 0 && number != 2) return false; for(long long i = 3; i < sqrt(number); i+= 2) { if(number%i == 0) { return false; } } return true; } bool IsPrime3(long long number) { bool minus = false; if(number == 2) return true; if(number%2 == 0 || number%3 == 0) return false; for(long long i = 5; i <= sqrt(number); i=i) { if(number%i == 0) { return false; } if(!minus) { i += 2; minus = true; } else { i += 4; minus = false; } } return true; }

En mi pc, para probar la primalidad de un nmero primo de 49 bits tard:

Sin optimizaciones: Demasiado. Con 1 Optimizacin: 1.64 Segundos. Con 2 Optimizaciones: 2.016 Segundos. Curioso que este tarda ms que el primero. Con 3 Optimizaciones: 1.375 Segundos. Con las optimizaciones parece realmente poco tiempo comparado con el test sin optmizaciones, sin embargo, vamos a ver que este algoritmo tiene una eficiencia muy baja. Fuente: http://es.wikipedia.org/wiki/Test_de_primalidad 2) Test Miller-Rabin (Probabilstico). El test original creado por Miller que es determinstico, est basado en la hiptesis de Riemann, que an no ha sido probada, es por esto, que Rabin lo modific para convertirlo en probabilstico. No voy a tratar la parte matemtica del algoritmo, ya que es extremadamente compleja y realmente no est a mi nivel y supongo que tampoco lo estar para la mayora de uds. El algoritmo es el siguiente: 1) Elegimos un nmero "n" para probar su primalidad mayor a 2 y obviamente impar. 2) Calculamos "s" de la siguiente manera, dividimos "n - 1" por 2 hasta conseguir un nmero impar. Entonces "s" va a ser la cantidad de veces que se dividi "n-1" para conseguir un impar. Osea n-1 = 2^s * d. Siendo "d" el nmero impar. 3) Se elige aleatoria y uniformemente un "a" tal que 0 < a < n. Uniforme, quiere decir que no se va a elegir dos veces el mismo "a", por cuestiones de eficiencia (no tiene sentido probar dos veces un "a"). 4) Se calcula p0 = a^d mod n y p(r) = a^((2^r)*d) mod n. Siendo "r" todos los valores naturales entre [0;s]. Si p0 <> 1 y todos los p(r) <> n-1 entonces "n" no es primo. 5) Si no se cumplen p0 <> 1 y p(r) <> n-1, entonces "n" es probablemente un nmero primo. 6) Cuantos ms "a" se prueben, mayor ser la probabilidad de que "n" sea primo. La probabilidad de que un nmero pasado por el test Miller-Rabin sea realmente primo, siempre y cuando los "a" escogidos sean aleatorios y uniformes, es de 1-(1/4)^k. Esto significa, que con solo probar 10 "k", tendremos un 99.99990463% de certeza de que "n" es primo. Bueno, estas funciones les permitira aplicar el Miller-Rabin para probar primalidad. Es posible que me haya equivocado en el cdigo y no toma valores demasiado altos, probablemente debido a un error de overflow en el mdulo. Si alguien quiere optimizarlo, mejor an! NOTA: Modifiqu la funcin modpow para optimizarla con el algoritmo de la exponenciacin binaria. Ahora es muchisimo ms rpido. Cdigo
bool MillerRabin(long long number, int tries) { srand(time(NULL)); if(number == 2) return true; if(number%2 == 0) return false; for(int r = 0; r < tries; r++) { long long nminus1 = number -1; int s = 0; do { nminus1 /=2; s++; }while(nminus1%2 == 0); long long a = ((long long)(rand() / (double) RAND_MAX * (number - 2) + 1))%1000; //Lmite en 1000 para ayudar al cmputo y evitar overflows.

bool prime = false; long long firstmp = modpow(number, a, nminus1); if(firstmp != 1 && firstmp != number -1) { for(int i = 1; i <= s; i++) { if(modpow(number, a, nminus1*pow(2,i)) == (number - 1)) { prime = true; break; } } } else prime = true; if(!prime) return false; } return true; } long long modpow(long long modulus, long long base, long long exponent) //Optimized Modpow with binary exponentiation. { long long Output = 1; long long nbase = base; long len = log(exponent) / log(2.0f) + 1; char *binexp = new char[len +10]; lltoa(exponent, binexp, 2); binexp[len] = 0; for(int i = len - 1; i >= 0; i--) { if(binexp[i] == '1') Output = fmod((Output * nbase),modulus); nbase = fmod((nbase * nbase),modulus); } return Output; }

Fuentes: http://planetmath.org/encyclopedia/MillerRabinPrimeTest.html http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test 3) Test de Fermat. (Probabilistico) 1) Se elige un nmero para aplicarle el test de primalidad "n". 2) Se elige aleatoria y uniformemente "a". 3) Se calcula p = a^(n-1) mod n. 4) Si "p" <> 1, entonces n no es primo. 5) Si "p" = 1, entonces n es probablemente primo. 6) Si se desea mayor seguridad sobre la primalidad, se debe calcular otros valores de "a". La probabilidad de que un nmero pasado por el test de Fermat sea realmente primo, siempre y cuando los "a" escogidos sean aleatorios y uniformes, es de 1-(1/2)^k. Esto significa que debemos calcular al menos 20 valores de "a" para tener la misma probabilidad de xito que el algoritmo MillerRabin. Sin embargo, existe una excepci para esto: Los nmeros de Carmichael (y no estoy hablando de la identidad secreta de "Chuck"), son nmeros

compuestos para los cuales todos los valores de a que sean coprimos con "n", "p" nos va a dar siempre 1. Esto genera una falla en el algoritmo, ya que es posible que un nmero compuesto de carmichael aparezca como primo. Sin embargo, los nmeros de Carmichael son raros, hay 20138200 antes de 10^21, parecen muchos, pero en realidad significa que la probabilidad de que escogiendo un nmero al azar entre (2;10^21), este sea un nmero de Carmichael, es de 0,00000000000201382%, que es muy poca, aparte de que el "a" que se escoje, tiene que ser coprimo con el nmero de Carmichael. Devuelta, les presento una funcin para aplicar test de Fermat: Cdigo
bool Fermat(long long number, int tries) { srand(time(NULL)); if(number == 2) return true; if(number%2 == 0) return false; for(int r = 0; r < tries; r++) { long long a = ((long long)(rand() / (double) RAND_MAX * (number - 2) + 1))%1000; //Lmite en 1000 para ayudar al cmputo. cout << "a= " << a << endl; bool prime = false; long long firstmp = modpow(number, a, number - 1); cout << firstmp << endl; if(firstmp != 1) prime = false; else prime = true; if(!prime) return false; } return true; } long long modpow(long long modulus, long long base, long long exponent) //Optimized Modpow with binary exponentiation. { long long Output = 1; long long nbase = base; long len = log(exponent) / log(2.0f) + 1; char *binexp = new char[len]; lltoa(exponent, binexp, 2); binexp[len] = 0; for(int i = len - 1; i >= 0; i--) { if(binexp[i] == '1') Output = fmod((Output * nbase),modulus); nbase = fmod((nbase * nbase),modulus); } return Output; }

Fuentes: http://en.wikipedia.org/wiki/Carmichael_number http://en.wikipedia.org/wiki/Fermat_primality_test Bueno, hasta aqu llegue con los algoritmos, se que me falta el Solovay-Strassen(Probabilistico) y el AKS(Deterministico). Pero la verdad es que estn muy por encima de mi nivel y realmente entre la estadstica de hoy y la criptografa, voy a dormir en un colchn de nmeros XD. Si alguien se anima a describirlos de tal manera que todos los demas los podamos entender, por favor,

no duden en hacerlo.

Bueno, aqui termina el Captulo IV, ya la prxima entrega, vamos a comenzar con criptoanlisis, para lo cual la estadstica me va a venir como anillo al dedo (expresin portea que significa que va a servir mucho). Como siempre, las preguntas que tengan, posteenlas en ESTE thread. Nos vemos!! Cualquier error que se llegue a encontrar, por favor comunicarmelo por PM. Un abrazo APOKLIPTICO
Toda la informacin expuesta en este taller, est protegida bajo licencia Creative Commons Attribution-NonCommercial-ShareAlike 2.5.

Captulo V. Este captulo fue escrito mientras se escuchaba: Foo Fighters (In your honor), Funkadelic (Maggot Brain). Hola gente! Como va todo? Bueno, estuve viendo un poco todo lo que es criptoanlisis, bueno es un rea bastaaante extensa, pero vamos a tratar de cubrir lo ms posible. Empecemos entonces! Criptoanlisis. Cita de: Wikipedia. Criptoanlisis (del griego krypts, "escondido" y analein, "desatar") es el estudio de los mtodos para obtener el sentido de una informacin cifrada, sin acceso a la informacin secreta requerida para obtener este sentido normalmente. Tpicamente, esto se traduce en conseguir la clave secreta. En el lenguaje no tcnico, se conoce esta prctica como romper o forzar el cdigo, aunque esta expresin tiene un significado especfico dentro del argot tcnico. "Criptoanlisis" tambin se utiliza para referirse a cualquier intento de sortear la seguridad de otros tipos de algoritmos y protocolos criptogrficos en general, y no solamente el cifrado. Sin embargo, el criptoanlisis suele excluir ataques que no tengan como objetivo primario los puntos dbiles de la criptografa utilizada; por ejemplo, ataques a la seguridad que se basen en el soborno, la coercin fsica, el robo, el keylogging y dems, aunque estos tipos de ataques son un riesgo creciente para la seguridad informtica, y se estn haciendo gradualmente ms efectivos que el criptoanlisis tradicional. En resumen, el criptoanlisis estudia los algoritmos y los ciphertexts con el fin de encontrar posibles maneras de romper los cifrados o al menos de disminuir su complejidad, tambin se incluye el anlisis de ciphertexts para conseguir el algoritmo de cifrado, en caso de que este se desconozca. Hay distintos tipos de ataques, dependiendo en la cantidad de informacin que poseamos sobre el cifrado, es decir, si poseemos el algoritmo, poseemos el mximo de la informacin posible para el criptoanlisis, ya que con este, podemos hacer nuestros propios ciphertexts con claves que nosotros definamos. Sin embargo, hay un nivel mayor de informacin, que sucede cuando poseemos de antemano una vulnerabilidad del algoritmo, por ejemplo, dos ciphertexts idnticos originados en base a claves diferentes y plaintexts iguales, lo que significa que hay una colisin en el algoritmo. Pero antes de empezar a definir los distintos criptoanlisis, vamos a explicar un concepto clave, el de la complejidad.

Cita de: Wikipedia. La teora de la complejidad computacional es la rama de la teora de la computacin que estudia, de manera terica, la complejidad inherente a la resolucin de un problema computable. Los recursos comnmente estudiados son el tiempo (mediante una aproximacin al nmero y tipo de pasos de ejecucin de un algoritmo para resolver un problema) y el espacio (mediante una aproximacin a la cantidad de memoria utilizada para resolver un problema). Se pueden estudiar igualmente otros parmetros, tales como el nmero de procesadores necesarios para resolver el problema en paralelo. La teora de la complejidad difiere de la teora de la computabilidad en que sta se ocupa de la factibilidad de expresar problemas como algoritmos efectivos sin tomar en cuenta los recursos necesarios para ello. Esto quiere decir, la complejidad es una estimacin de los recursos necesarios para determinada tarea. Por ejemplo, la complejidad de un algoritmo de fuerza bruta es exponencial, ya que esta aumenta de dicha manera a medida que aumenta la cantidad de caracteres. Para definir la complejidad, se utiliza la notacin Big "O" "Cota asinttica". La complejidad se puede definir en caso de que existan variables probabilsticas como "Cota superior asinttica", "Cota inferior asinttica" y "Cota ajustada asinttica" las cuales sirven para definir respectivamente los peores y mejores casos, y el promedio de casos de complejidad. Volviendo al ejemplo anterior, la complejidad de un algoritmo de fuerza bruta, es O(C^n) C > 1. Utilizando ahora como ejemplos los algoritmos de test de primalidad vistos en el captulo anterior: Ingenuo sin optimizaciones: O(n). Ingenuo hasta sqrt(n): O(sqrt(n)). Ingenuo probando solo primos hasta sqrt(n): O(sqrt(n) / ln(n)). Miller-Rabin: O(a*log^3(n)). Siendo "a" la cantidad de iteraciones. Fermat: O(log(n)). Solovay-Strassen: O(log(n)). AKS deterministic test: O(log^5(n)). La complejidad de un algoritmo puede ser (en orden de los ms eficientes a los menos eficientes). Constante O(1). Logartmica O(log(n)). Potencia fraccional O(n^c) 0 < c < 1. Lineal O(log(n)). Cuasi-Lineal O(n*log(n)). Cuadrtica O(n^2). Polinmica O(n^c) c > 1. Exponencial O(c^n) c > 1. Factorial O(n!). De esta manera, se pueden evaluar que tan feasibles son las rupturas de determinado algoritmo. Fuentes: http://es.wikipedia.org/wiki/Criptoan%C3%A1lisis http://en.wikipedia.org/wiki/Computational_complexity_theory http://es.wikipedia.org/wiki/Cota_superior_asint%C3%B3tica (Ver tambin artculo en ingls).

Tipos de criptoanlisis. Ciphertext-only attack. En este ataque se posee uno o ms ciphertexts y se desea conseguir el plaintext o la clave de cifrado.

Estos ataques se utilizan cuando no se poseen o no son necesarios los plaintexts para compararlo con el ciphertext. Un caso famoso es el criptoanlisis hecho a la mquina de cifrado "Enigma" utilizada en la segunda guerra mundial. Casos ms recientes, incluyen el ataque al protocolo PPTP de microsoft, que utilizaba RC4 y el de WEP que tambin utiliza el mismo. Como sabemos, el algoritmo de generacin de keystream del RC4 contiene fallas que generan colisiones, con suficiente keystream, se puede conseguir la clave y de esta manera conseguir el plaintext. Tambin cualquier ataque de fuerza bruta, se incluye en esta categora. Known-plaintext attack En este caso, se posee uno o ms ciphertexts y sus correspondientes plaintexts. Estos se pueden analizar con el fin de encontrar la clave de cifrado. Histricamente, el algoritmo Vernam o XOR, es suceptible a este tipo de anlisis, ya que si plaintext XOR clave = ciphertext, al ser XOR una operacin reversible, ciphertext XOR plaintext = clave. Algunas versiones del algoritmo de cifrado de ZIP tambin es suceptible a este tipo de ataques, reduciendo la complejidad del ataque a niveles casi constantes. Chosen-plaintext attack En este tipo de ataques, se posee la capacidad de cifrar cualquier plaintext y obtener los ciphertexts, pero no se posee la clave. Y tiene como fin obtener la misma. Este parece un caso poco realista, pero sin embargo, este ataque va a ser el ms importante para nosotros, ya que si uno posee una clave pblica de un cifrado asimtrico, posee la capacidad de cifrar, pero no de descifrar. Esto es lo que uno va a buscar. Una variante del Chosen-plaintext attack, es el "Adaptive chosen-plaintext attack" en el cual se cifran determinados plaintexts y basado en la informacin obtenida, se contina cifrando. Chosen-ciphertext attack En este caso, se posee la capacidad de elegir el ciphertext que se quiere descifrar y obtener su plaintext, pero sin poseer la clave de descifrado ni de cifrado (en caso de un algoritmo asimtrico). Y se pretende obtener las mismas. ElGamal es un algoritmo que es dbil contra este tipo de ataques y se debe modificar para que sea utilizable en estos contextos sin presentar un riesgo de seguridad. Tambin existe una variante Adaptive de este ataque. En el cual se descifran determinados ciphertexts y basado en la informacin obtenida, se contina descifrando ciphertexts hasta obtener la clave. Related-key Attack En este ataque, se obtienen diversos ciphertexts cifrados con distintas claves, pero que estas claves tienen alguna relacin matemtica, por ejemplo que son acumulativas, son mltiplos entre s o se conoce que una parte de la clave nunca cambia. El criptoanlisis que se hizo con WEP, est basado en este tipo de ataques.

Ejemplos prcticos
Para ms ejemplos prcticos: http://warzone.elhacker.net. Tiene muy buenos desafos.

Ciphertext-only attack Algoritmo: Sustitucin simple. Ciphertext: Citar Jw ahcitosjro jy cr grxaarswgpgxotao ro jyxjtoadjo, cxawazgdo stjucjrxjpjrxj igtg jw gwabao yarxopxauo djw dowot dj ughjzg, dowot djrxgw, dowot pcyucwgt, powjyxagy dj wg pjryxtcguaor,

dowot rjctowofauo dj ugtguxjt wjbj, yardtopj sjhtaw v dowot xtgy uatcfag. Xgphajr yj cyg igtg xtgxgt ucgdtoy arswgpgxotaoy, uopo woy ecj yj itjyjrxgr jr gtxtaxay, gtxtaxay tjcpgxoadj v gtxtaxay foxoyg. Jy cygdo jr ougyaorjy igtg xtgxgt gurj, djhado g ycy itoiajdgdjy grxaarswgpgxotagy, v lg yado jnijrdadg jr Kgior jr sotpg xoiaug igtg gurj dj gdcwxoy. Este es uno de los algoritmos de cifrado ms simples, que constan en reemplazar con un patrn determinado cada letra por otra letra. Por ejemplo, la "A" con una "T", la "D" con una "J", etc. Primero, tenemos que determinar que clase de plaintext estamos tratando de conseguir. En este caso, vamos a asumir que es una oracin en espaol. En un caso real y ms complejo, se puede conseguir la informacin mirando la extensin del archivo, algn encabezado o header o buscando el origen de dicho ciphertext. Para este ciphertext, vamos a utilizar un ataque conocido como "anlisis de frecuencias" que se basa en la premisa de que en un determinado idioma, se utilizan algunas letras ms que otras. En el espaol, estas vienen en este orden: "E A O S R N I D L C T U M P B G V Y Q H F Z J X W K". De la ms frecuente a la menos frecuente. Para esto, podemos utilizar esta herramienta, creada por un Spider-Net usuario de elhacker.net. http://foro.elhacker.net/programacion_vb/source_the_golden_bug_analisis_de_frecuenciat231056.0.html Aunque tambin podemos utilizar cryptool. Analizamos la frecuencia, y vemos que la "G" es la que tiene mayor frecuencia, seguida por J O T A X Y R D W C U P I S H F V B Z E K L N M Q. "M" y "Q" no aparecen en el texto, entonces las ponemos al final. Reemplazamos las primeras 2 letras "JW", y nos queda "AC", parece ser "AL" entonces cambiamos todas las "W" por "L" en vez de "C". Continuamos analizando las palabras ms pequeas, ya que son las ms reconocibles. A medida que vayamos encontrando las sustituciones, vamos a poder ir descifrando cada vez ms el texto. Tengan en cuenta que es posible que sobre todo en textos pequeos, la correlacion de frecuencias no sea exacta. Cuanto ms grande es el texto a descifrar, ms fcil ser hacerlo. Se lo dejo a uds para que practiquen. Fjense si lo pueden descifrar (por favor no posteen las soluciones). Ahora, algo muy importante: Como hago para ensearle a un programa a interpretar cuando ha conseguido el plaintext?. Esto es algo muy importante, ya que uno puede fcilmente ver cuando una imagen, documento, texto o programa est correctamente descifrado, pero como hace un programa? En caso de un texto cifrado, se puede analizar buscando palabras comunes. Si este es una imagen, se pueden buscar patrones que caracterizan a determinada imgenes. Pero sin embargo, uno puede ahorrarse todo esto buscando headers, estos son strings o caracteres que sirven para identificar que un determinado archivo es de determinado tipo. Por ejemplo, los ejecutables comienzan con "MZ" o "PE", los rar dicen "RAR" al inicio del archivo, y as sucesivamente. Otro de los mtodos utilizados para identificar un plaintext, es utilizando la entropa, como ya vimos, la entropa es un anlisis del desorden, los algoritmos de cifrado y compresin buenos, suelen tener una salida de entropa casi mxima, sin importar los datos de entrada. Esto nos puede servir si estamos descifrando un texto, para identificarlo, ya que su entropa va a ser muy baja. Known-plaintext attack

Algoritmo: XOR. Ciphertext: "25 15 1C 0F 09 49 03 01 49 16 1C 0E 50 00 19 05 0E 19 1A 08 0F 4F 11 11 1D 0A 4C 05 11 54 0F 0C 1D 0C 11 0C 02 9F 07 50 11 07 43 1C 04 17 1A 19 05 0D 11 10 49 07 0A 41 05 01 0A 4C 0A 1F 19 19 02 9E 8C 11 43 4B 2F 1B 09 04 3D 0C 00 0D 50 07 0A 4C 0C 06 1B 05 16 0C 08 1F 01 0A 08 06 50 11 07 43 1A 0F 50 0B 0E 1F 1D 11 17 08 07 00 41 00 1D 04 15 0C 13 00 06 43 0B 04 50 0C 98 08 00 17 1B 49 02 0D 08 15 1D 1F 03 49 00 15 1B 02 4F 15 15 02 0A 1F 49 02 11 05 02 0C 08 1F 01 0A 08 06 03 54 0A 0C 01 41 1C 0E 4B 0F 1B 19 04 1D 0C 08 13 11 09 86 0D 47". Est en hexa ya que si lo pongo en ascii, no van a poder ver muchos de los smbolos. Ahora, imagnense que nos revelan la fuente del plaintext por alguna razn. Plaintext: "Desde su uso original para la formacin en seguridad de una compaa, CrypTool ha evolucionado en un destacado proyecto de cdigo abierto para temas relacionados con la criptografa." Entonces, sabemos que el algoritmo XOR, aplica un or exclusivo byte por byte de esta manera: si el plaintext es "computadora" y la clave "1234": computadora 12341234123 El XOR es reversible, osea que si m XOR k = c, entonces, c xor k = m. Pero tambin significa que m XOR c = k. Es decir, que plaintext xor ciphertext = clave. Sabiendo esto, podemos calcular la clave: Vamos a hacer XOR byte a byte hasta que veamos que la clave empieza a repetirse. 25 15 1C 0F 09 49 03 01 49 03 01 49 44 65 73 64 65 20 73 75 20 75 73 6f 61 70 6f 6b 6c 69 70 74 69 63 6f 61 Entonces vemos que la clave es: "apokliptico". Chosen-Plaintext Attack. Realmente no se me pudo ocurrir un ejemplo simple para el Chosen-Plaintext attack, si alguien se le ocurre, por favor avseme y lo posteamos. Mientras tanto, para los que se atreven, un documento sobre el ataque Chosen-Plaintext al que fue vulnerable SSL en una de sus versiones:. Chosen-Ciphertext Attack. ElGamal es uno de los ejemplos ms remarcables de Chosen-Ciphertext Attack. http://es.wikipedia.org/wiki/Cifrado_ElGamal#Maleabilidad Related Key Attack. El ejemplo clsico de este ataque, es el de WEP, este algoritmo utiliza RC4 para generar su keystream, que luego se utilizar para cifrar los datos de la red inalmbrica. Sin embargo, este utiliza vectores de inicializacin, es decir bits utilizados para evitar que si se cifra los mismos plaintext con la misma clave de como resultado el mismo ciphertext, demasiado pequeos, causando colisiones y que estos puedan llevar al crackeo de la clave. Aqu hay una descripcin completa de la vulnerabilidad del cifrado WEP.

http://foro.elhacker.net/hacking_wireless/vulnerabilidades_del_cifrado_wep-t54992.30.html

Bueno, aqui termina el Captulo V, ya la prxima entrega, vamos a continuar con criptoanlisis, utilizando estadstica bsica, como la moda, la media, las frecuencias, etc. Como siempre, las preguntas que tengan, posteenlas en ESTE thread. Nos vemos!! Cualquier error que se llegue a encontrar, por favor comunicarmelo por PM. Un abrazo APOKLIPTICO
Toda la informacin expuesta en este taller, est protegida bajo licencia Creative Commons Attribution-NonCommercial-ShareAlike 2.5. Captulo VI (Final!). Este captulo fue escrito mientras se escuchaba: The Beatles (2009 Remastered discography). Buenas! Hoy les traigo la ltima entrega del taller de Criptografa Asimtrica. La idea es que cuando todos ya estn listos, nos pongamos a crear un algoritmo nuevo. Avisen entonces cuando ya estn, asi podemos ponernos. Esta entrega va a ser distinta de las dems, estuve trabajando en un cdigo que hace diversos testeos en generadores pseudoaleatorios, con el fin de encontrar fallas en los mismos. Para que un PRNG sea seguro para ser usado en criptografa, debe cumplir con las siguientes normas: - Tener perodos largos. - La salida debe tener una distribucin uniforme. - Los espacios entre ciertos valores, no corresponden a los de una distribucin aleatoria. - No debe haber correlacin entre los valores sucesivos de la salida. El programa que cre, prueba todas menos la ltima, que como vamos a ver ms adelante, es una de las ms importantes. NOTA: El programa crea un par de grficos que muestran la distribucin de frecuencias y otro que muestra la distribucin de las diferencias. Para esto, van a necesitar un programa llamado Graph. Lo pueden bajar de aqu. Es freeware, asi que no van a tener problemas. El cdigo est adjuntado al post, es demasiado grande para pegarlo y realmente no confo en rapidshare y similares. El cdigo utiliza el PRNG que utiliza c++, que es el clsico generador lineal congruencial con distintos parmetros segn el compilador. Pero se puede utilizar cualquier prng con solo codearlo en el programa. Como entrada, el cdigo pide un tamao de la muestra, que luego va a ser multiplicado por 256, para que sea posible que haya al menos uno de cada uno de los 256 posibles caracteres. Utiliza memoria dinmica para guardar los valores, es claro que tiene un lmite este nmero, si lo exceden, no va a poder asignarlo y a pesar de que tiene un chequeo, probablemente crashee. Como salida, da algunos datos estadsticos y luego hace unas pruebas aprobadas por el FIPS140-1 para probar aleatoriedad de la muestra. Vamos a verlos uno por uno. Al final de cada medida estadstica puse el valor buscado en un PRNG ideal, debemos acercarnos lo ms posible a este valor. Defino antes de empezar un par de conceptos: Funcin de distribucin: Muestra cuantas veces aparecen cada uno de los valores en un grfico. Funcin de distribucin uniforme: Funcin ideal en la cual todos los valores aparecen la misma cantidad de veces, un PRNG debe aproximarse lo ms posible a dicha distribucin.

Medidas estadsticas Tamao de la muestra (n): 256 * x. Siendo "x" el tamao que el usuario elija. Si esta excede "4000", se toman solo los primeros 4000 * 256 datos. Esto es por el teorema central del lmite que dice que si se toman muestras suficientemente grandes, las medidas estadsticas van a ser idnticas con un mrgen de error despreciable en comparacin con las medidas de la muestra total. Es ms que nada para agilizar los clculos. Mean, Media o promedio (Xm): Media aritmtica estndar. Xm = Sum(xi) / n. Sumatoria de todos los valores dividido la cantidad de valores. Valor buscado = 127,5 (255/2). Mode, Moda o Modo (Mo): Valor modal, es decir el ms repetido de todos. Puede existir ms de uno, pero solo se muestra el primero que se encuentra. Valor buscado = No definida, es decir, que no haya un valor que salga ms que otros. Anti-Mode o Anti-Moda (aMo): Probablemente tenga otro nombre que desconozco, pero representa el valor menos repetido en la muestra. Valor buscado = No definida, es decir, que no haya un valor que salga menos que otros. Standard deviation, desviacin estandar o desviacin tpica(Sx): Es una medida de dispersin que indica que tan distribuidos estn los valores a lo largo de los rangos, en este caso, 0-255. Sx = sqrt(Sum((xi - Xm)^2) / n) = sqrt(Sum(xi^2)/n - Xm^2). Valor buscado = 73.9. Assimetry coefficient o coeficiente de asimetra (As): Determina que tan simtrica es la distribucin, si hay valores que se repiten ms que otros, va a afectar la simetra. Sin embargo, si el/los valores que se repiten, lo hacen de la misma manera que x+Xm mod 256 siendo "x" el valor, entonces no va a afectar la simetra. El lado que cause la asimetra, es decir, que tenga mayor frecuencia, se denomina "sesgo". Si As > 0, entonces el sesgo est hacia la derecha, si As < 0, el sesgo estar hacia la izquierda. Si As = 0, la distribucin ser perfectamente simtrica. As = Sum((xi Xm)^3) / n / Sx^3. Valor buscado = 0, es decir que sea simtrica.

Aqu vemos que el sesgo est hacia la derecha, con un As > 0. Kurtosis o curtosis (Ks): Determina que tan distantes estn distribuidos los valores al rededor de la media. Las distribuciones definidas tericas, como por ejemplo la Normal, la de Gauss, la de Poisson, la uniforme, etc. Tienen una curtosis esperada. Ks = Sum((xi - Xm)^4) / n / Sx^4 - 3.

D: Distribucin de Laplace. Ks = 3. S: Distribucin secante hiperblica. Ks = 2 L: Distribucin logstica. Ks = 1.2 N: Distribucin normal. Ks = 0 C: Distribucin coseno aumentada. Ks = 0.593762. W: Distribucin de Wagner. Ks = -1. U: Distribucin uniforme. Ks = -1.2.

Valor buscado = -1.2, es decir, uniforme. Entropy o entropa (Ep): Busca la uniformidad en la muestra, se centra en la repeticin de cada uno de los caracteres posibles. Ep = Sum(-fr(i) * log2(fr(i))). Donde fr(i) son las frecuencias relativas, es decir, las veces que se repite "i" sobre "n". Valor buscado = 8. Deciles D(x): Un decil representa el valor que acumula el x*10% (siendo 0 < x < 10) de la muestra. Es decir, si tenemos un grfico de una distribucin, dividimos verticalmente el grfico en 10 partes iguales, el valor del eje "x" en donde cae la primera divisin, es el primer decil, el valor del eje "x" en donde cae la segunda divisin, es el segundo decil y as sucesivamente. Para calcular, se deben ir sumando las frecuencias de cada uno de los valores, hasta que la siguiente suma supere n/10*x, llamamos entonces el valor de ese valor "i", a la suma de frecuencias la llamamos F(n-1) y la frmula es: D(x) = i + (x/10 * n - F(n-1)) / f(i). Valor buscado = x * 25.5.

Periodo corto. Uno de los tests necesarios para un PRNG, es probar que no tenga un perodo muy corto. Todos los PRNG tienen un perodo, es decir, un momento en el cual vuelve a empezar la sucesin de dgitos aleatorios. Esto puede ser problemtico para un algoritmo criptogrfico, ya que si se consigue una parte del PRNG, se puede asumir que va a ser exactamente igual una vez que se reinicie el perodo. Sin embargo, los buenos PRNG, tienen perodos muy largos, por ejemplo el Mersenne Twister tiene un perodo de 2^19337 -1, suficiente para cualquier cifrado. Sin embargo, el PRNG que viene por defecto en C++ (linear congruential generator) tiene un perodo de 2^24 es decir = 16777216 o 16 Mbytes. Si uno usase eso como keystream para cifrar un archivo utilizando xor cuyo tamao es mayor a 16 Mbytes, con conseguir parte del plaintext, se podran descifrar otras partes del archivo. Buscando estas fallas, el programa busca en la muestra completa primero por una cuestion de eficiencia si hay dos valores consecutivos iguales a los primeros dos valores de la muestra, si estos coinciden, prueba entonces los siguientes 10 valores (esto es modificable cambiando el define PERIOD_SAMPLE) si estos coinciden, comienza a probar toda la muestra. Si la muestra no es lo suficientemente grande como para tener dos perodos completos, entonces da un mensaje de "repeticin de perodo" probable, si puede completar la prueba, entonces da un mensaje de "repeticin de perodo" conclusivo. Por ltimo muestra el tamao del perodo en potencias de 2. Valor buscado >= 2^32 (4 Gbytes).

Pruebas de aleatoriedad FIPS140-1. Estas pruebas son las estndares creadas por el FIPS, con el fin de determinar si una muestra es lo suficientemente aleatoria. Consiste en cuatro tests: Monobit test (stream y block), poker test, runs test y long run test. Todos estos tests se deben hacer con una muestra de 20000 bits o 2500 bytes. Sin embargo, en el programa utilizo para el monobit test una muestra de 500 bytes aleatoria escojida aleatoriamente, para los dems tests, se utilizan muestras aleatorias de 2500 bytes. Monobit test (stream y block): Consiste en medir cuantos "1" y cuantos "0" hay en una muestra y sacar una razn. El test se puede aplicar tanto con streams, es decir con el total de la muestra, o con bloques de distintos tamaos, en el programa de 8192 a 16 bits y luego se promedian las razones. En definitiva, se trata de ver si hay uniformidad entre 1s y 0s como habra en una muestra realmente aleatoria. Valores buscados [0.966557 ; 1.035840] para todas las razones. Es posible que para los tests

de bloques ms pequeos falle el test, es decir que en alguno de los bloques, no haya ni "1" ni "0", esto significa que hay al menos una sucesion de dos o cuatro "255" o "0" y deben ser ignorados, solo en las distribuciones ms perfectas esto no ocurre. Si ya falla la de 64 bits, va a fallar luego el "long run test". Poker test: Analiza de a nibbles (grupo de 4 bits) como si fuesen manos de poker, buscando fallas en la aleatoriedad. Se busca la frecuencia de cada uno de los nibbles (es decir de 0000 a 1111) y luego se aplica esta frmula: Pt = (16/5000) * SUM(f(i)^2) - 5000. Valor buscado: 1.03 <= Pt <= 57.4. Runs test: Analiza cuantas sucesiones de los mismos bits repetidos, ya sean "0" o "1", hay en una muestra. Se deben contar la cantidad de repeticiones de x bits por separado para los "1" y para los "0". Las repeticiones de ms de 6 bits, se cuentan como si fuesen de 6. Piensen que "1" significa que no se repite ni una vez, es decir que si el bit analizado es "0" el siguiente es "1" y viceversa. Valores buscados: 1 2,267 - 2,733 2 1,079 - 1,421 3 502 - 748 4 223 - 402 5 90 - 223 6+ 90 - 223 Long runs test: Este test es facil y se puede incorporar en el anterior, en definitiva, falla si se encuentra algun bit que se repita ms de 33 veces ya sea 0 o 1. Correlacin entre valores sucesivos. Esto significa que se pueda encontrar una relacin entre cada uno de los valores, que permita, teniendo uno de los valores, calcular el siguiente de manera feasible y en tiempo polinmico o cuasi polinmico. El programa no incluye testeos para buscar correlacin, entonces puede no detectar ciertos PRNG que en teora parecen perfectos, pero en la realidad contienen graves fallas. Prueben por ejemplo modificar el PRNG del programa por lo siguiente: Cdigo
unsigned long long val = 0; unsigned long long rnd() { val++; if(val%255 == 0) val++; if(val%65024 == 0) val++; return val; }

Este "PRNG" tiene un perodo de 2^32 y medidas estadsticas cuasi perfectas. Sin embargo, la sucesin de valores es perfectamente predecible, ya que lo nico que hace es sumarle "1" al valor anterior. Los dos "if" sirven para evitar que tenga perodo corto. El generador lineal congruencial tiene el mismo problema ya que los parmetros que se utilizan para calcular el siguiente valor, estn hardcodeados y varan slo un poco, con conseguir pocos valores, se podra conseguir rpidamente el siguiente valor de la secuencia. Esto sumado a su perodo corto, hacen a ste PRNG como potencialmente inseguro.

Fuentes: http://en.wikipedia.org/wiki/Linear_congruential_generator http://www.csm.ornl.gov/~dunigan/fips140.txt http://en.wikipedia.org/wiki/Mersenne_twister

Este es el fin del captulo VI y el fin de la parte terica del taller de criptografa asimtrica. Posteen todas las dudas que tengan (en el thread del taller) y cuando estn listos, empezamos a crear. Un abrazo APOKLIPTICO
El cdigo bjenlo por ac http://web.i.elhacker.net/archivos/StatisticalAnalysis.rar (Gracias Novlucker!) Toda la informacin expuesta en este taller, est protegida bajo licencia Creative Commons Attribution-NonCommercial-ShareAlike 2.5.

S-ar putea să vă placă și