Criptografia asimetrica

34
 CRIPTOGRAFÍA ASIMETRICA (www.elhacker.net) Capítulo I. Bueno, como prometí, hoy comenzamos con el taller de criptografía asimétrica. Vamos a empezar con las bases y despues iremos ampliando la información. 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 información ya dada. Estas son interpretaciones con el fin de hacer más legible y accesible la información 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 básicas 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 más explícita posible. 3) No utilizar "escritura sms", utilizar signos de puntuación, mayúsculas y espacios y tratar de mantener las faltas de ortografía a un mínimo. 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 inglés "Encrypt" y descifrar de "Decrypt". Voy a comenzar un pequeño glosario de términos 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 después de ser cifrado. - Cifrar: Aplicar un algoritmo matemático que tiene como fin hacer teóricamente imposible la lectura de un mensaje. - Descifrar: Aplicar un algoritmo matemático que tiene como fin volver a hacer legible un mensaje cifrado. - Charset: Conjunto de caracteres que pueden llegar a componer a una clave (Ej: Minúsculas, Mayúsculas, espacios, números, 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 teoría 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" = "También conocido como". Comenzemos entonces: Capítulo I. Este capítulo fue escrito mientras se escuchaba: Die Toten Hosen (Opium Fürs Volk). Qué es la criptografía asimétrica? Cita de: Wikipedia La criptografía (Del g riego, literalmente «escritura oculta») asimétrica es el método criptográfico que usa un par de claves para el envío de mensajes. Las dos claves pertenecen a la misma persona a la que se ha enviado el mensaje. Una clave es pública 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 asimétrico, crea dos claves, una pública con la que solo se debe cifrar los datos, y una privada, que permite descifrar los datos.

Transcript of Criptografia asimetrica

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 1/34

CRIPTOGRAFÍA ASIMETRICA (www.elhacker.net)

Capítulo I.Bueno, como prometí, hoy comenzamos con el taller de criptografía asimétrica.

Vamos a empezar con las bases y despues iremos ampliando la información. La idea es que yo voy aexplicar lo mejor posible todos los conceptos y luego voy a dar links (Algunos ya existentes en el

foro) para ampliar la información ya dada.

Estas son interpretaciones con el fin de hacer más legible y accesible la información 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 básicas 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 más explícita posible.

3) No utilizar "escritura sms", utilizar signos de puntuación, mayúsculas y espacios y tratar demantener las faltas de ortografía a un mínimo.

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 inglés "Encrypt" y descifrar de "Decrypt".

Voy a comenzar un pequeño glosario de términos 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 después de ser cifrado.

- Cifrar: Aplicar un algoritmo matemático que tiene como fin hacer teóricamente imposible la lectura

de un mensaje.

- Descifrar: Aplicar un algoritmo matemático que tiene como fin volver a hacer legible un mensaje

cifrado.

- Charset: Conjunto de caracteres que pueden llegar a componer a una clave (Ej: Minúsculas,

Mayúsculas, espacios, números, 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 teoría 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" = "También conocido como".Comenzemos entonces:

Capítulo I. Este capítulo fue escrito mientras se escuchaba: Die Toten Hosen (Opium Fürs Volk).

Qué es la criptografía asimétrica?

Cita de: Wikipedia

La criptografía (Del griego, literalmente «escritura oculta») asimétrica es el método criptográfico que

usa un par de claves para el envío de mensajes. Las dos claves pertenecen a la misma persona a la que

se ha enviado el mensaje. Una clave es pública 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 asimétrico, crea dos claves, una pública con la que solo se debecifrar los datos, y una privada, que permite descifrar los datos.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 2/34

Cuál es la diferencia entre un algoritmo asimétrico y uno simétrico?Un algoritmo simétrico permite que la misma clave se pueda utilizar para cifrar y para descifrar.

La ventaja del algoritmo simétrico sobre el asimétrico, es que los simétricos suelen ser mucho más

seguros con claves más pequeñas, esto significa, utilizando un ejemplo, que para obtener la seguridad

que tiene un AES 128 bits (Simétrico) se debe utilizar al menos una clave de RSA 1024 bits. Otra de

las ventajas de los algoritmos simétricos es que suelen ser decena de veces más rápidos para computar 

las claves y para cifrar los datos.

Para qué entonces utilizar criptografía asimétrica?Sin embargo, una de las grandes fallas que tienen los algoritmos simétricos sobre los asimétricos, es el

intercambio de claves, esto se explica a continuación con un ejemplo práctico.

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 criptografía para evitar que Eva pueda ver su

comunicación.

Comienzan utilizando criptografía simétrica.

Agustín, le envía a Bernardo la clave que van a utilizar para establecer el canal seguro. Pero Evatambién puede ver esta clave.

Agustín cifra los datos que quiere enviar y Bernardo los recibe, sin embargo, Eva tiene la clave

simétrica y los datos, entonces puede ver la comunicación entre Agustín y Bernardo.

Canal seguro: FAIL!

Entonces, Agustín y Bernardo, deciden utilizar criptografía asimétrica.

Agustín y Bernardo crean cada uno un par de claves Pública y Privada. Vamos a llamarlas E(A), E(B),

D(A) y D(B), siendo E(A) la clave pública de Agustín, E(B) la clave pública de Bernardo, D(A) la

clave privada de Agustín y D(B) la clave privada de Bernardo.

1) Agustín le envía a Bernardo E(A) y Bernardo le envía a Agustín E(B).

2) Agustín 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 Agustín.

3) Agustín descifra con D(A) los datos que recibió de Bernardo y Bernardo descifra con D(B) los

datos que recibió de Agustín.

4) Eva, lo único que puede ver en el canal, son las dos claves públicas y los datos cifrados, entonces,

esta no va a poder ver los datos que Agustín y Bernardo comparten.

Canal seguro: OK!!

Para los que entienden mejor con interpretaciones gráficas, aqui les presento un par:

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 3/34

Bases de la criptografía asimétrica.

Cita de: Wikipedia

Los sistemas de cifrado de clave pública se basan en funciones-trampa de un solo sentido que

aprovechan propiedades particulares, por ejemplo de los números primos. Una función de un solo

sentido es aquella cuya computación es fácil, mientras que su inversión resulta extremadamente

difícil. Por ejemplo, es fácil multiplicar dos números primos juntos para obtener uno compuesto, pero

es difícil factorizar uno compuesto en sus componentes primos. Una función-trampa de un sentido es

algo parecido, pero tiene una "trampa". Esto quiere decir que si se conociera alguna pieza de la

información, sería fácil computar el inverso. Por ejemplo, si tenemos un número compuesto por dos

factores primos y conocemos uno de los factores, es fácil computar el segundo.

Dado un cifrado de clave pública basado en factorización de números primos, la clave públicacontiene un número 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 fácil si poseemos la clave privada que contiene uno de

los factores, pero extremadamente difícil 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/196-

criptografia-y-esquemas-de-clave-publica.html

Cualquier duda que tengan, posteenla en ESTE thread, cuando vea que no hay más preguntas, pongo

el siguiente tema.

Un abrazo

APOKLIPTICO.

Toda la información expuesta en este taller, está protegida bajo licencia Creative Commons

Attribution-NonCommercial-ShareAlike 2.5.

Capítulo II. Este capítulo fue escrito mientras se escuchaba: Pink Floyd (Animals & The Wall).

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 4/34

Algoritmos asimétricos ya existentes.En este capítulo, vamos a explorar los cifrados asimétricos ya existentes, cada uno va a ser explicado

en profundidad, es posible que necesite continuar esta entrega en el capítulo III, ya que en este

momento son las 23.06 pm (GMT -3), no tengo sueño por ahora, pero veremos que tan tarde se hace.

RSA

RSA es un algoritmo de cifrado asimétrico, creado por Ron Rivest, Adi Shamir y Len Adleman, del

Instituto Tecnológico de Massachusetts (MIT) en el año 1977. Como ven, RSA son las siglas de

"Rivest" "Shamir" y "Adleman". Es el primer algoritmo de cifrado asimétrico en la historia y aún es el

más usado. La gran fortaleza que mantiene al RSA entre los algoritmos más seguros, es la

infeasibilidad de descomponer un número grande en producto de primos.

Generación de claves:Cita de: Wikipedia

1. Cada usuario elige dos números primos distintos p y q.

* Por motivos de seguridad, estos números deben escogerse de forma aleatoria y deben tener 

una longitud en bits parecida. Se pueden hallar primos fácilmente mediante test de primalidad.

"Deben escogerse de forma aleatoria" no significa que uno tiene que pensar en un número y ponerlo

apretando teclas en el numpad. Es cierto que el ser humano es una excelente máquina generadora de

aleatoriedad, pero la mejor manera de generar números aleatorios, es utilizando lo que se conoce

como "generadores pseudo-aleatorios", este término es largo de explicar, y por eso incluí un apartado

sobre generadores pseudo-aleatorios al final del capítulo. 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 módulo para ambas claves, pública y privada.

Módulo: En este caso, el módulo se define como el resto de una división.Ej:

100 mod 6 = 4.

100/6 = 16 resto "4".

Cita de: Wikipedia

3. Se calcula φ (n)=(p-1)(q-1), donde φ es la función φ de Euler.

Tranquilos!! Ahora explico la funcion φ de Euler!.

La función φ(n) de Euler (phi), se define como el número de enteros positivos menores o iguales a n

y coprimos con n.

Osea, la cantidad de números menores o iguales a "n" que son coprimos con "n", es decir que no

tienen ningun divisor común 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 fórmula:

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 fórmula y nos queda:

36 * (1-1/2) * (1-1/3) = 36 * 2/3 * 1/2 = 12.

Esto significa, que existen 12 números 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?.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 5/34

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 pública.

* Un exponente e muy pequeño (p. ej. e = 3) podría suponer un riesgo para la seguridad.

Volviendo al ejemplo anterior, un número entero positivo "e" menor que φ(n), que sea coprimo con

φ(n) podría ser: 5, 7 ú 11.

 No tienen por qué ser primos, con un "n" más grande, obtendríamos "e" que no fuesen primos.

Cita de: Wikipedia

5. Se determina un d (mediante aritmética 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 algebráicos y de matrices que realmente no tiene ningun sentido ponerse a

explicar y en caso de que hiciese falta aplicarlo en algún código, 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 público).

5) d = 2753

Recordemos que 17*2753 - 1 = 46800. Y que 46800 / 3120 = 15 (es exacta).

La clave pública está compuesta por "e" y por "n", osea el exponente público y el módulo.

La clave privada está compuesta por "d" y por "n", osea el exponente privado y el módulo.

Cifrando:Primero, se divide el mensaje en bloques, de tal manera, que esos bloques, se puedan representar en

números menores a "n". Ejemplo:

Tengo el plaintext "APOKLIPTICO".

Yo se que si lo quisiese expresar en números, estos serían 65, 80, 79, 75, 76, 73, 80, 84, 73, 68 y 79

(en la tabla ASCII). Obviamente este es un método ineficiente de dividir el mensaje, pero para la base

teórica sirve.

Entonces, para cifrar:

m^e mod n = c.

Siendo: "m" el bloque del plaintext, "e" el exponente público, "n" el módulo 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 fórmula:

65^17 mod 3233 = 2790.

80^17 mod 3233 = 2933.

[...]

68^17 mod 3233 = 1759.79^17 mod 3233 = 1370.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 6/34

Descifrando:Se obtienen los paquetes cifrados y se les aplica esta fórmula:

c^d mod n = m.

Siendo: "c" el bloque del ciphertext, "d" el exponente privado, "n" el módulo y "m" es el bloque

original del plaintext.

Comprobémoslo 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 preguntarán como hago para elevar 2790 a la 2753ava potencia. La respuesta es

muy simple:

 No hace falta hacerlo.

Se utiliza un método llamado "exponenciación modular" que en definitiva, es aplicar el módulo 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 pequeño loop en un programa se puede hacer rápidamente.

Código

function modular_pow(base, exponent, modulus)  c := 1  for e_prime = 1 to exponentc := (c * base) mod modulus  return c 

Eso es en pseudocódigo para los entendidos.

Fuentes y lecturas recomendadas:http://es.wikipedia.org/wiki/RSAhttp://foro.elhacker.net/criptografia/rsa_para_no_iniciados-t67109.0.htmlhttp://es.wikipedia.org/wiki/N%C3%BAmeros_primos_entre_s%C3%ADhttp://es.wikipedia.org/wiki/Algoritmo_de_Euclides#Algoritmo_de_Euclides_extendido

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

ElGamal

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 7/34

Elgamal, es un cifrado asimétrico 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.

Generación de claves.Se elige "p" que va a ser un número primo grande.

Se elige "g" que es un generador del grupo multiplicativo Gp, esto es un número que elevado a

sucesivas potencias modulo "p", va a dar todos los números del conjunto exáctamente una vez, este

conjunto, está formado por todos los números que son coprimos con "p", como "p" es primo, ese

conjunto contendrá todos los números 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 = 122^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

darán devuelta la misma seguidilla de números.

Se elige "k" tal que 2 <= k <= (p -2).

La clave pública será entonces compuesta por p, a y (a^k mod p).

La clave privada será entonces "k".

CifradoSe recibe la clave pública 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 código, yo hice una en c++, es muy

ineficiente y hay algoritmos de aproximacion ya existentes que lo hacen más facil, este lo pueden

encontrar en el apéndice "B".

Elegimos "k" = 113 tal que 2 <= k <= (p-2).

Definimos entonces:

Clave pública = p, a y a^k mod p = 541; 2; 454.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 8/34

Clave privada = 113.

Plaintext = hola. Lo dividimos por caracter según 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 sería: 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 exponenciación 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 sobrecriptoanálisis, zero-knowledge y escrow method).http://es.wikipedia.org/wiki/Cifrado_ElGamal (Bastante complicado de entender, conocimientosde Álgebra de grupos)

Apéndice A: Generadores de números Pseudo-aleatorios. A.K.A. PRNG (Pseudo-RandomNumber Generator).

Un generador pseudo-aleatorio, es una fórmula matemática que basado en un número base, llamado

"semilla" o "seed", da como salida números que tratan de asemejar aleatoriedad. Por qué digo"Asemejar"? Ninguna fórmula matemática puede por si sola generar una secuencia de números

realmente aleatorios, ya que en las matemáticas, hay una serie de causa-consecuencia que lleva a un

resultado final, que siempre va a ser el mismo. Para ponerlo en términos más simples 2 + 2 va a ser 

siempre 4.

Los PRNG más famosos son el Blum Blum Shub, el Fortuna y el Mersenne Twister. Los PRNG, están

 presentes en gran parte de los algoritmos, ya sea como parte del cifrado en si o en la generación de

claves, lo que hace que sean importantísimos para la seguridad del algoritmo, para ser seguros, deben

cumplir con estas características:

a) Dar una salida que incluya todo el rango de números que se le pide de manera distribuida,

maximizando la entropía, osea, tratando de que haya igual cantidad de cada número.

 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 número "n", la salida de dicho PRNG será siempre la misma hasta que se cambie dicho

número. Entonces, si uno tiene como semilla al crear una clave criptográfica algo demasiado simple,

otra persona podría usar esa semilla para producir sus propias claves, haciendo inútil el cifrado de

datos.

Apéndice B: Pequeño código para comprobar si "g" es generador de grupo multiplicativo finito"Gp".Código

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 9/34

#include <iostream>#include <math.h>#define GENERATOR 2#define MODULUS 19using 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 había dicho antes, la exponenciación modular.

Bueno, por una cuestión de que ya tienen suficiente con estos algoritmos, el algoritmoDSA, será puesto en la siguiente entrega.Cuando vea que ya no hay más preguntas, pondré el siguiente Capítulo.Cualquier error que se llegue a encontrar, por favor comunicarmelo por PM.Un abrazoAPOKLIPTICO

Toda la información expuesta en este taller, está protegida bajo licencia Creative CommonsAttribution-NonCommercial-ShareAlike 2.5.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 10/34

Capítulo III. Este capítulo 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 capítulo anterior, faltaba describir DSA, luego vamos a

hacer un pequeño vistazo sobre hashes y algoritmos de cifrado simétricos, no tanto en profundidad

como los asimétricos, pero suficiente como para que puedan entender la siguiente entrega (Public KeyInfraestructure, Certificados y sistemas de autenticación).

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 español Algoritmo de Firma digital) es un estándar del

Gobierno Federal de los Estados Unidos de América o FIPS para firmas digitales. Fue un Algoritmo

 propuesto por el Instituto Nacional de Normas y Tecnología de los Estados Unidos para su uso en suEstándar de Firma Digital(DSS), especificado en el FIPS 186. DSA se hizo público el 30 de agosto de

1991, este algoritmo como su nombre lo indica, sirve para firmar y no para cifrar información. Una

desventaja de este algoritmo es que requiere mucho más tiempo de cómputo 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.

Generación de claves:1) Se elige un algoritmo de Hash estándar, generalmente se suele usar SHA-1 o SHA-256, para más

seguridad.

2) Se elige la longitud de la clave en bits, utilizando dos valores "L" y "N", siendo "L" un múltiplo de

64, generalmente por una cuestión de seguridad de más de 1024 bits, y "N" la longitud de la salida del

Hash.

3) Se elige un número primo "q" de como máximo "N" bits de longitud.

4) Se elige un número primo "p" de como máximo "L" bits de longitud, que se utilizará como módulo.

(p-1) debe ser múltiplo de "q".

5) Se calcula "g" de esta manera: g = h^((p-1) /q) mod p, siendo "h" un número arbitrario entre [2, p-

1). Si esta fórmula 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 demás usuarios del sistema, estos serán los parámetros que les

 permitirán a los demás usuarios calcular sus propias claves autenticadas:

1) Se elige "x" por un método suficientemente aleatorio tal que 0 < x < q.

2) Se calcula y = g^x mod p.

La clave pública será (p, q, g, y). La privada es "x".

Recordemos que la exponenciación modular es calculable utilizando la fórmula ya expuesta, y que no

es necesario calcular primero la exponenciación y luego el módulo.

Firmando.

1) Ya se conoce la función hash utilizada "H".2) Se genera un número aleatorio "k" creado para el mensaje tal que 0 < k < q. Se descarta este "k"

una vez utilizado.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 11/34

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 función 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á inválida 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.

Aclaración: 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 pública se utiliza para

comprobar la firma. Los parámetros

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 práctico para el

ejemplo.

3) Elijo un número primo "q" de hasta 8 bits. q = 97.

4) Elijo un número primo "p" de hasta 64 bits, que se utilizará como módulo tal que (p-1) es múltiplo

de "q". p = 389. 388 = 97 * 4.

5) g = 2^((389-1)/97) mod 389 = 16.

Tenemos entonces los parámetros (389, 97, 16).

Ahora calculamos las claves:

1) Elegimos "x" = 25.2) Calculamos y = 16^25 mod 389 = 142.

Clave pública = (389, 97, 16, 142).

Clave privada = 25.

Firmamos un mensaje:

1) Tenemos la función de hash ficticia con una salida de 8 bits. Supongamos que H(m) = 75.

2) Se genera un número 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).

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 12/34

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: WikipediaEn informática, hash se refiere a una función o método para generar claves o llaves que representen

de manera casi unívoca a un documento, registro, archivo, etc., resumir o identificar un dato a través

de la probabilidad, utilizando una función hash o algoritmo hash. Un hash es el resultado de dicha

función o algoritmo.

Una función de hash es una función para resumir o identificar probabilísticamente un gran conjunto

de información, dando como resultado un conjunto imagen finito generalmente menor (un

subconjunto de los números naturales por ejemplo).

 No se dejen confundir con la palabra "claves", esta no tiene nada que ver con las claves que se utilizan

en criptografía para cifrar o descifrar datos. Probablemente la definición de wikipedia sea un pococonfusa al principio, asi que vamos a hecharle un poco de claridad:

Tenemos un texto, documento o cualquier información, la llamaremos "m".

Tenemos también una función de hash o resumen, la llamaremos H().

Entonces:

Cuando se aplica H(m), se realizan un conjunto de operaciones matemáticas, que dan como resultado

un resumen del mensaje original, que en un algoritmo real y seguro, debe tener las siguientes

características:

- 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 más uniforme posible, es decir se debe utilizar 

todo el rango de salida de manera pareja y maximizando la entropía.

- Irreversible. Si se calcula H(m) = x, resultará infeasible calcular "m" teniendo "x". Esto se puede

lograr utilizando funciones "trampa" como el módulo y los operadores binarios "AND" "OR" y

"NOT".

- No relación entre tamaños de salida/entrada. Esto singifica que el tamaño de la salida no debe ser 

afectado por el tamaño de la entrada, ya sea que la entrada es muy pequeña, o muy grande, el tamaño

de salida no debe de estar conectado con el de entrada.- Tamaño máximo de salida fijo. Esto significa que cada algoritmo debe ajustarse a un tamaño de

salida estandarizado, los valores no pueden superar este tamaño máximo. Por ejemplo, en MD5, el

tamaño máximo es 128 bits.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 13/34

- Eficiente. Se busca que el algoritmo de hash consuma la menor cantidad de recursos, sin perder 

seguridad.

Algoritmos de Hash más conocidos:GOST 256 bits

HAS-160 160 bitsHAVAL 128 to 256 bits

MD2 128 bits

MD4 128 bits

MD5 128 bits

RadioGatún 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 bitsSHA-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 colisión de Hash, es cuando la salida de un algoritmo de hash, es idéntica para dos mensajes

diferentes, es decir:

H(m1) = x

H(m2) = y

x = y.

m1 <> m2.

Probabilísticamente hablando, es imposible crear una función de hash que tenga una salida diferente

 para cada mensaje, ya que el tamaño del valor de entrada puede ser [0, inf) y la salida, puede ser [0,

Hmax] siendo Hmax el tamaño máximo de salida de un Hash. Sin embargo, se considerageneralmente 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 correlación

aparente con la entrada.

Calcular con fuerza bruta una colisión de hash, requiere muchísimos recursos, se ha logrado

únicamente utilizando redes de cómputo.

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, aún así, si quisiese calcular el espectro entero de md5, tardaría aproximadamente

11358 trillones de años 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,

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 14/34

el algoritmo de hashing md5, fue quebrado por Tao Xie y Dengguo Feng de tal manera que se puede

calcular una colision en una fracción 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 versión en español no es muy buena).http://es.wikipedia.org/wiki/Colisi%C3%B3n_%28hash%29http://en.wikipedia.org/wiki/MD5

Criptografía Simétrica

Cita de: Wikipedia

La criptografía simétrica es un método criptográfico en el cual se usa una misma clave para cifrar ydescifrar 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 usándola, lo

envía al destinatario, y éste lo descifra con la misma.

Como ya vimos en otras entregas, generalmente se suele utilizar la criptografía simétrica conjunta con

la asimétrica, ya que la asimétrica provee un canal seguro para compartir la clave, pero no posee la

eficiencia y velocidad de un algoritmo simétrico.

Ejemplos de algoritmos simétricos muy usados son:Twofish 128, 192 o 256 bits.

Serpent 128, 192 o 256 bits

AES (Rijndael) 128, 192 o 256 bits

Blowfish 8–448 bits en múltiplos de 8 bits.

CAST5 40-128 bits.

RC4 40–2048 bits

TDES 168, 112 o 56 bits

IDEA 128 bits

Por qué utilizar criptografía simétrica?- Mayor velocidad.

Si analizamos un cifrado asimétrico muy común como RSA con uno simétrico como AES, veremosque AES utiliza pocas operaciones y estas operaciones son generalmente lineales, es decir, se

computan rápidamente. Las claves generadas para AES, se generan pseudoaleatoriamente y no deben

tener ninguna característica especial.

Sin embargo, RSA utiliza bastantes operaciones que requieren exponenciación modular, que con

exponentes grandes, necesitará miles de veces la cantidad de ciclos que se utilizan para una operación

de AES. Por otro lado, la generación de claves para RSA requiere test de primalidad que requieren

mucha capacidad de cómputo y esta aumenta de manera no lineal con el tamaño de las claves, es

decir, calcular una clave de 2048 bits va a tardar mucho más que el doble que una de 1024 bits.

- Mayor seguridad con claves más pequeñas.

Debido a que se reducen las posibles claves con RSA debido a que los valores generadores sonnúmeros primos, este requiere que sean mucho más grandes que si fuese una clave simétrica, que

 puede ser cualquier número.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 15/34

Una clave de 1024 bits de un algoritmo asimétrico, da la misma seguridad que una clave de

aproximadamente 80 bits de un algoritmo simétrico, una de 2048 bits asimétrica da la misma

seguridad que una de 112 bits simétrica y una de 3072 bits es equivalente a una de 128 bits. Esto varía

dependiendo de los cifrados involucrados.

Por otro lado, una clave de 256 bits simétrica, solo se iguala con una clave de 15360 bits asimétricos.

Calcular una clave de tal tamaño, puede tardar muchisimo tiempo computacional.

- Poseen un riesgo mucho menor de ser rotos por la computación cuántica.

En este momento se están haciendo investigaciones sobre la siguiente era de la información, la

computación cuántica, gracias al algoritmo de Shor, se podría factorizar una multiplicación de dos

 primos utilizando una de estas computadoras feasiblemente, dando por concluida la era de los

algoritmos asimétricos actuales. En otras palabras, se tardaría el mismo tiempo en utlizar una clave

asimétrica en una computadora normal, que crackearla en una computadora cuántica equivalente. Los

algoritmos simétricos, reducirían su complejidad de crackeo a la mitad gracias a la computación

cuántica, es decir que una clave de 128 bits, equivaldría a una de 64 bits en seguridad. Sin embargo,

esto se puede solucionar duplicando el tamaño de las claves, a expensas de un tiempo de cómputo

ligeramente mayor.

Esto quiere decir: Si van a guardar información cifrada por mucho tiempo, utilizen un algoritmosimétrico 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%A9tricahttp://en.wikipedia.org/wiki/Key_size

Apéndice A: Entropía.Cita de: Wikipedia

Entropía es un concepto en termodinámica, mecánica estadística y teoría de la información. La

entropía se concibe como una "medida del desorden" o la "peculiaridad de ciertas combinaciones".

Como la entropía puede ser considerada una medida de la incertidumbre, y la información tiene que

ver con cualquier proceso que permite acotar, reducir o eliminar la incertidumbre; resulta que el

concepto de información y el de entropía están ampliamente relacionados entre sí, aunque se

necesitaron años de desarrollo de la mecánica estadística y de la teoría de la información antes de que

esto deviniera aparente.

Vamos a explicarlo con un ejemplo práctico:Tenemos un archivo, este archivo, puede contener cualquiera de los caracteres en el código ascii, cada

uno representado por un número 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 tamaño del archivo en bytes. Por ejemplo: "0" = 0.025, "1" = 0.050, etc.

Una vez que hicimos todos esos cálculos, calculamos la entropía 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 número entre 0 y 8. Este número, representa la entropía del archivo, siendo "0" sin

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 16/34

entropía y "8" con entropía máxima, es decir que existe la misma cantidad de los 256 caracteres.

Los buenos algoritmos de compresión y de cifrado, dan como salida una entropía cercana a 8, sin

importar la entropía de la entrada.

Este es el primer criterio que se utiliza para el criptoanálisis de un algoritmo, ya que si su entropía 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 código 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 criptográficos como PKI, Certificados ysistemas de autenticación, vayan leyendo, posteen sus preguntas y como siempre en ESTE thread, cuando no haya más preguntas, posteo la siguiente entrega.

Un abrazoAPOKLIPTICO

Toda la información expuesta en este taller, está protegida bajo licencia Creative Commons

Attribution-NonCommercial-ShareAlike 2.5.

Capítulo IV. Este capítulo 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 intención deconocer en profundidad las PKI (Public Key Infraestructure), en la que está incluido los certificados y

los sistemas de autenticación. También, a pedido de la gente, va a haber un apéndice con los test de

 primalidad más usados.

Let us begin then:

PKI (Public Key Infraestructure).Cita de: Wikipedia.

En criptografía, una infraestructura de clave publica (o, en inglés, PKI, Public Key Infrastructure) es

una combinación de hardware y software, políticas y procedimientos de seguridad que permiten la

ejecución con garantías de operaciones criptográficas como el cifrado, la firma digital o el no repudio

de transacciones electrónicas.

En definitiva, las PKI son las únicas formas de realmente reducir al mínimo los riesgos de seguridad

debido a canales inseguros de comunicación. Ya que se crean certificados que luego servirán para

firmar las claves publicas de cifrados asimétricos, que a su vez se utilizarán para cifrar claves

simétricas 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 Certificación): Encargada de firmar las clavescriptográficas, 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.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 17/34

- Certificados digitales: Son en definitiva claves públicas firmadas digitalmente, utilizadas para

generar canales seguros. Para una explicación más profunda, ver el apartado "Certificados Digitales".

- Computadoras y servidores: Estos son los que gozarán de los beneficios de las PKI, ya sea firmando

sus claves gracias al CA, verificando que una clave pública venga de donde tiene que venir y no haya

sido modificada o autentificandose utilizando claves firmadas.

- VA(Verification Authority o Autoridad de Verificación), 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 autenticación son dados a todos los que lo soliciten, para verificar que las claves sean

válidas. Estas son también las encargadas de verificar cuales son los certificados digitales que han

expirado o han sido revocados.

- RA (Registration Authorities o Autoridad de Registración): 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 firmelas claves. Es decir, si una persona quiere firmar una clave, debe ir a la RA, hacer todos los trámites

necesarios, y luego el CA recibe la clave, la firma y la reenvía al RA, que luego se la suministrará a la

 persona original.

Pongamos un ejemplo para verlo más 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 simétrico 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 envía su clave pública 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 verificación, este lo verifica como válido.

5) El cliente crea una clave aleatoria simétrica para el cifrado AES-256 bits y se la envía 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_infrastructurehttp://en.wikipedia.org/wiki/Transport_Layer_Security- Cryptography for Dummies by Chey Cobb. (No puedo poner el link ya que está bajoCopyright, pero entre nos, google es su amigo). Parecerá medio estúpido por el nombre, pero esun libro muy didáctico y explicativo. Lo recomiendo.

Certificados digitales.Cita de: Wikipedia.

Un certificado digital es un documento digital mediante el cual un tercero confiable (una autoridad decertificación) garantiza la vinculación entre la identidad de un sujeto o entidad y su clave pública.

El certificado contiene usualmente el nombre de la entidad certificada, número de serie, fecha de

expiración, una copia de la clave pública del titular del certificado (utilizada para la verificación de su

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 18/34

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 asociación.

Recuerdan cuando vimos que la criptografía asimétrica 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 técnica que se utiliza para capturar y/o modificar información que transita

una red de computadoras. Se basa en, utlizando diversas técnicas (Arp poisoning, redes switcheadas,

captura de paquetes wi fi, etc), situarse entre dos o más 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 criptografía asimétrica, un atacante "Eve" (de Eavesdropper = Escuchar 

secretamente), podría modificar las claves públicas que se transmiten entre Alice y Bob, con unas

creadas por él mismo, permitiendo de esta manera descifrar cualquier paquete que transite el canalsupuestamente seguro.

Para evitar esto, se crearon los Certificados digitales, que permiten que las claves públicas 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 Certificación". 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 tamaños 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 pública 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 públicarespectivamente.

El certificado, será un archivo con extensión .crt.

Si quieren, pueden analizar un certificado conectándose a una página de manera segura y

descargándolo.

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 pública o certificado CA (que será utilizado para verificar las firmas). La clave privada debe ser guardada, ya que cualquiera en posesión de esta clave, podría generar claves firmadas, que luego

 podrían ser utilizadas para ataques MITM. La clave pública o certificado CA, debe ser distribuido a

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 19/34

todas las personas que vayan a recibir claves públicas firmadas por nuestro CA, para que puedan

verificarlas.

Luego, generaremos nuestro par de claves publica y privada y firmaremos la clave pública utilizando

nuestra clave privada del CA.

Ahora tenemos nuestro par de claves para ser utilizadas en cualquier conexión segura (HTTPS, FTPS,

etc.).

Obviamente es mucho más 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%BAblicahttp://en.wikipedia.org/wiki/Transport_Layer_Securityhttp://www.openssl.org/http://es.wikipedia.org/wiki/Certificado_digitalhttp://www.akadia.com/services/ssh_test_certificate.html

Apéndice A: Tests de Primalidad.Los tests de primalidad tienen el fin de probar con certeza si un número natural es primo, es decir que

solo es divisible por si mismo y por 1. Estos números son muy importantes para los algoritmos

asimétricos como ya hemos visto. Existen dos tipos de test de primalidad: los determinísticos y los

 probabilísticos. Los primeros, determinan con un 100% de seguridad, que el número es primo. Los

segundos, determinan con un porcentaje menor al 100% de probabilidad, cuanto más tiempo se los

deja funcionar, menor va a ser la probabilidad de que un número no sea primo.

1) Test simple o test ingenuo. (Deterministico).Este es el más conocido de todos los tests, y se trata simplemente de probar dividiendo todos los

números naturales entre 2 y n-1 siendo "n-1" el supuesto número primo.

Este test es el menos eficiente de todos, es decir el que más tiempo toma, sin embargo, se le puede

hacer optimizaciones para mejorar su eficiencia:

a) Probar sólo 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 números múltiplos de 2 excepto 2.

Esto es debido a que si un número es divisible por un múltiplo de dos, será divisible por 2 también.

c) Se puede optimizar aún más si se observa que todos los primos excepto por 2 y 3 pueden ser formados con la fórmula 6*k +/- 1 siendo "k" un número natural (esto no significa que todos los

números 6*k +/- 1 sean primos. Ej:k=4 6*4+1 = 25) . Esto acelera al menos 3 veces el test de

 primalidad.

d) También se pueden ir guardando todos los números primos que se vayan encontrando, de esta

manera se puede acelerar aún más la prueba, pero esto requiere mucha memoria para guardar los

mismo.

Les dejo un código en C++ que incluye las optimizaciones a, b y c y su diferencia en velocidad.

Código

#include <ctime>

#include <stdlib.h>#include <iostream>#include <math.h>using namespace std;

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 20/34

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)  {

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 21/34

  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 número primo de 49 bits tardó:

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 22/34

Sin optimizaciones: Demasiado.

Con 1 Optimización: 1.64 Segundos.

Con 2 Optimizaciones: 2.016 Segundos. Curioso que este tarda más 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 (Probabilístico).El test original creado por Miller que es determinístico, está basado en la hipótesis de Riemann, que

aún no ha sido probada, es por esto, que Rabin lo modificó para convertirlo en probabilístico. No voy

a tratar la parte matemática del algoritmo, ya que es extremadamente compleja y realmente no está a

mi nivel y supongo que tampoco lo estará para la mayoría de uds.

El algoritmo es el siguiente:

1) Elegimos un número "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 número 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 número 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 número primo.

6) Cuantos más "a" se prueben, mayor será la probabilidad de que "n" sea primo.

La probabilidad de que un número 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 permitiría aplicar el Miller-Rabin para probar primalidad. Es posible que

me haya equivocado en el código y no toma valores demasiado altos, probablemente debido a un error 

de overflow en el módulo. Si alguien quiere optimizarlo, mejor aún!

 NOTA: Modifiqué la función modpow para optimizarla con el algoritmo de la exponenciación

 binaria. Ahora es muchisimo más rápido.

Código

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; //Límite en 1000 para ayudar al cómputo y evitar overflows.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 23/34

  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.htmlhttp://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test

3) Test de Fermat. (Probabilistico)

1) Se elige un número 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 número 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 Miller-

Rabin.Sin embargo, existe una excepció para esto:

Los números de Carmichael (y no estoy hablando de la identidad secreta de "Chuck"), son números

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 24/34

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 número compuesto de carmichael

aparezca como primo. Sin embargo, los números de Carmichael son raros, hay 20138200 antes de

10^21, parecen muchos, pero en realidad significa que la probabilidad de que escogiendo un número

al azar entre (2;10^21), este sea un número de Carmichael, es de 0,00000000000201382%, que es

muy poca, aparte de que el "a" que se escoje, tiene que ser coprimo con el número de Carmichael.

Devuelta, les presento una función para aplicar test de Fermat:

Código

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; //Límite en 1000 para ayudar al cómputo.  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_numberhttp://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 están muy por encima de mi nivel y realmente entre la

estadística de hoy y la criptografía, voy a dormir en un colchón de números XD.

Si alguien se anima a describirlos de tal manera que todos los demas los podamos entender, por favor,

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 25/34

no duden en hacerlo.

Bueno, aqui termina el Capítulo IV, ya la próxima entrega, vamos a comenzar concriptoanálisis, para lo cual la estadística me va a venir como anillo al dedo (expresión

porteña 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 abrazoAPOKLIPTICO

Toda la información expuesta en este taller, está protegida bajo licencia Creative Commons

Attribution-NonCommercial-ShareAlike 2.5.

Capítulo V. Este capítulo 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 criptoanálisis, bueno es un área bastaaante extensa, pero

vamos a tratar de cubrir lo más posible. Empecemos entonces!

Criptoanálisis.Cita de: Wikipedia.

Criptoanálisis (del griego kryptós, "escondido" y analýein, "desatar") es el estudio de los métodos

 para obtener el sentido de una información cifrada, sin acceso a la información secreta requerida para

obtener este sentido normalmente. Típicamente, esto se traduce en conseguir la clave secreta. En ellenguaje no técnico, se conoce esta práctica como romper o forzar el código, aunque esta expresión

tiene un significado específico dentro del argot técnico.

"Criptoanálisis" también se utiliza para referirse a cualquier intento de sortear la seguridad de otros

tipos de algoritmos y protocolos criptográficos en general, y no solamente el cifrado. Sin embargo, el

criptoanálisis suele excluir ataques que no tengan como objetivo primario los puntos débiles de la

criptografía utilizada; por ejemplo, ataques a la seguridad que se basen en el soborno, la coerción

física, el robo, el keylogging y demás, aunque estos tipos de ataques son un riesgo creciente para la

seguridad informática, y se están haciendo gradualmente más efectivos que el criptoanálisis

tradicional.

En resumen, el criptoanálisis estudia los algoritmos y los ciphertexts con el fin de encontrar posibles

maneras de romper los cifrados o al menos de disminuir su complejidad, también se incluye el análisis

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 información que poseamos sobre el

cifrado, es decir, si poseemos el algoritmo, poseemos el máximo de la información posible para el

criptoanálisis, ya que con este, podemos hacer nuestros propios ciphertexts con claves que nosotros

definamos. Sin embargo, hay un nivel mayor de información, que sucede cuando poseemos de

antemano una vulnerabilidad del algoritmo, por ejemplo, dos ciphertexts idénticos originados en base

a claves diferentes y plaintexts iguales, lo que significa que hay una colisión en el algoritmo.

Pero antes de empezar a definir los distintos criptoanálisis, vamos a explicar un concepto clave, el de

la complejidad.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 26/34

Cita de: Wikipedia.

La teoría de la complejidad computacional es la rama de la teoría de la computación que estudia, de

manera teórica, la complejidad inherente a la resolución de un problema computable. Los recursos

comúnmente estudiados son el tiempo (mediante una aproximación al número y tipo de pasos de

ejecución de un algoritmo para resolver un problema) y el espacio (mediante una aproximación a la

cantidad de memoria utilizada para resolver un problema). Se pueden estudiar igualmente otros

 parámetros, tales como el número de procesadores necesarios para resolver el problema en paralelo.La teoría de la complejidad difiere de la teoría 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 estimación 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 notación Big "O" ó "Cota asintótica". La complejidad se

 puede definir en caso de que existan variables probabilísticas como "Cota superior asintótica", "Cota

inferior asintótica" y "Cota ajustada asintótica" 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 capítulo 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 más eficientes a los menos eficientes).

Constante O(1).

Logarítmica O(log(n)).

Potencia fraccional O(n^c) 0 < c < 1.

Lineal O(log(n)).

Cuasi-Lineal O(n*log(n)).

Cuadrática O(n^2).

Polinómica 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%A1lisishttp://en.wikipedia.org/wiki/Computational_complexity_theoryhttp://es.wikipedia.org/wiki/Cota_superior_asint%C3%B3tica (Ver también artículo en inglés).

Tipos de criptoanálisis.Ciphertext-only attack.En este ataque se posee uno o más ciphertexts y se desea conseguir el plaintext o la clave de cifrado.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 27/34

Estos ataques se utilizan cuando no se poseen o no son necesarios los plaintexts para compararlo con

el ciphertext. Un caso famoso es el criptoanálisis hecho a la máquina de cifrado "Enigma" utilizada en

la segunda guerra mundial. Casos más recientes, incluyen el ataque al protocolo PPTP de microsoft,

que utilizaba RC4 y el de WEP que también utiliza el mismo. Como sabemos, el algoritmo de

generación de keystream del RC4 contiene fallas que generan colisiones, con suficiente keystream, se

 puede conseguir la clave y de esta manera conseguir el plaintext.

También cualquier ataque de fuerza bruta, se incluye en esta categoría.

Known-plaintext attack En este caso, se posee uno o más ciphertexts y sus correspondientes plaintexts. Estos se pueden

analizar con el fin de encontrar la clave de cifrado.

Históricamente, el algoritmo Vernam o XOR, es suceptible a este tipo de análisis, ya que si plaintext

XOR clave = ciphertext, al ser XOR una operación reversible, ciphertext XOR plaintext = clave.

Algunas versiones del algoritmo de cifrado de ZIP también 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 más importante para nosotros, ya que si uno posee una clave

 pública de un cifrado asimétrico, 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 información obtenida, se continúa 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 asimétrico). Y

se pretende obtener las mismas.

ElGamal es un algoritmo que es débil contra este tipo de ataques y se debe modificar para que sea

utilizable en estos contextos sin presentar un riesgo de seguridad.

También existe una variante Adaptive de este ataque. En el cual se descifran determinados ciphertexts

y basado en la información obtenida, se continúa 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 relación matemática, por ejemplo que son acumulativas, son múltiplos entre sí o se

conoce que una parte de la clave nunca cambia.

El criptoanálisis que se hizo con WEP, está basado en este tipo de ataques.

Ejemplos prácticosPara más ejemplos prácticos: http://warzone.elhacker.net . Tiene muy buenos desafíos.

Ciphertext-only attack 

Algoritmo: Sustitución simple.

Ciphertext:

Citar Jw ahcitosjro jy cr grxaarswgpgxotao ro jyxjtoadjo, cxawazgdo stjucjrxjpjrxj igtg jw gwabao

yarxopáxauo djw dowot dj ughjzg, dowot djrxgw, dowot pcyucwgt, powjyxagy dj wg pjryxtcguaor,

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 28/34

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 más simples, que constan en reemplazar con un patrón

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 oración en español. En un caso real y más complejo, se puede conseguir la

información mirando la extensión del archivo, algún encabezado o header o buscando el origen de

dicho ciphertext.

Para este ciphertext, vamos a utilizar un ataque conocido como "análisis de frecuencias" que se basa

en la premisa de que en un determinado idioma, se utilizan algunas letras más que otras. En el

español, 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 más 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_frecuencia-

t231056.0.html

Aunque también 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 más pequeñas, ya que son las más reconocibles. A medida que

vayamos encontrando las sustituciones, vamos a poder ir descifrando cada vez más el texto.

Tengan en cuenta que es posible que sobre todo en textos pequeños, la correlacion de frecuencias no

sea exacta. Cuanto más grande es el texto a descifrar, más fácil será hacerlo.

Se lo dejo a uds para que practiquen. Fíjense si lo pueden descifrar (por favor no posteen las

soluciones).

Ahora, algo muy importante: Como hago para enseñarle a un programa a interpretar cuando ha

conseguido el plaintext?.

Esto es algo muy importante, ya que uno puede fácilmente 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 imágenes. 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 métodos utilizados para identificar un plaintext, es utilizando la entropía, como ya vimos,

la entropía es un análisis del desorden, los algoritmos de cifrado y compresión buenos, suelen tener 

una salida de entropía casi máxima, sin importar los datos de entrada. Esto nos puede servir si

estamos descifrando un texto, para identificarlo, ya que su entropía va a ser muy baja.

Known-plaintext attack 

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 29/34

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 1F01 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 símbolos.

Ahora, imagínense que nos revelan la fuente del plaintext por alguna razón.

Plaintext: "Desde su uso original para la formación en seguridad de una compañía, CrypTool ha

evolucionado en un destacado proyecto de código abierto para temas relacionados con la

criptografía."

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":c o m p u t a d o r a

1 2 3 4 1 2 3 4 1 2 3

El XOR es reversible, osea que si m XOR k = c, entonces, c xor k = m.

Pero también 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 avíseme 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 más remarcables de Chosen-Ciphertext Attack.

http://es.wikipedia.org/wiki/Cifrado_ElGamal#Maleabilidad

Related Key Attack.

El ejemplo clásico 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 inalámbrica. Sin embargo, este utiliza vectores de

inicialización, es decir bits utilizados para evitar que si se cifra los mismos plaintext con la misma

clave de como resultado el mismo ciphertext, demasiado pequeños, causando colisiones y que estos

 puedan llevar al crackeo de la clave.

Aquí hay una descripción completa de la vulnerabilidad del cifrado WEP.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 30/34

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

Bueno, aqui termina el Capítulo V, ya la próxima entrega, vamos a continuar concriptoanálisis, utilizando estadística básica, 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 abrazoAPOKLIPTICO

Toda la información expuesta en este taller, está protegida bajo licencia Creative Commons

Attribution-NonCommercial-ShareAlike 2.5.

Capítulo VI (Final!). Este capítulo fue escrito mientras se escuchaba: The Beatles (2009 Remastered

discography).

Buenas! Hoy les traigo la última entrega del taller de Criptografía Asimétrica. La idea es que cuando

todos ya estén listos, nos pongamos a crear un algoritmo nuevo. Avisen entonces cuando ya estén, asi

 podemos ponernos.

Esta entrega va a ser distinta de las demás, estuve trabajando en un código 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 criptografía, debe cumplir con las siguientes normas:

- Tener períodos largos.

- La salida debe tener una distribución uniforme.

- Los espacios entre ciertos valores, no corresponden a los de una distribución aleatoria.- No debe haber correlación entre los valores sucesivos de la salida.

El programa que creé, prueba todas menos la última, que como vamos a ver más adelante, es una de

las más importantes.

 NOTA: El programa crea un par de gráficos que muestran la distribución de frecuencias y otro que

muestra la distribución 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 código está adjuntado al post, es demasiado grande para pegarlo y realmente no confío en

rapidshare y similares.

El código utiliza el PRNG que utiliza c++, que es el clásico generador lineal congruencial condistintos parámetros según el compilador. Pero se puede utilizar cualquier prng con solo codearlo en

el programa.

Como entrada, el código pide un tamaño 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

dinámica para guardar los valores, es claro que tiene un límite este número, si lo exceden, no va a

 poder asignarlo y a pesar de que tiene un chequeo, probablemente crashee.

Como salida, da algunos datos estadísticos 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

estadística puse el valor buscado en un PRNG ideal, debemos acercarnos lo más posible a este valor.

Defino antes de empezar un par de conceptos:

Función de distribución: Muestra cuantas veces aparecen cada uno de los valores en un gráfico.Función de distribución uniforme: Función ideal en la cual todos los valores aparecen la misma

cantidad de veces, un PRNG debe aproximarse lo más posible a dicha distribución.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 31/34

Medidas estadísticas

Tamaño de la muestra (n): 256 * x. Siendo "x" el tamaño que el usuario elija. Si esta excede "4000",

se toman solo los primeros 4000 * 256 datos. Esto es por el teorema central del límite que dice que si

se toman muestras suficientemente grandes, las medidas estadísticas van a ser idénticas con un

márgen de error despreciable en comparación con las medidas de la muestra total. Es más que nada

 para agilizar los cálculos.

Mean, Media o promedio (Xm): Media aritmética estándar. 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 más repetido de todos. Puede existir más de

uno, pero solo se muestra el primero que se encuentra. Valor buscado = No definida, es decir, que no

haya un valor que salga más 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, desviación estandar o desviación típica(Sx): Es una medida de dispersión que

indica que tan distribuidos están 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 asimetría (As): Determina que tan simétrica es la

distribución, si hay valores que se repiten más que otros, va a afectar la simetría. 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 simetría. El lado que cause la asimetría, 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 distribución será perfectamente simétrica. As = Sum((xi -

Xm)^3) / n / Sx^3. Valor buscado = 0, es decir que sea simétrica.

Aquí vemos que el sesgo está hacia la derecha, con un As > 0.

Kurtosis o curtosis (Ks): Determina que tan distantes están distribuidos los valores al rededor de la

media. Las distribuciones definidas teóricas, 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: Distribución de Laplace. Ks = 3.

S: Distribución secante hiperbólica. Ks = 2

L: Distribución logística. Ks = 1.2

 N: Distribución normal. Ks = 0C: Distribución coseno aumentada. Ks = −0.593762.

W: Distribución de Wagner. Ks = -1.

U: Distribución uniforme. Ks = -1.2.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 32/34

Valor buscado = -1.2, es decir, uniforme.

Entropy o entropía (Ep): Busca la uniformidad en la muestra, se centra en la repetición 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 gráfico de una distribución, dividimos verticalmente el gráfico en 10 partes

iguales, el valor del eje "x" en donde cae la primera división, es el primer decil, el valor del eje "x" en

donde cae la segunda división, 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 fórmula

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 período muy corto. Todos los

PRNG tienen un período, es decir, un momento en el cual vuelve a empezar la sucesión de dígitos

aleatorios. Esto puede ser problemático para un algoritmo criptográfico, ya que si se consigue una

 parte del PRNG, se puede asumir que va a ser exactamente igual una vez que se reinicie el período.

Sin embargo, los buenos PRNG, tienen períodos muy largos, por ejemplo el Mersenne Twister tiene

un período de 2^19337 -1, suficiente para cualquier cifrado. Sin embargo, el PRNG que viene por 

defecto en C++ (linear congruential generator) tiene un período de 2^24 es decir = 16777216 o 16

Mbytes. Si uno usase eso como keystream para cifrar un archivo utilizando xor cuyo tamaño es mayor 

a 16 Mbytes, con conseguir parte del plaintext, se podrían 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 períodos completos, entonces da un mensaje de

"repetición de período" probable, si puede completar la prueba, entonces da un mensaje de "repetición

de período" conclusivo. Por último muestra el tamaño del período en potencias de 2. Valor buscado

>= 2^32 (4 Gbytes).

Pruebas de aleatoriedad FIPS140-1.Estas pruebas son las estándares 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 demás 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 razón. El test se puede aplicar tanto con streams, es decir con el total de la muestra, o con

 bloques de distintos tamaños, en el programa de 8192 a 16 bits y luego se promedian las razones. Endefinitiva, se trata de ver si hay uniformidad entre 1s y 0s como habría en una muestra realmente

aleatoria. Valores buscados [0.966557 ; 1.035840] para todas las razones. Es posible que para los tests

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 33/34

de bloques más pequeños 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 más 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 seaplica esta fórmula: 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 más 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,4213 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 más de 33 veces ya sea 0 o 1.

Correlación entre valores sucesivos.

Esto significa que se pueda encontrar una relación entre cada uno de los valores, que permita,

teniendo uno de los valores, calcular el siguiente de manera feasible y en tiempo polinómico o cuasi

 polinómico. El programa no incluye testeos para buscar correlación, entonces puede no detectar 

ciertos PRNG que en teoría parecen perfectos, pero en la realidad contienen graves fallas.

Prueben por ejemplo modificar el PRNG del programa por lo siguiente:

Código

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 período de 2^32 y medidas estadísticas cuasi perfectas.

Sin embargo, la sucesión 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 período corto.

El generador lineal congruencial tiene el mismo problema ya que los parámetros que se utilizan para

calcular el siguiente valor, están hardcodeados y varían sólo un poco, con conseguir pocos valores, se

 podría conseguir rápidamente el siguiente valor de la secuencia. Esto sumado a su período corto,hacen a éste PRNG como potencialmente inseguro.

5/14/2018 Criptografia asimetrica - slidepdf.com

http://slidepdf.com/reader/full/criptografia-asimetrica 34/34

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

Este es el fin del capítulo VI y el fin de la parte teórica del taller de criptografíaasimétrica. Posteen todas las dudas que tengan (en el thread del taller) y cuando esténlistos, empezamos a crear.Un abrazoAPOKLIPTICO

El código bájenlo por acá http://web.i.elhacker.net/archivos/StatisticalAnalysis.rar (GraciasNovlucker!)

Toda la información expuesta en este taller, está protegida bajo licencia Creative CommonsAttribution-NonCommercial-ShareAlike 2.5.