Como é que uma chave pública verifica uma assinatura?

Estou a tentar perceber melhor como funcionam as chaves públicas e privadas. Compreendo que um remetente possa adicionar uma assinatura digital a um documento usando a sua chave privada para essencialmente obter uma hash do documento, mas o que não entendo é como a chave pública pode ser usada para verificar essa assinatura.

Pelo que sei, as chaves públicas encriptam, as privadas descodificam... alguém me pode ajudar a entender?

Author: Peter Mortensen, 2013-08-15

3 answers

O seu entendimento de" encriptação de chaves públicas, descodificação de chaves privadas " está correcto... para encriptação de dados / mensagens. Para as assinaturas digitais, é o contrário. Com uma assinatura digital, está a tentar provar que o documento assinado por si veio de si. Para fazer isso, você precisa usar algo que só você tem: sua chave privada.

Uma assinatura digital na sua descrição mais simples é um hash (SHA1, MD5, etc.) dos dados (ficheiro, mensagem, etc.) que é posteriormente encriptado com a chave privada do Assinante. Uma vez que isso é algo que só o signatário tem (ou deve ter) que é de onde a confiança vem. Todos têm (ou devem ter) acesso à chave pública do signatário.

Assim, para validar uma assinatura digital, o destinatário

  1. calcula um hash dos mesmos dados (ficheiro, mensagem, etc.),
  2. decifra a assinatura digital usando a chave pública do remetente, e
  3. compara os 2 valores de hash.

Se coincidirem, a Assinatura é considerado válido. Se eles não coincidem, ou significa que uma chave diferente foi usada para assiná-lo, ou que os dados foram alterados (intencionalmente ou não).

Espero que isso ajude!
 126
Author: Shadowman, 2018-01-28 13:26:58

Como indicado na resposta de atn , as chaves funcionam inversamente.

Encriptação de Chaves Públicas, descodificação de chaves privadas (encriptação):

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

Encriptação de chaves privadas, descodificação de chaves públicas (assinatura):

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

Abaixo está um exemplo de script para testar todo este fluxo com 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 programa produz o seguinte:

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  [email protected].<.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
 35
Author: Jaakko, 2017-05-23 12:02:56
Pensei em dar uma explicação suplementar para quem procura algo mais intuitivamente Revelador.

Uma grande parte desta confusão surge de nomear 'chaves públicas' e' chaves privadas 'como tal, porque como estas coisas realmente funcionam está directamente em desacordo com a forma como uma' chave ' é entendida como sendo.

Veja a encriptação, por exemplo. Pode-se pensar que funciona assim:

    As partes que querem ser capazes de ler as mensagens secretas guardam um chave escondido (isto é, uma chave privada)
  • as partes que querem ser capazes de enviar mensagens secretas todas têm a capacidade de obter uma fechadura desbloqueada (isto é, uma fechadura pública)
  • Então, enviar uma mensagem secreta é tão fácil como trancá-la com uma fechadura desbloqueada, mas desbloqueá-la depois só pode ser feita com uma das chaves escondidas.
Isto permite que mensagens secretas sejam enviadas entre as partes, mas do ponto de vista intuitivo aqui, 'bloqueio público' é um nome mais adequado do que 'Público'. chave. No entanto, para o envio de assinaturas digitais, os papéis estão um pouco invertidos:
    A parte que quer assinar mensagens é a única com acesso às fechaduras desbloqueadas (isto é, uma fechadura privada).
  • as partes que querem verificar a Assinatura têm a capacidade de obter uma chave (isto é, uma chave pública)
  • Então o que o signatário faz é criar duas mensagens idênticas: aquela que qualquer um pode ler e uma para acompanhá-la, mas que bloqueiam com uma das suas Fechaduras privadas.
  • Depois, quando o receptor recebe a mensagem, pode lê-la e usar a chave pública para desbloquear a mensagem bloqueada e comparar as duas mensagens. Se as mensagens são as mesmas, então eles sabem que:
    1. A mensagem desbloqueada não foi adulterada durante a viagem e,

    2. A mensagem deve ter sido da pessoa que tem a fechadura correspondente à sua chave pública.

  • E finalmente, todo este sistema só funciona se alguém quiser validar a assinatura de um assinante tem um lugar autorizado para ir buscar a chave correspondente às fechaduras do Assinante. Caso contrário, qualquer pessoa pode dizer "Ei, aqui está a chave para o assim-e-assim privada de bloqueio", enviar-lhe uma mensagem fingindo ser eles, mas bloqueá-lo com seus privado de bloqueio, você pode executar todos os passos acima e acreditar que a mensagem deve ser realmente a pessoa que você pensou, mas você está enganado, porque você estava em erro quanto ao verdadeiro proprietário de uma chave pública.

Então ... desde que haja uma fonte digna de confiança para recuperar a chave pública de um assinante, saberá quem é o legítimo dono de uma chave pública e será capaz de validar a sua assinatura.
 0
Author: shoe, 2018-03-02 21:37:53