Pregunta ¿Cómo verifica una clave pública una firma?


Intentando obtener una mejor respuesta sobre cómo funcionan las claves públicas / privadas. Entiendo que un remitente puede agregar una firma digital a un documento usando su clave privada para esencialmente obtener un hash del documento, pero lo que no entiendo es cómo la clave pública se puede usar para verificar esa firma. Según entendí, las claves públicas se cifran, las claves privadas se descifran ... ¿Alguien puede ayudarme a comprender?


76
2017-08-15 16:29


origen


Respuestas:


Su comprensión de "cifrado de claves públicas, descifrado de claves privadas" es correcto ... para la ENCRIPTACIÓN de datos / mensaje. Para las firmas digitales, es al revés. Con una firma digital, está tratando de demostrar que el documento firmado por usted proviene de usted. Para hacer eso, necesita usar algo que solo USTED tiene: su clave privada.

Una firma digital en su descripción más simple es un hash (SHA1, MD5, etc.) de los datos (archivo, mensaje, etc.) que posteriormente se cifra con la clave privada del firmante. Como eso es algo que solo el firmante tiene (o debería tener) es de donde proviene la confianza. TODOS tienen (o deberían tener) acceso a la clave pública del firmante.

Entonces, para validar una firma digital, el destinatario

  1. Calcula un hash de los mismos datos (archivo, mensaje, etc.),
  2. Descifra la firma digital utilizando la clave PÚBLICA del remitente, y
  3. Compara los 2 valores hash.

Si coinciden, la firma se considera válida. Si no coinciden, significa que se utilizó una clave diferente para firmarlo o que los datos se han alterado (intencionalmente o no).

¡Espero que ayude!


120
2017-08-15 18:38



Como se indica en atn's respuesta, las claves funcionan de manera inversa.

Cifrado de clave pública, descifrado de clave privada (encriptación):

openssl rsautl -encrypt -inkey public.pem -pubin -in message.txt -out message.ssl
openssl rsautl -decrypt -inkey private.pem       -in message.ssl -out message.txt

Encriptación de clave privada, descifrado de clave pública (firma):

openssl rsautl -sign -inkey private.pem       -in message.txt -out message.ssl
openssl rsautl       -inkey public.pem -pubin -in message.ssl -out message.txt

A continuación se muestra un script de ejemplo para probar todo este flujo con openssl.

#!/bin/sh
# Create message to be encrypted
echo "Creating message file"
echo "---------------------"
echo "My secret message" > message.txt
echo "done\n"

# Create asymmetric keypair
echo "Creating asymmetric key pair"
echo "----------------------------"
openssl genrsa -out private.pem 1024
openssl rsa -in private.pem -out public.pem -pubout
echo "done\n"

# Encrypt with public & decrypt with private
echo "Public key encrypts and private key decrypts"
echo "--------------------------------------------"
openssl rsautl -encrypt -inkey public.pem -pubin -in message.txt         -out message_enc_pub.ssl
openssl rsautl -decrypt -inkey private.pem       -in message_enc_pub.ssl -out message_pub.txt
xxd message_enc_pub.ssl # Print the binary contents of the encrypted message
cat message_pub.txt # Print the decrypted message
echo "done\n"

# Encrypt with private & decrypt with public
echo "Private key encrypts and public key decrypts"
echo "--------------------------------------------"
openssl rsautl -sign    -inkey private.pem -in message.txt          -out message_enc_priv.ssl
openssl rsautl -inkey public.pem -pubin    -in message_enc_priv.ssl -out message_priv.txt
xxd message_enc_priv.ssl
cat message_priv.txt
echo "done\n"

Este script da como resultado lo siguiente:

Creating message file
---------------------
done

Creating asymmetric key pair
----------------------------
Generating RSA private key, 1024 bit long modulus
...........++++++
....++++++
e is 65537 (0x10001)
writing RSA key
done

Public key encrypts and private key decrypts
--------------------------------------------
00000000: 31c0 f70d 7ed2 088d 9675 801c fb9b 4f95  1...~....u....O.
00000010: c936 8cd0 0cc4 9159 33c4 9625 d752 5b77  .6.....Y3..%.R[w
00000020: 5bfc 988d 19fe d790 b633 191f 50cf 1bf7  [........3..P...
00000030: 34c0 7788 efa2 4967 848f 99e2 a442 91b9  4.w...Ig.....B..
00000040: 5fc7 6c79 40ea d0bc 6cd4 3c9a 488e 9913  _.ly@...l.<.H...
00000050: 387f f7d6 b8e6 5eba 0771 371c c4f0 8c7f  8.....^..q7.....
00000060: 8c87 39a9 0c4c 22ab 13ed c117 c718 92e6  ..9..L".........
00000070: 3d5b 8534 7187 cc2d 2f94 0743 1fcb d890  =[.4q..-/..C....
My secret message
done

Private key encrypts and public key decrypts
--------------------------------------------
00000000: 6955 cdd0 66e4 3696 76e1 a328 ac67 4ca3  iU..f.6.v..(.gL.
00000010: d6bb 5896 b6fe 68f1 55f1 437a 831c fee9  ..X...h.U.Cz....
00000020: 133a a7e9 005b 3fc5 88f7 5210 cdbb 2cba  .:...[?...R...,.
00000030: 29f1 d52d 3131 a88b 78e5 333e 90cf 3531  )..-11..x.3>..51
00000040: 08c3 3df8 b76e 41f2 a84a c7fb 0c5b c3b2  ..=..nA..J...[..
00000050: 9d3b ed4a b6ad 89bc 9ebc 9154 da48 6f2d  .;.J.......T.Ho-
00000060: 5d8e b686 635f b6a4 8774 a621 5558 7172  ]...c_...t.!UXqr
00000070: fbd3 0c35 df0f 6a16 aa84 f5da 5d5e 5336  ...5..j.....]^S6
My secret message
done

34
2017-11-01 15:17



Pensé que proporcionaría una explicación complementaria para cualquiera que busque algo más intuitivamente revelador.

Una gran parte de esta confusión surge al nombrar las "claves públicas" y las "claves privadas" como tales porque la forma en que funcionan realmente estas cosas está directamente en desacuerdo con la forma en que se entiende una 'clave'.

Tome el cifrado, por ejemplo. Podría pensarse que funciona así:

  • Las partes que desean poder leer los mensajes secretos mantienen una clave oculto (es decir, una clave privada)
  • Las partes que desean poder enviar mensajes secretos tienen la capacidad de obtener un bloqueo desbloqueado (es decir, un bloqueo público)
  • Entonces, enviar un mensaje secreto es tan fácil como bloquearlo con un candado desbloqueado, pero desbloquearlo luego solo se puede hacer con una de las teclas ocultas.

Esto permite que se envíen mensajes secretos entre las partes, pero desde un punto de vista intuitivo, 'bloqueo público' es un nombre más adecuado que 'clave pública'.

Sin embargo, para el envío de firmas digitales los roles son algo revertidos:

  • La parte que desea firmar mensajes es la única con acceso a los bloqueos desbloqueados (es decir, un bloqueo privado)
  • Las partes que desean verificar la firma tienen la capacidad de obtener una clave (es decir, una clave pública)
  • Entonces, lo que hace el firmante es crear dos mensajes idénticos: el que cualquiera puede leer y el otro que lo acompañe, pero que bloquean con uno de sus bloqueos privados.
  • Luego, cuando el receptor recibe el mensaje, puede leerlo y luego usar la clave pública para desbloquear el mensaje bloqueado y comparar los dos mensajes. Si los mensajes son iguales, entonces saben que:

    1. El mensaje desbloqueado no fue manipulado durante el viaje y,

    2. El mensaje debe haber sido de la persona que tiene el bloqueo correspondiente a su clave pública.

  • Y, por último, todo este sistema solo funciona si alguien que quiere validar la firma de un firmante tiene un lugar autorizado al que dirigirse para obtener la clave coincidente con los bloqueos del firmante. De lo contrario, cualquiera puede decir "hey, aquí está la clave para el bloqueo privado de tal", enviarle un mensaje haciéndose pasar por ellos pero bloquearlo con su bloqueo privado, realizar todos los pasos anteriores y creer que el mensaje debe ser realmente de la persona que pensaste, pero te engañaron porque fuiste engañado en cuanto al verdadero dueño de una clave pública.

Mientras exista una fuente digna de confianza para recuperar la clave pública de un firmante, sabrá quién es el legítimo propietario de una clave pública y podrá validar su firma.


0
2018-03-02 21:37