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 -