Introducción a la Seguridad Informática

Clase: 1

Instituto Educación IT

Instructor: Maximiliano Cañellas

About Me

Consultor en seguridad informática · developer · entrepreneur


Actualmente

  • Developer [at] bitcharts.io

  • Contactame:

    Sobre el curso

    Módulo 1/4: Introducción a la Seguridad Informática

    Temas:

    Criptografía · Criptografía simétrica · Criptografía asimétrica · Criptografía híbrida · One-Time Pad · Algoritmos de hashing · Ataques de fuerza bruta · TrueCrypt · GPG4Win Malware · Virus · Gusanos · Backdoors · Troyanos · RootKits · Spyware

    Seguridad Informática

    Salida laboral

    ¿Hacker o Consultor?

    ¿White/Grey/Black hat?

    Consultor: la importancia del ethical hacking

    ¿Qué papel juega la seguridad informática en la actualidad?

    ¡UNO MUY IMPORTANTE!

    Algunas noticias:

    Edward Snowden leaks (2013) wiki/snowden

    Bug Heartbleed (2014) heartbleed.com

    eBay.com hack (2014) yahoo.com/eBayHack

    Cultura de la seguridad informática

    Libros:

    • CypherPunks (Julian Assange) ISBN 9788423416004
    • Ghost in the Wires (Kevin Mitnick) ISBN 9780316037709


    Películas:

    • The Matrix (1999)
    • The Pirate Bay AFK (2013)
    • The Fifth Estate (2013)
    • Pirates of Silicon Valley (1999)
    • We Steal Secrets: The Story of WikiLeaks (2013)

    ¿Qué es la criptografía?

    La criptografía es la rama de la ciencia de la computación que se encarga de crear y generar las técnicas y algoritmos que utilizamos hoy en día para proteger nuestros datos, sistemas y comunicaciones.

    Nos desviamos un instante
    ¿qué es un algoritmo?

    “Es un conjunto prescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución.”

    Ahora sí, veamos un poco de historia ..

    Criptografía en la vida real

    ¿ejemplos? (sin importar el tipo)

    1. Cifrado/descifrado ZIP/RAR
    2. Login de usuarios
    3. Tráfico HTTPS/SSL / App Home Banking
    4. Redes Wireless WEP/WPA/WPA2
    5. ¡BITCOIN!
    6. Y muchos más ..

    Criptografía Simétrica

    ¿Qué es?

    “La criptografía simétrica (en inglés symmetric key cryptography) o criptografía de una clave (en inglés single-key cryptography), es un método criptográfico en el cual se usa una misma clave para cifrar y descifrar mensajes. Las dos partes que se comunican han de ponerse de acuerdo de antemano sobre la clave a usar. Una vez que ambas partes tienen acceso a esta clave, el remitente cifra un mensaje usando la clave, lo envía al destinatario, y éste lo descifra con la misma clave.”

    ¿Cual es el componente principal de la criptografía simétrica?

    Ventajas de la criptografía simétrica

    ¿Y desventas?

    Algoritmos de criptografía simétrica

    Algunos de los algoritmos más populares son:

    1. DES (Data Encryption Standard)
    2. 3DES (Triple­DES)
    3. Blowfish
    4. IDEA (International Data Encryption Algorithm)
    5. RC4, RC5, y RC6
    6. AES (Advanced Encryption Standard)

    ¿Qué aspecto tiene un algoritmo simétrico?

    
    // Algoritmo AES en lenguaje C
    static void AESEncryptWithExpandedKey(Byte *Ciphertext, const Byte *Plaintext,
    	const AESData *ExpandedKey, long Nr)
    {
    	AESData State;
    
    	XorBlock(&State, (const AESData *) Plaintext, &ExpandedKey[0]);
    
    	{
    		const Word (*T)[256] = AESEncryptTable;
    
    		for (int round = 1; round < Nr; ++round)
    		{
    			const AESData *Key = &ExpandedKey[round];
    
    			const union { Word w; Byte b[4]; }
    				w0 = { State.w[0] },
    				w1 = { State.w[1] },
    				w2 = { State.w[2] },
    				w3 = { State.w[3] };
    
    			State.w[0] = Key->w[0]
    				^ T[0][w0.b[0]] ^ T[1][w1.b[1]] ^ T[2][w2.b[2]] ^ T[3][w3.b[3]];
    			State.w[1] = Key->w[1]
    				^ T[0][w1.b[0]] ^ T[1][w2.b[1]] ^ T[2][w3.b[2]] ^ T[3][w0.b[3]];
    			State.w[2] = Key->w[2]
    				^ T[0][w2.b[0]] ^ T[1][w3.b[1]] ^ T[2][w0.b[2]] ^ T[3][w1.b[3]];
    			State.w[3] = Key->w[3]
    				^ T[0][w3.b[0]] ^ T[1][w0.b[1]] ^ T[2][w1.b[2]] ^ T[3][w2.b[3]];
    		}
    	}
    
    	{
    		const Word (*T)[256] = AESSubBytesWordTable;
    
    		const AESData *Key = &ExpandedKey[Nr];
    
    		const union { Word w; Byte b[4]; }
    			w0 = { State.w[0] },
    			w1 = { State.w[1] },
    			w2 = { State.w[2] },
    			w3 = { State.w[3] };
    
    		State.w[0] = Key->w[0]
    			^ T[0][w0.b[0]] ^ T[1][w1.b[1]] ^ T[2][w2.b[2]] ^ T[3][w3.b[3]];
    		State.w[1] = Key->w[1]
    			^ T[0][w1.b[0]] ^ T[1][w2.b[1]] ^ T[2][w3.b[2]] ^ T[3][w0.b[3]];
    		State.w[2] = Key->w[2]
    			^ T[0][w2.b[0]] ^ T[1][w3.b[1]] ^ T[2][w0.b[2]] ^ T[3][w1.b[3]];
    		State.w[3] = Key->w[3]
    			^ T[0][w3.b[0]] ^ T[1][w0.b[1]] ^ T[2][w1.b[2]] ^ T[3][w2.b[3]];
    	}
    
    	* (AESData *) Ciphertext = State;
    }
    					

    ¡Y es solo la función que cifra! Complicado ¿no?

    ¿Y si intentamos hacer un algoritmo nosotros?

    Un ejemplo de cifrado simple

    
    #Algoritmo de cifrado simple usando pseudo-Python
    def cifrar(clave, mensaje):
    	k = clave
    	mensaje = "HACKERS"
    	mensaje_cifrado = ("H"+k)+("A"+k)+("C"+k)+("K"+k)+("E"+k)+("R"+k)+("S"+k)
    	#Ahora mensaje_cifrado = "JCEMGTU"
    	return mensaje_cifrado
    
    def descifrar(clave, mensaje_cifrado):
    	k = clave
    	mensaje_cifrado = "JCEMGTU"
    	mensaje_descifrado = ("J"-k)+("C"-k)+("E"-k)+("M"-k)+("G"-k)+("T"-k)+("U"-k)
    	#Ahora mensaje_descifrado = "HACKERS"
    	return mensaje_descifrado
    
    > print cifrar(2, "HACKERS")
    > "JCEMGTU"
    > print descifrar(2, "JCEMGTU")
    > "HACKERS"
    			

    ¿Y si intentan los suyos?

    ¡NUNCA USEN ALGORITMOS PROPIOS EN PRODUCCIÓN!

    ¿Cómo se prueba la fortaleza de un algoritmo de cifrado simétrico?

    1. Atacando el algoritmo
    2. Haciendo fuerza bruta sobre la clave

    La importancia de las claves: Una explicación aritmética · 1/4

    ¿Qué es un bit?

    Un bit es un dígito del sistema de numeración binario. Las unidades de almacenamiento tienen por símbolo bit. Mientras que en el sistema de numeración decimal se usan diez dígitos, en el binario se usan solo dos dígitos, el 0 y el 1. Un bit o dígito binario puede representar uno de esos dos valores: 0 o 1. Ocho bits equivalen a un byte.
    En criptografía, una clave se compone de una larga secuencia de bits utilizado un algoritmo para cifrar o descifrar. Por ejemplo esto podría ser una clave hipotética de 40 bits (una secuencia de 40 dígitos de 0 y 1): 00001010 01101001 10011110 00011100 01010101

    La importancia de las claves: Una explicación aritmética · 2/4

    En criptografía solo es posible romper un algoritmo criptográfico de dos formas. Una es atacando el algoritmo y la otra es probando con un ataque de fuerza bruta, utilizando una computadora, para probar todas las claves posibles.
    El cifrado con 2 bits tiene cuatro posibles resultados: 00, 01, 10 y 11. 3 bits tienen 8 posibles combinaciones, 4 bits tienen 16 posibles combinaciones, 5 bits tienen 32 posibles combinaciones y así sucesivamente ..
    Por lo tanto el crecimiento por cada bit que se añade a una clave es exponencial. Matemáticamente existen 2^n posibles valores para una clave de n bits. Cada vez que añadimos un bit se dobla el número de posibles claves.

    La importancia de las claves: Una explicación aritmética · 3/4

    Una clave de 128 bits tiene: 340.282.366.920.938.463.463.374.607.431.768.211.456 posibles combinaciones. Son más de 340 millones de mil millones de mil millones de mil millones de combinaciones.
    Una clave de 128 bits equivale a 16 bytes. 16 bytes pueden representar 16 caracteres de nuestro abecedario u otros símbolos según la codificación (UTF, Base64, etc) que se use.

    La importancia de las claves: Una explicación aritmética · 4/4

    ¿Por qué se utilizan claves con más bits?

    Si una clave tiene 128 bits existen 2^128 diferentes claves posibles. En promedio se deberán probar la mitad de las claves posibles (2^64) antes de que se encuentre la clave correcta.
    Una posible pregunta sería: ¿por qué no utilizar siempre claves de 256, 350 o 1024 bits? La respuesta es que tanto por razones de velocidad porque cuanto más larga sea la clave más se tarda en decodificar y sobre todo porque el objetivo de la criptografía es proteger información con claves lo más sencillas posibles, pero que sigan siendo seguras.

    ¡Probemos la seguridad de nuestros passwords!

    https://howsecureismypassword.net/

    Herramientas que usamos en Seguridad Informática

    Hoy vamos a aprender a usar:

    ¡Fin de la clase! :)

    ¿Dudas? ¿Preguntas?