Como é que uma chave pública verifica uma assinatura?
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
- calcula um hash dos mesmos dados (ficheiro, mensagem, etc.),
- decifra a assinatura digital usando a chave pública do remetente, e
- 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!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
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.
- 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:
A mensagem desbloqueada não foi adulterada durante a viagem e,
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.