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
| Palabra | Qué significa |
|---|---|
| Clave privada | el secreto que solo conoce el dueño |
| Clave pública | los datos que permiten comprobar sus firmas |
| Firma | el valor que prueba que el dueño aprobó un mensaje |
| Firma de un solo uso | una firma cuya clave no debe usarse más de una vez |
| Verificar | comprobar 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ón | Bit del mensaje | Se revela | Se comprueba con |
|---|---|---|---|
| 0 | 0 | secreto 0 del par 0 | hash 0 del par 0 |
| 1 | 1 | secreto 1 del par 1 | hash 1 del par 1 |
| 2 | 0 | secreto 0 del par 2 | hash 0 del par 2 |
| 3 | 0 | secreto 0 del par 3 | hash 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
docker exec jupyter python3 steps/sign.pySe 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
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.