diff --git a/ejercicios/06/Hashes.ipynb b/ejercicios/06/Hashes.ipynb index b5ffc09..520899a 100644 --- a/ejercicios/06/Hashes.ipynb +++ b/ejercicios/06/Hashes.ipynb @@ -158,7 +158,7 @@ }, "source": [ "\n", - "Preguntas:\n", + "PREGUNTAS:\n", "\n", "- Prueba varios cambios en el mensaje \"hola mundo\" y apunta los hashes, verás que cambian totalmente por muy pequeños que sean los cambios: algunas mayúsculas, números, signos de puntuación...\n", "- ¿Cuántos mensajes existen que tengan el mismo hash que \"hola mundo\"?\n", @@ -167,21 +167,13 @@ " - Powershell en Windows: `Get-FileHash NOMBREDEARCHIVO`\n", " - Linux/OSX: `sha256sum NOMBREDEARCHIVO`\n", "- Cambia el nombre del archivo y calcula su hash. ¿Ha cambiado el hash al cambiar el nombre del archivo?\n", - "" + "\n", + "\n", + "

\n", + "RESPUESTA: texto de tu respuesta\n", + "

" ] }, - { - "cell_type": "markdown", - "source": [ - "\n", - "Respuesta\n", - "" - ], - "metadata": { - "id": "GugsIunmRyqQ" - }, - "id": "GugsIunmRyqQ" - }, { "cell_type": "markdown", "id": "endless-minneapolis", @@ -358,26 +350,19 @@ "id": "metric-advocacy" }, "source": [ - "\n", - "Preguntas:\n", + "

\n", + "PREGUNTAS:\n", "\n", "- ¿Cuál de los algoritmos es más rápido? ¿Cómo afecta doblar el número de bits (es decir, pasar de 256 a 512 bits)?\n", "- Calcula el hash SHA-256 y SHA-512 de un archivo de unos 500MB en tu ordenador (por ejemplo, una película) ¿Cuánto tiempo le lleva?\n", - "" + "\n", + "

\n", + "\n", + "

\n", + "TU RESPUESTA: texto de tu respuesta\n", + "

\n" ] }, - { - "cell_type": "markdown", - "source": [ - "\n", - "Respuesta\n", - "" - ], - "metadata": { - "id": "QdDNGxCxSDgj" - }, - "id": "QdDNGxCxSDgj" - }, { "cell_type": "markdown", "id": "d184e060", @@ -387,9 +372,13 @@ "source": [ "## Proof of work Hashcat\n", "\n", - "Vamos a programar una \"Proof of work\" (*pow*) muy sencilla inspirada en Hashcat, la misma tecnología utilizada por bitcoin: \"encuentra un número tal que al juntarlo a un texto y calcular su hash, el hash empiece por un número determinado de ceros\".\n", + "Vamos a programar una \"Proof of work\" (*pow*) muy sencilla inspirada en Hashcat, la misma tecnología utilizada por bitcoin: \"encuentra un número aleatorio tal que al juntarlo a un texto y calcular su hash, el valor de hash empiece por un número determinado de ceros\".\n", "\n", - "La idea es que no se aceptará un correo electrónico, nuevo bloque bitcoin... lo que sea, si el emisor no incluye una \"proof of work\" junto con el mensaje. Es decir, que pruebe que ha estado X minutos buscando el contador que resulte en un hash correcto. De esta manera se limita el número de mensajes por minuto que puede emitir una persona. Fíjate que encontrar el contador es un proceso costoso, pero comprobar que el contador es correcto es muy rápido: solo tienes que calcular el hash y mirar si empieza con el número correcto de ceros.\n", + "El hash(12345 + \"hola mundo\") empieza por 3 ceros, ¿no? ¿Y si ponemos 12346? ¿tampoco? ¿12347?\n", + "\n", + "Esto es una \"proof of work\": la única manera que conocemos para que el valor de un hash de un texto empiece por un número determinado de ceros es probar todos los textos uno a uno, hasta que por suerte encontramos ese valor.\n", + "\n", + "La idea de los sistemas que usan proof-of-work como bitcoin es que no se aceptará un nuevo mensaje si el emisor no incluye una \"proof of work\" junto con el mensaje. Es decir, que pruebe que ha estado X minutos buscando el contador que resulte en un hash correcto. De esta manera se limita el número de mensajes por minuto que puede emitir una persona. Fíjate que encontrar el contador es un proceso costoso, pero comprobar que el contador es correcto es muy rápido: solo tienes que calcular el hash y mirar si empieza con el número correcto de ceros.\n", "\n", "Nosotros vamos a utilizar el mensaje \"hola\" solo para ilustrar. Bitcoin funciona de una manera similar, pero el \"mensaje\" en bitcoin es un bloque con descripciones de transacciones y sus firmas electrónicas.\n", "\n", @@ -432,20 +421,9 @@ "execution_count": null, "id": "50f7e13f", "metadata": { - "id": "50f7e13f", - "outputId": "6afe3c42-1faf-403a-c3cc-dc33659fa462" + "id": "50f7e13f" }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{'proof': b'hola mundo:7', 'hash': '03b259a65fc9611429bfdfc1674d6bf76cdcabfe30b4173668f8a0a8453ce44a'}\n", - "{'proof': b'hola mundo:537', 'hash': '00956af98878e1a3b97468a9e2399bcd0bdf00caa41b51d9677470697b629f37'}\n", - "{'proof': b'hola mundo:604', 'hash': '00080de7165b61664c42c3b37691008ad10dbcdb2dd19aff7f1548eb81a04f6b'}\n" - ] - } - ], + "outputs": [], "source": [ "print(proof_of_work('hola mundo', effort=1))\n", "print(proof_of_work('hola mundo', effort=2))\n", @@ -459,23 +437,15 @@ "id": "9b1b6cca" }, "source": [ - "\n", - "¿Con qué esfuerzo(=número inicial de ceros en el hash) tu PC necesita (más o menos) 30 segundos para encontrar el contador?\n", - "" + "

\n", + "PREGUNTA: ¿Con qué esfuerzo(=número inicial de ceros en el hash) tu PC necesita (más o menos) 30 segundos para encontrar el contador?\n", + "

\n", + "\n", + "

\n", + "TU RESPUESTA: texto de tu respuesta\n", + "

" ] }, - { - "cell_type": "markdown", - "source": [ - "\n", - "Respuesta\n", - "" - ], - "metadata": { - "id": "ZIJ1N46jSRNx" - }, - "id": "ZIJ1N46jSRNx" - }, { "cell_type": "markdown", "id": "e130259f", @@ -608,9 +578,13 @@ "id": "moral-exclusive" }, "source": [ - "Pregunta:\n", + "

\n", + "PREGUNTA: ¿Por qué crees que Alice cifra **solamente** el hash del mensaje con RSA, en vez de cifrar directamente **todo** el mensaje con RSA?\n", + "

\n", "\n", - "- ¿Por qué crees que Alice cifra **solamente** el hash del mensaje con RSA, en vez de cifrar directamente **todo** el mensaje con RSA?" + "

\n", + "TU RESPUESTA: texto de tu respuesta\n", + "

" ] }, { @@ -658,7 +632,7 @@ "id": "different-garage" }, "source": [ - "¿Qué pasa si un atacante intercepta el mensaje y cambia el documento? Aquí vemos un ejemplo: el atacante ha interceptado el documento y ha puesto información falsa. ¿Puedes identificar qué parte del documento ha cambiado el atacante?\n", + "¿Qué pasa si un atacante intercepta el mensaje y cambia el documento? Aquí vemos un ejemplo: el atacante ha interceptado el documento y ha puesto información falsa.\n", "\n", "Observa que ahora la firma de Alice no verifica y la función lanza un error." ] @@ -694,6 +668,22 @@ "print(\"La firma es válida\")" ] }, + { + "cell_type": "markdown", + "source": [ + "

\n", + "PREGUNTA: ¿Podrías detectar qué parte del mensaje ha cambiado mirando solo la firma electrónica?\n", + "

\n", + "\n", + "

\n", + "TU RESPUESTA: texto de tu respuesta\n", + "

" + ], + "metadata": { + "id": "pQ0Irit-fLcY" + }, + "id": "pQ0Irit-fLcY" + }, { "cell_type": "markdown", "id": "british-congress", diff --git a/slides/06-hashes.md b/slides/06-hashes.md index e64deef..d6aaeb0 100644 --- a/slides/06-hashes.md +++ b/slides/06-hashes.md @@ -27,11 +27,18 @@ Juan Vera del Campo - # Como decíamos ayer... - **Confidencialidad**: AES/ChaCha20 + D-H -- **Autenticidad**: RSA + firma digital -- **No repudio**: RSA + firma digital +- **Autenticidad**: firma digital +- **No repudio**: firma digital - **Integridad**: firma digital -Los hashes nos permiten calcular **una firma digital** +Firma digital = cifrado asimétrico de un valor de hash + + # Hoy hablamos de... @@ -65,9 +72,9 @@ Da igual como sea la entrada, la salida siempre tiene el mismo número de bits ## Ejemplos no criptográficos -- Bit de paridad un mensaje: número de "1" en el mensaje -- CRC -- Checksum +- [Bit de paridad un mensaje](https://en.wikipedia.org/wiki/Parity_bit): número de "1" en el mensaje +- [*Cyclic redundancy check* (CRC)](https://es.wikipedia.org/wiki/Verificaci%C3%B3n_de_redundancia_c%C3%ADclica) +- [RAID 4](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_4) y [RAID 5](https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5) Todos estos son resúmenes, pero no son de utilidad en criptografía @@ -79,16 +86,17 @@ Todos estos son resúmenes, pero no son de utilidad en criptografía ## Funciones de hash criptográficas + Funciones hash criptográficas son aquellas que: - Son funciones resumen: comprimen la entrada a una salida de menor longitud -- Son fáciles y rapidas de calcular - **Propiedades adicionales**: + - Son fáciles y rapidas de calcular - Dado un resumen, no es posible calcular el mensaje original - No es factible encontrar dos mensajes con el mismo resumen @@ -110,7 +118,7 @@ Ejemplos de valores de hash: ¿Qué tenemos que cambiar en "The red fox jumps over the blue dog" para que tenga el mismo hash? Es decir, para que el hash no detecte el cambio. Ya que el texto es mayor de 256 bits, sabemos seguro que habrá otro texto que tendrá el mismo resumen. Pero lo único que podemos hacer es probar cambios uno y otro hasta tener suerte! --> -## Requisitos de una función de hash criptográfica +## Requisitos formales de una función de hash criptográfica - Que sea **rápida** de calcular @@ -122,9 +130,9 @@ La única forma de encontrar preimágenes o colisiones tiene que ser la fuerza b > https://en.wikipedia.org/wiki/Cryptographic_hash_function#Properties -## ¿Cuántos hashes podemos calcular por segundo? +## Rápida de calcular -Los hashes se usan mucho en minería bitcoin, así que podemos utilizar sus tablas para conocer velocidades: +Las funciones de hash se usan mucho en criptomonedas, así que podemos utilizar sus tablas para conocer velocidades: - ARM1176JZ(F)-S (Raspberry): 0.2 MH/s Scrypt (Litecoin) - NVidia GTX1080: 40MH/s Ethash (Ethereum) @@ -136,7 +144,7 @@ Los hashes se usan mucho en minería bitcoin, así que podemos utilizar sus tabl > Más ejemplos: https://miningchamp.com/ > En la imagen, un Avalon 6, bloque especializado en calcular hashes -## ¿Mensajes con el mismo resumen? +## Colisión de valores de hash Obvio: no puede existir una aplicación inyectiva entre un conjunto de $m$ elementos y otro de $n$ elementos si $m>n$ @@ -239,12 +247,14 @@ Si calculas los valores de hash del archivo, verás que no coinciden. Eso es por ## ¿SHA-2 ó SHA-3? -La familia SHA-2 está **diseñada** por la NSA, la familia SHA-3 fue **escogida** por el NIST después de organizar una competición para definir el siguiente hash a utilizar +La familia SHA-2 fue **impuesta** por la NSA, la familia SHA-3 fue **escogida** por el NIST después de organizar una competición para definir el siguiente hash a utilizar El SHA-3 se ha desarrollado teniendo en cuenta la eficiencia y como backup en caso de encontrar vulnerabilidades en el SHA-2 (diseños totalmente diferentes) El SHA-2 hasta ahora ha sido sometido a un trabajo de análisis muy superior al SHA-3 y no se han encontrado ninguna vulnerabilidad + + ## Construcción Formas de construir una función de hash: @@ -306,7 +316,9 @@ En este curso no hacemos criptoanálisis, es decir, no rompemos cosas. Si estái Cifrando **el hash de un mensaje** con nuestra clave privada, aseguramos que ese mensaje lo hemos enviado nosotros y cualquier puede verificarlo -![center w:15em](https://upload.wikimedia.org/wikipedia/commons/7/78/Private_key_signing.svg) +![center w:10em](https://upload.wikimedia.org/wikipedia/commons/7/78/Private_key_signing.svg) + +Tenemos una presentación dedicada a [firma digital](A4-firmadigital.html) Firma digital de un mensaje = cifrado del hash de un mensaje con mi clave privada @@ -404,8 +416,7 @@ Hay modos de AES que utilizan estos esquemas: [AES-GCM](https://en.wikipedia.org - Usado en TLS - Vulnerable algún ataques de padding: [Padding Oracle, pentesterlab](https://book.hacktricks.xyz/crypto/padding-oracle-priv) -## Merkle Hash tree - + ## Blockchain ![w:30em center](images/blockchain/bc-transactions.png) -Tenemos todo un [tema para hablar de blockchain](03-blockchain.html) +Tenemos todo un [tema para hablar de blockchain](A3-blockchain.html) ## Aplicación: cadena de custodia