1.27k likes | 1.5k Views
CRIPTOGRAFIA Autor: Siler Amador Donado samador@unicauca.edu.co. CRIPTOANALISIS. "..., y es en realidad, dudoso que el género humano pueda crear un enigma de ese género que el mismo ingenio humano no resuelva con una aplicación adecuada." (Edgar Allan Poe). Criptografía.
E N D
CRIPTOGRAFIA Autor: Siler Amador Donado samador@unicauca.edu.co
CRIPTOANALISIS "..., y es en realidad, dudoso que el género humano pueda crearun enigma de ese género que el mismo ingenio humano no resuelvacon una aplicación adecuada." (Edgar Allan Poe)
Criptografía.... Entendemos por Criptografía Kriptos = ocultar Graphos = escritura la técnica de transformar un mensaje inteligible, denominado texto en claro, en otro que sólo puedan entender las personas autorizadas a ello, que llamaremos criptograma o texto cifrado. El método o sistema empleado para encriptar el texto en claro se denomina algoritmo de ciframiento.
Algoritmos clásicos... Cifrados monográficos. El cifrado de Cesar. Cifrados poligráficos. Cifrado de Gronsfeld. Cifrado Bífido. El cilindro de Jefferson. El cifrado ADFGVX.
Cilindro de Jefferson Este dispositivo de cifrado fue inventado por Thomas Jefferson (1743-1826) el autor de la Declaración de Independencia de EE.UU.. aunque el primero en fabricarla en serie fue EtienneBazeries en 1891. El aparato consiste en una serie de discos que giran alrededor de un mismo eje y llevan impresas las letras del alfabeto, dispuestas en distintos órdenes.
Análisis de frecuencias Es una técnica de criptoanálisis utilizada en cifrados de sustitución, basada en el estudio de la frecuencia de aparición de las letras o símbolos de un criptograma. Este análisis se basa en el hecho de que cada lenguaje dispone de una frecuencia característica de aparición de sus letras o grupos de ellas. Por ejemplo, en inglés es común el uso de la letra E mientras que la X raramente aparece. Lo mismo ocurre en los textos en castellano, donde la E y la A son las letras más habituales. Aproximadamente la distribución de porcentajes de aparición de cada letra en algunas lenguas comunes es la siguiente:
L InglésFrancésAlemánCastellano a 8.167% 7.636% 6.51% 12.53% b 1.492% 0.901% 1.89% 1.42% c 2.782% 3.260% 3.06% 4.68% d 4.253% 3.669% 5.08% 5.86% e 12.702% 14.715% 17.40% 13.68% f 2.228% 1.066% 1.66% 0.69% g 2.015% 0.866% 3.01% 1.01% h 6.094% 0.737% 4.76% 0.70% i 6.966% 7.529% 7.55% 6.25% j 0.153% 0.545% 0.27% 0.44% k 0.772% 0.049% 1.21% 0.00% l 4.025% 5.456% 3.44% 4.97% m 2.406% 2.968% 2.53% 3.15% n 6.749% 7.095% 9.78% 6.71% o 7.507% 5.378% 2.51% 8.68% p 1.929% 3.021% 0.79% 2.51% q 0.095% 1.362% 0.02% 0.88% r 5.987% 6.553% 7.00% 6.87% s 6.327% 7.948% 7.27% 7.98% t 9.056% 7.244% 6.15% 4.63% u 2.758% 6.311% 4.35% 3.93% v 0.978% 1.628% 0.67% 0.90% w 2.360% 0.114% 1.89% 0.02% x 0.150% 0.387% 0.03% 0.22% y 1.974% 0.308% 0.04% 0.90% z 0.074% 0.136% 1.13% 0.52%
A parte de estudiar la frecuencia de aparición de un símbolo, también podemos fijarnos en la frecuencia de aparición de conjuntos de dos, tres, o más letras. En castellano son frecuentes cadenas de dos letras como DE, LA, EL, EN o palabras de tres como QUE, LOS, DEL, LAS y POR. A continuación se muestran los conjuntos de dos y tres letras más frecuentes: En Inglés Conjuntos de dos letras: TH, HE, AN, IN, ER, RE, ES, ON, EA, TI, AT, ST, EN, ND, OR, TO, NT, ED, IS, AR. Conjuntos de tres letras: THE, ING, AND, ION, ENT, FOR, TIO, ERE, HER, ATE, VER, TER, THA, ATI, HAT, ERS. En Francés: Conjuntos de dos letras: ES, EN, OU, DE, NT, TE, ON, SE, AI, IT, LE, ET, ME, ER, EM, OI, UN, QU. Conjuntos de tres letras: ENT, QUE, ION, LES, AIT, TIO, ANS, ONT, ANT, OUR, AIS, OUS. En Alemán Conjuntos de dos letras: EN, ER, CH, DE, GE, EI, IE, IN, NE, ND, BE, EL, TE, UN, ST, DI, NO, UE, SE, AU, RE, HE. Conjuntos de tres letras: EIN, ICH, DEN, DER, TEN, CHT, SCH, CHE, DIE, UNG, GEN, UND, NEN, DES, BEN, RCH. En Castellano: Conjuntos de dos letras: ES, EN, EL, DE, LA, OS, AR, UE, RA, RE, ER, AS, ON, ST, AD, AL, OR, TA, CO. Conjuntos de tres letras: QUE, EST, ARA, ADO, AQU, DEL, CIO, NTE, OSA, EDE, PER, IST, NEI, RES, SDE.
Al intentar romper un cifrado mediante análisis de frecuencia nuestro objetivo será identificar la frecuencia de aparición de los símbolos usados. Después buscaremos una equivalencia entre estos símbolos y las letras que más aparecen en la lengua usada intentando encontrar un significado. Nos servirán también las frecuencias de aparición de conjuntos de X letras, así como nuestra imaginación a la hora de rellenar huecos al estilo del juego del ahorcado. En algunos casos puede ser útil conocer el porcentaje de vocales de cada idioma. En inglés, por ejemplo, el porcentaje de vocales es del 40%, igual que en el alemán. Sin embargo, en francés es del 45% y en castellano del 47%. Estos datos, aunque solo son aproximaciones pueden resultar de gran interés en ciertos criptogramas. Criptoanálisis de ejemplo Para experimentar con lo comentado anteriormente, imaginemos un sistema de cifrado por sustitución, de manera que cada letra del mensaje ha sido sustituída por un símbolo. El ejemplo de mensaje cifrado es el siguiente: 3# 16_@!5?6#=_# 2> 23 #6!2 |2 2>16_$_6 15% 13#72 >2162!# 5 |2 /% 45|5 2%_?4#!_15
Para iniciar nuestro criptoanálisis, empezaremos realizando un análisis de frecuencias. Para que este proceso no se haga pesado, adjunto un sencillo programa en C++ que lo hará por nosotros. • #include <iostream> • #include <fstream> • #include <algorithm> • #include <map> • intmain(intargc, char* argv[]) • { • usingnamespacestd; • if(argc!=3) • { • cout << "Usage: " << argv[0] << " [file] [maxgroupsize]" << endl; • return 0; • } • for(int i=0; i<atoi(argv[2]); i++) • { • int c; • map<string,int> freq; • ifstreamfile(argv[1]); • stringgroup; • while( (c=file.get()) && !file.eof() ) • { • if(isspace(c)) • continue; • group += string(1,c); • if(group.size()>=i+1) • freq[group.substr(group.size()-i-1, i+1)]++; • } • cout << endl << "-- FREQ SIZE " << i+1 << " --" << endl; • intcount = 0; • map<string,int>::iteratorit = freq.begin(); • for(;it!=freq.end(); it++) • { • if((*it).second>1) • { • count ++; • cout << (*it).first << ": " << (*it).second << "\t"; • if(count%6==0) • cout << endl; • } • } • cout << endl; • } • }
Partiendo del programa y del un archivo con el texto cifrado "cipher.txt" realizamos el análisis de frecuencias: $ g++ freq.cpp $ ./a.out cipher.txt 3 -- FREQ SIZE 1 -- !: 4 #: 7 %: 3 1: 6 2: 10 3: 3 4: 2 5: 6 6: 6 >: 3 ?: 2 _: 6 |: 3 -- FREQ SIZE 2 -- 15: 2 16: 3 2>: 3 3#: 3 5|: 2 6_: 2 >2: 2 |2: 2 -- FREQ SIZE 3 -- 16_: 2 2>2: 2 Si observamos el análisis de frecuencias podemos ver que los símbolos que más se repiten son '2' y '#', seguidos de '_', '1', '5' y '6'. Por lo que siguiendo la distribución de porcentajes frecuentes es probable que se correspondan con las letras 'a', 'e', 'i', etc. Es importante tener en cuenta que esto solo nos da una pista de cuál podría ser el valor de cada símbolo, pero no nos lo dice de forma exacta. Por este motivo será necesario probar varias hipótesis. Empezaremos suponiendo que '2' corresponde a 'e' y '#' corresponde a 'a'. Si nuestra hipótesis falla, continuaremos probando al revés. Sustituimos en el texto cifrado: 3# 16_@!5?6#=_#2> 23 #6!2 |22>16_$_6 15% 13A72 >2162!# 5 |2 /% 45|5 2%_?4#!_15 3A 16_@!5?6A=_AE> E3 A6!E |EE>16_$_6 15% 13A7E >E16E!A 5 |E /% 45|5 E%_?4A!_15
Observando el principio del texto cifrado "3A" y la cuarta palabra "E3" deducimos que '3' corresponde a la letra 'L'. Sustituimos de nuevo. 3A 16_@!5?6A=_A E> E3 A6!E |E E>16_$_6 15% 13A7E >E16E!A 5 |E /% 45|5 E%_?4A!_15 LA 16_@!5?6A=_AE> EL A6!E |E E>16_$_6 15% 1LA7E >E16E!A 5 |E /% 45|5 E%_?4A!_15 También pueden resultar buenas pistas la tercera palabra "E>" y la sexta "|E". Estas nos indican que ">" podría corresponder a 'S' o 'N', y '|' probablemente corresponderá a 'D'. Vea la frecuencia de grupos de dos letras. Además, si nos basamos en las suposiciones anteriores, el grupo '/%' que corresponde a una palabra de dos letras que no contiene ni 'A' ni 'E'. Será pues una de las siguientes: NO, UN, SU, LO, SI, MI, ... También es una buena pista el '5' solitario, que muy probablemente corresponderá a una 'y' o una 'o'. Pero viendo en la octava palabra '15%' deducimos que difícilmente corresponderá a una 'Y'. Con base en las observaciones anteriores, una buena hipótesis podría corresponder a las siguientes sustituciones: '5' por 'o', '|' por 'D' y '>' por 'S'. LA 16_@!5?6A=_A E> EL A6!E |E E>16_$_6 15% 1LA7E >E16E!A 5 |E /% 45|5 E%_?4A!_15 LA 16_@!O?6A=_A ES EL A6!EDE ES16_$_6 1O% 1LA7E SE16E!A O DE /% 4ODOE%_?4A!_1O
Llegados a este punto, más de unos sería capaz de resolver el mensaje utilizando solamente su imaginación. Pero en lugar de dar la solución, vamos a explorar otra técnica interesante. Esta corresponde a atacar las palabras sin descifrar con un diccionario. Como ejemplo usaremos una lista de palabras en castellano que se puede descargar de: http://lemarios.olea.org/lemario-espanol-2002-10-25.txt.gz NOTA: Esta lista contiene acentos y ñ, que es recomendable sustituir para poder seguir los siguientes pasos. Después de descargar y descomprimir la lista de palabras estudiemos que opciones tenemos para acabar de descifrar el mensaje. Una palabra que tiene posibilidades es '1LA7E', una palabra de 5 letras de las cuales conocemos tres. También es interesante atacar la palabra que viene a continuación 'SE16E!A'. Podemos hacerlo con dos sencillos comandos grep: $ grep "^.la.e$" lemario-espanol-2002-10-25.txt alabe clase clave glase llave olaje $ grep "^se..e.a$" lemario-espanol-2002-10-25.txt secreta secuela segueta septena serreta
Sin duda, las palabras que buscamos son "CLAVE SECRETA". Así que continuamos con la sustitución: LA CR_@TO?RA=_A ES EL ARTE DE ESCR_$_R CO% CLAVE SECRETA O DE /% 4ODO E%_?4AT_CO La última palabra puede confundirnos, pero está claro cuál es la segunda. En cualquier caso: $ grep "^cr..to.ra..a$" lemario-espanol-2002-10-25.txt criptografia. $ grep "^e....at.co$" lemario-espanol-2002-10-25.txt enigmatico enzimatico estomatico Con lo que la resolución del mensaje es trivial: "La criptografía es el arte de escribir con clave secreta o de un modo enigmático" Finalmente el mensaje ha quedado descifrado, pero hay que tener en cuenta que aquí no se han expuesto todas las posibilidades. Es normal, cuando se inicia el criptoanálisis, que se tomen algunas hipótesis incorrectas. En estos casos, no queda más remedio que volver a empezar. Referencias: - Cryptanalysis a study of ciphers and theirsolution. Helen Fouché Gaines.
FIN CRIPTOANALISIS POR FRECUENCIA
Algoritmos modernos... • Cifrado exponencial • RSA • Skipjack: la verdad • Gráfica de funciones elípticas • Etiquetas de paquetes OpenPGP
Qué es RSA? El RSA es un sistema de clave pública implementado por Rivest, Shamir y Adleman basado en la exponenciación modular desarrollada por Diffie-Hellman, donde la clave pública son pares de números (e,n) formados por un exponente e y un módulo n que es el producto de dos grandísimos números primos p y q tales que mcd(e,fi(n))=1 (donde fi(n) es el número de enteros menores que n y primos con él)
El algoritmo RSA? Pasos a seguir para cada usuario A y B : El usuario A elige 2 números primos pay qa Calculamos el GrupoZ*na , entonces na= pa*qa Calculamos el Orden del Grupo(na) = (pa-1)*(qa-1) Seleccionamos un entero positivo ea, 1<= ea< (na), | sea primo con el Orden del Grupo, es decir mcd(ea, (na))=1 Basado en el algoritmo de Euclides extendido calculamos dA que es el inverso modular de ea en Z(na); ea* da ≡ 1 (mod((na)) con 1<= da < (na) La llave publica del usuario A es (ea,na) y la llave privada es (da)
Cómo cifrar y descifrar con el algoritmo RSA? Si un usuario A desea enviar cifrado un mensaje m ЄZnal usuario B, A utiliza la llave pública de B,(eb,nb), para calcular el valor de meb(modnb) = c, que luego envía a B. Para recuperar el mensaje original m, B debe usar la llave privada (db) para calcular cdb = (meb)db = mebdb ≡ m (modnb). Entonces m= cdb(modnb)
Cómo firmar un mensaje con el algoritmo RSA? A cuenta con la llave pública (ea,na) y su llave privada (da). Si un usuario A desea enviar la firma digital de un mensaje m ЄZnal usuario B: Calcula el valor de su rúbrica r ≡ mda(modna). Determina la firma cifrando con la llave pública de B la rúbrica. s ≡ reb(modnb). El mensaje firmado que A envía a B es la pareja formada por (c,s), donde c es el mensaje m cifrado. Para que B pueda verificar la firma de A,debe comprobar que: sdb(modnb) ≡ (reb(modnb))db (modnb) ≡rebdb(modnb) = r rea(modna) ≡ mdaea(modna) = m
Ejemplo del algoritmo RSA (½) El usuario B elige pb=23, qb=97, nb=2231 El orden del Grupo es (nb)=2112 B elige el número eb = 17 mcd(17,2112) = 1 OK Calculamos el inverso modular: eb*db ≡ 1 (mod (nb)) con 1<= db< (nb) , luego 17 * db ≡ 1 (mod 2112)con 1<= db<2112 Luego la llave privada de B es db= 497 Entonces la llave pública de B (17, 2231) Usuario A elige pa=101,qa=29,(na)=2800,ea=17 na= 2929, ya realizó sus cálculos obteniendo: la llave privada de A es da = 1153 Entonces la llave pública de A (17, 2929) Ciframos m con la llave pública de B: C = meb(modnb) entonces C = 205017 (mod2231) = 177, entonces C = 6(271) + 15(270) ≡ GO Para descifrar usamos la llave privada de B(db) m=cdb(modnb)=177497(mod2231), luego El mensaje m descifrado es: 2050≡ CUY Alfabeto inglés: A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 m≡ CUY, entonces C(272)+U(271)+Y(270) ≡ 1458+567+25 = 2050 < 2231 y2050 < 2929
Ejemplo del algoritmo RSA (2/2) El usuario B elige pb=23, qb=97, nb=2231 El orden del Grupo es (nb)=2112 B elige el número eb = 17 mcd(17,2112) = 1 OK Calculamos el inverso modular: eb*db ≡ 1 (mod (nb)) con 1<= db< (nb) , luego 17 * db ≡ 1 (mod 2112)con 1<= db<2112 Luego la llave privada de B es db= 497 Entonces la llave pública de B (17, 2231) Usuario Aelige pa=101,qa=29,(na)=2800,ea=17 na= 2929, ya realizó sus cálculos obteniendo: la llave privada de A es da = 1153 Entonces la llave pública de A (17, 2929) El usuario A calcula su rúbrica para el mensaje. r =mda(modna)= 20501153(mod2929) = 1851 s =reb(modnb) = 185117(mod2231)= 1463 s= 2(272) + 0(271) + 5(270) ≡ CAF, entonces B recibe la pareja: (c,s)≡ (GO, CAF), luego que B ha descifrado c, verifica s = 1463, entonces: r= sdb(modnb)= 1463497(mod2231)= 1851 y recupera de nuevo el mensaje así: m=rea(modna)=185117(mod2929) = 2050, luego el mensaje mes: 2050≡ CUY Firma OK! Alfabeto inglés: A B C D E F G H I J K L M N Ñ O P Q R S T U V W X Y Z 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 m≡ CUY, entonces C(272)+U(271)+Y(270) ≡ 1458+567+25 = 2050 < 2231 y2050 < 2929
Métodos de Ataque a RSA ... • Ataque a modulo común. • Ataque basado en un exponente publico bajo. • Ataque basado en un exponente privado bajo. • Ataque por Iteración. o
genRSA: Software para Generación de Claves y Cifra RSA Autor: D. Juan Carlos Pérez García Tutor: D. Jorge Ramió Aguirre Entorno: Windows. Instalación: Copie el archivo genRSA.zip en una carpeta C:\Criptolab\genRSA. Al descomprimirlo, obtendrá automáticamente el archivo ejecutable y el archivo de ayuda de la aplicación. Contacto: jramio@eui.upm.es. Escuela Universitaria de InformáticaUniversidad Politécnica de Madrid - España
Test de Primaridad … Indicador primalidad Si es primo No es primo
Enlaces importantes • Demo de los algoritmos RC2, RC4, DES y triple DES. http://support.persits.com/encrypt/demo_text.asp • Demo de Hash en una sola vía. http://support.persits.com/encrypt/demo_hash.asp • Criptografia. http://www.math.princeton.edu/matalive/Crypto/index.html • Crypto 101 (Bruce Schneier). http://www.aspencrypt.com/crypto101.html • Ocultándose en el DNA. http://www.maa.org/mathland/mathtrek_4_10_00.html • Utilidades para identificar números primos. • http://pinux.info/primos/index.html • http://cryptoclub.math.uic.edu/mathfunctions/primality.html • Criptoanálisis. • Análisis por frecuencia. http://cryptoclub.math.uic.edu/substitutioncipher/frequency_txt.htm • Cifrado de Vigenere. http://cryptoclub.math.uic.edu/vigenere/decrypt.php
Kr1Pt0Gr@f1a Siler Amador Donado Ingeniero de sistemas Universidad del Cauca
Agenda Introducción Historia Curiosidades Criptografía Simétrica y Asimétrica Criptografía en el web Demostración con GnuPG Llaves públicas y privadas
Introducción Kr1pt0Gr@f1a Criptos = Ocultar Grafos = Escritura Codificar = Reemplazar palabras Cifrar = Reemplazar caracteres Criptografía Criptograma = Mensaje cifrado Criptoanálisis = Técnica para encontrar clave Diferenciar
Historia • Se usaba desde la antiguedad • Egipcios (4k años A.C) • Jeroglíficos • Babilonios • Cueniforme • Atenas vs Esparta (500 años A.C) • Rodillos, tira de papel, grosor y longitud • Romanos (Cifrado Julio César) • Alfabeto + corrimiento=3. Ej: siler = vlñhu
Curiosidades Michael Drosnin : Afirma que la biblia está cifrada y que ha logrado descifrar mensajes, como por ejemplo: cuándo será el fin del mundo. Esteganografía: Ciencia de esconder mensajes dentro de mensajes. En la antigüedad tatuaban mensajes secretos en la cabeza rapada de un mensajero y dejaban que le creciera el pelo antes de enviarlo a territorio enemigo.
Curiosidades Durante la segunda guerra mundial aparece Enigma, creada por los alemanes. Máquina de escribir.
Criptografía simétrica DES, RC2, RC4 e IDEA
Criptografía asimétrica RSA (Rivest Shamir Adleman)
La criptografía asimétrica utiliza dos claves: la clave privada y la clave pública.
La clave privada de Ana sólo la debe conocer Ana La criptografía asimétrica utiliza dos claves: la clave privada y la clave pública. La clave pública de Ana la puede conocer cualquiera ya que está en bases de datos públicas
Demostración PGP (PrettyGoodPrivacy) Crear el par de llaves Cifrar y descifrar un archivo
Fuerza bruta • Técnica para encontrar claves a partir de diccionarios. • John theRipper (Linux y Unix) • /etc/passwd y el /etc/shadow • Crack (Linux y Unix) • /etc/passwd y el /etc/shadow • L0phCrack (Linux, Unix y NT) • Sam • Diccionarios en: ftp://sable.ox.ac.uk/pub/wordlists/ • Demostración con John the Ripper
¿Cómo escoger contraseñas? LONGITUD 26 62 70 2 676 3844 4900 3 17576 238328 343000 4 456976 14776336 24010000 5 11881376 916132832 1680700000 6 308915776 5*10^10 1*10^11 7 8031810176 3*10^12 8*10^12 8 2*10^11 2*10^14 5*10^14 ALFABETO
¿Cómo escoger contraseñas? Mínimo 8 caracteres. Que incluya alfanuméricos y caracteres especiales(ab…zAB…Z012…9<>,;@…). Que no se encuentre en algún diccionario. Que no tenga nada que ver con el dueño (familiar,cédula,placa…etc). No compartirla ni anotarla (memorizarla). No usar generadores de contraseña
¿Cómo escoger contraseñas? • Ejemplos: • Escoja una frase: “Ojalá que llueva café en el campo” • Intercale mayúsculas y minúsculas: OqLcEeC • Reemplace algunas letras por números, e=3: OqLcE3C • Incluya algún carácter especial(!”,&%…): OqLcE3C@