¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Firmas digitales y propiedad en una cadena

Después de esta lección: Puedo explicar cómo una firma demuestra quién envía un pago y comprobarla con la clave pública.

Lección de 65 min1 comandoLaboratorio de blockchain: una cadena de juguete en Python para leer, romper, minar y firmar

Una firma digital prueba quién envía un pago

Una firma digital es un valor que solo puede producir quien tiene una clave privada y que cualquiera puede comprobar con la clave pública. En una cadena, la firma demuestra que un pago lo envía el dueño de las cuentas.

Sin firma, cualquiera podría escribir "Ana paga 5 a Beto" en el libro. Con firma, solo Ana puede hacerlo. En esta lección verás una firma hecha solo con hashes.

Al final de esta lección

Nota

Puedo explicar cómo una firma demuestra quién envía un pago y comprobarla con la clave pública.

Palabras clave

PalabraQué significa
Clave privadael secreto que solo conoce el dueño
Clave públicalos datos que permiten comprobar sus firmas
Firmael valor que prueba que el dueño aprobó un mensaje
Firma de un solo usouna firma cuya clave no debe usarse más de una vez
Verificarcomprobar una firma con la clave pública

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Sin firma, cualquiera puede escribir un pago

Un libro de cuentas aplica los pagos que ve. No sabe si Ana los ha pedido de verdad.

La solución es que cada pago lleve la firma de quien paga. Cada persona tiene una clave privada, que guarda, y una clave pública, que reparte. Su clave pública hace de nombre de la cuenta.

Firmar revela un secreto de cada par

Esta firma, de Lamport, usa solo hashes. La clave privada son 256 pares de secretos. La pública es el hash de cada secreto.

Para firmar, calculas el hash del mensaje, que son 256 bits. Por cada bit revelas uno de los dos secretos del par: el primero si el bit es 0 y el segundo si es 1.

Para verificar, calculas el hash de cada secreto revelado y lo comparas con la clave pública.

Ejemplo: los cuatro primeros bits del mensaje

PosiciónBit del mensajeSe revelaSe comprueba con
00secreto 0 del par 0hash 0 del par 0
11secreto 1 del par 1hash 1 del par 1
20secreto 0 del par 2hash 0 del par 2
30secreto 0 del par 3hash 0 del par 3

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Qué imprime el laboratorio y en qué idioma

El script imprime en inglés. Dice "public key holds 256 pairs of hashes" y "signature holds 256 revealed secrets".

Luego verifica el mensaje firmado y el mismo mensaje con una letra cambiada, y escribe True o False tras "checks out".

Firma un mensaje y verifícalo

Comando
docker exec jupyter python3 steps/sign.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Mira los bits de dos mensajes casi iguales

Código: python
import hashlib

def bits(mensaje):
    huella = hashlib.sha256(mensaje.encode()).hexdigest()
    return bin(int(huella, 16))[2:].zfill(256)

a = bits("Ana paga 5 a Beto")
b = bits("Ana paga 6 a Beto")
print("primeros 8 bits:", a[:8], b[:8])

distintos = 0
for i in range(256):
    if a[i] != b[i]:
        distintos = distintos + 1
print("posiciones distintas:", distintos, "de 256")
# Cambia el 5 por otra cifra y mira si el número de posiciones distintas cambia.

Un error frecuente

Advertencia

Mucha gente cree que firmar es cifrar el mensaje para ocultarlo. No es así. El mensaje sigue a la vista. La firma solo demuestra que lo aprobó el dueño de la clave y que no ha cambiado desde entonces.

Esta clave solo firma una vez

Cada firma revela la mitad de los secretos. Si firmas un segundo mensaje, revelas más, y alguien podría juntar los secretos para firmar un tercero.

Por eso se llama de un solo uso. Es un juguete que muestra la idea. Los sistemas reales usan otras firmas, que se pueden repetir.

Para ir más lejos

Abre lamport.py en JupyterLab y lee sign y verify. Cada una cabe en tres líneas.

En el cuaderno, firma dos mensajes con la misma clave. Cuenta cuántos secretos se han revelado ya en total.

Sobre este laboratorio y su código: Laboratorio de blockchain: una cadena de juguete en Python para leer, romper, minar y firmar

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.