Skip to content

Commit

Permalink
Update exercises in hashes
Browse files Browse the repository at this point in the history
  • Loading branch information
Juanvvc committed Jun 6, 2024
1 parent db38e72 commit 442c02e
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 79 deletions.
114 changes: 52 additions & 62 deletions ejercicios/06/Hashes.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@
},
"source": [
"<font color=\"#f00\">\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",
Expand All @@ -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",
"</font>"
"</font>\n",
"\n",
"<P><FONT COLOR=\"#00F\">\n",
"RESPUESTA: texto de tu respuesta\n",
"</FONT></P>"
]
},
{
"cell_type": "markdown",
"source": [
"<font color=\"#00f\">\n",
"Respuesta\n",
"</font>"
],
"metadata": {
"id": "GugsIunmRyqQ"
},
"id": "GugsIunmRyqQ"
},
{
"cell_type": "markdown",
"id": "endless-minneapolis",
Expand Down Expand Up @@ -358,26 +350,19 @@
"id": "metric-advocacy"
},
"source": [
"<font color=\"#f00\">\n",
"Preguntas:\n",
"<p><font color=\"#f00\">\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",
"</font>"
"\n",
"</font></p>\n",
"\n",
"<p><font color=\"#00f\">\n",
"TU RESPUESTA: texto de tu respuesta\n",
"</font></p>\n"
]
},
{
"cell_type": "markdown",
"source": [
"<font color=\"#00f\">\n",
"Respuesta\n",
"</font>"
],
"metadata": {
"id": "QdDNGxCxSDgj"
},
"id": "QdDNGxCxSDgj"
},
{
"cell_type": "markdown",
"id": "d184e060",
Expand All @@ -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",
Expand Down Expand Up @@ -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",
Expand All @@ -459,23 +437,15 @@
"id": "9b1b6cca"
},
"source": [
"<font color=\"#f00\">\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",
"</font>"
"<p><font color=\"#f00\">\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",
"</font></p>\n",
"\n",
"<p><font color=\"#00f\">\n",
"TU RESPUESTA: texto de tu respuesta\n",
"</font></p>"
]
},
{
"cell_type": "markdown",
"source": [
"<font color=\"#00f\">\n",
"Respuesta\n",
"</font>"
],
"metadata": {
"id": "ZIJ1N46jSRNx"
},
"id": "ZIJ1N46jSRNx"
},
{
"cell_type": "markdown",
"id": "e130259f",
Expand Down Expand Up @@ -608,9 +578,13 @@
"id": "moral-exclusive"
},
"source": [
"Pregunta:\n",
"<p><font color=\"#f00\">\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",
"</font></p>\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?"
"<p><font color=\"#00f\">\n",
"TU RESPUESTA: texto de tu respuesta\n",
"</font></p>"
]
},
{
Expand Down Expand Up @@ -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."
]
Expand Down Expand Up @@ -694,6 +668,22 @@
"print(\"La firma es válida\")"
]
},
{
"cell_type": "markdown",
"source": [
"<p><font color=\"#f00\">\n",
"PREGUNTA: ¿Podrías detectar qué parte del mensaje ha cambiado mirando solo la firma electrónica?\n",
"</font></p>\n",
"\n",
"<p><font color=\"#00f\">\n",
"TU RESPUESTA: texto de tu respuesta\n",
"</font></p>"
],
"metadata": {
"id": "pQ0Irit-fLcY"
},
"id": "pQ0Irit-fLcY"
},
{
"cell_type": "markdown",
"id": "british-congress",
Expand Down
46 changes: 29 additions & 17 deletions slides/06-hashes.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,18 @@ Juan Vera del Campo - <[email protected]>
# 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

<!--
Hasta ahora hemos visto cómo ofrecer confidencialidad.
La firma digital nos permite ofrecer el resto de servicios,
pero para poder hacer firma digital tenemos que conocer qué son
las funciones de hash
-->

# Hoy hablamos de...
<!-- _class: cool-list toc -->
Expand Down Expand Up @@ -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

Expand All @@ -79,16 +86,17 @@ Todos estos son resúmenes, pero no son de utilidad en criptografía
<!--
Los bits de paridad o los CRC se utilizan mucho con protocolos que esperan errores: RS232, lectura de CDs, la parte de paridad de un RAID... Un código de detección/corrección de errores se puede entender también como un "resumen" del mensaje: si el resumen no coincide con lo recibido, entonces sabemos ue ha habido un error.
Pero estas funciones, en general, no sirven en criptografía: imagina que un atacante puede cambiar un mensaje y también su resumen. Entonces, ¡no nos sirve de nada validar que el resumen sea correcto!
Pero estas funciones, en general, no sirven en criptografía: por ejemplo, la función del bloque de paridad de un RAID 4 es poder reconstruir el documento original, que es algo que no queremos que sea posible en criptografía
-->

## Funciones de hash criptográficas
<!-- _class: with-info -->

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

Expand All @@ -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

Expand All @@ -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)
Expand All @@ -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
<!-- _class: with-success -->

Obvio: no puede existir una aplicación inyectiva entre un conjunto de $m$ elementos y otro de $n$ elementos si $m>n$
Expand Down Expand Up @@ -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

<!-- Para evitar dudas, en criptografía preferimos utilizar sistemas que han sido escogidos en vez de impuestos -->

## Construcción

Formas de construir una función de hash:
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
<!-- _class: smaller-font -->
<!-- ## Merkle Hash tree
Si un archivo gran cambia a menudo y hay que calcular su hash cada vez, llevará mucho tiempo
Expand All @@ -414,12 +425,13 @@ Solución: calcular hash solo de los bloques que cambien, y agruparlos en un ár
Permite firmar bases de datos, discos... de forma eficiente
![center w:35em](images/hashes/Hash_Tree.svg)
-->

## 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
<!-- _class: lead -->
Expand Down

0 comments on commit 442c02e

Please sign in to comment.