In che modo una chiave pubblica verifica una firma?


173

Sto cercando di capire meglio come funzionano le chiavi pubbliche / private. Comprendo che un mittente può aggiungere una firma digitale a un documento utilizzando la sua chiave privata per ottenere essenzialmente un hash del documento, ma ciò che non capisco è come la chiave pubblica può essere utilizzata per verificare tale firma.

La mia comprensione era che le chiavi pubbliche crittografano, le chiavi private decifrano ... qualcuno può aiutarmi a capire?


3
Bella domanda. :)
Suraj Jain,

Non volevo aggiungere questo come risposta e rischiare le fiamme che ne conseguono, ma se usi la parola "come" significa "come posso verificare una firma", allora una possibilità è scaricare gpg4win. Una volta installato, è possibile fare clic con il pulsante destro del mouse su un file e verificarlo. È una suite di prodotti che si integra nella shell di Windows. Una di queste utilità è Kleopatra che cercherà i certificati online per effettuare la convalida.
Newclique,

Risposte:


210

La tua comprensione di "crittografare le chiavi pubbliche, decrittografare le chiavi private" è corretta ... per ENCRYPTION di dati / messaggi. Per le firme digitali, è il contrario. Con una firma digitale, stai provando a dimostrare che il documento firmato da te proviene da te. Per farlo, devi usare qualcosa che solo TU possiedi: la tua chiave privata.

Una firma digitale nella sua descrizione più semplice è un hash (SHA1, MD5, ecc.) Dei dati (file, messaggio, ecc.) Che viene successivamente crittografato con la chiave privata del firmatario. Dal momento che è qualcosa che solo il firmatario ha (o dovrebbe avere) da dove proviene la fiducia. TUTTI hanno (o dovrebbero avere) accesso alla chiave pubblica del firmatario.

Quindi, per convalidare una firma digitale, il destinatario

  1. Calcola un hash degli stessi dati (file, messaggio, ecc.),
  2. Decodifica la firma digitale utilizzando la chiave PUBLIC del mittente e
  3. Confronta i 2 valori di hash.

Se corrispondono, la firma è considerata valida. Se non corrispondono, significa che è stata utilizzata una chiave diversa per firmarlo o che i dati sono stati modificati (intenzionalmente o non intenzionalmente).

Spero che aiuti!


13
La mia comprensione era che le chiavi non erano simmetriche ... cioè, gli oggetti crittografati con una chiave pubblica potevano essere decifrati dalla chiave privata, ma che questa relazione non funzionava inversamente ... più specificamente, non pensavo che gli oggetti crittografato con la chiave privata potrebbe essere decrittografato dalla chiave pubblica. Se è davvero così, allora questo risponde sicuramente alla mia domanda.
jcampos8782,

63
Le chiavi funzionano inversamente l'una con l'altra. Hai crittografato qualcosa con la tua chiave pubblica? Decifralo con la tua chiave privata. Al contrario, se hai crittografato qualcosa con la tua chiave privata, lo decifri con il tuo pubblico. Tale è la natura della crittografia asimmetrica.
Shadowman

20
Simmetrico significa solo che la stessa chiave viene utilizzata per crittografare / decrittografare. Assimetrico significa che una chiave crittografa e una chiave diversa decrittografa (e che è vero anche il contrario).
gtrig

8
@Jodimoro, tecnicamente un messaggio NON è "Segreto" se è crittografato con una chiave privata. Se è crittografato con una chiave privata, chiunque disponga della chiave "pubblica" pubblicamente disponibile può decrittografare il messaggio.
RayLoveless,

4
@Jodimoro L'unico motivo per cui l'hash è crittografato con una chiave privata in una firma è assicurarsi che l'hash non sia cambiato ... non per assicurarsi che sia "segreto".
RayLoveless,

72

Le chiavi funzionano inversamente:

Crittografia a chiave pubblica, decrittografia a chiave privata (crittografia):

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

Crittografia della chiave privata, decodifica della chiave pubblica (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

Di seguito è riportato uno script di esempio con cui testare l'intero flusso 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"

Questo script genera quanto segue:

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

2
Grazie per aver aggiunto la sceneggiatura - sicuramente aiutato a chiarire le cose.
Pat

Grazie mille, è sempre più facile per me capire con l'ecample
Simon,

16

La chiave pubblica crittografa e solo la chiave privata può decrittografarla e il contrario è vero. Entrambi crittografano in hash diversi ma ogni chiave può decrittografare la crittografia dell'altra.

Esistono diversi modi per verificare che un messaggio provenga da un mittente previsto. Per esempio:

Il mittente invia:

  1. Il messaggio

  2. L'hash del messaggio crittografato con la loro chiave privata

Il ricevente:

  1. Decodifica la firma (2) con la chiave pubblica per ottenere un messaggio, presumibilmente lo stesso messaggio di (1) ma non lo sappiamo ancora. Ora abbiamo due messaggi che dobbiamo verificare identici. Per fare ciò, li crittograferemo entrambi con la nostra chiave pubblica e confronteremo i due hash. Quindi lo faremo ....
  2. Crittografa il messaggio originale (1) con la chiave pubblica per ottenere un hash
  3. Crittografa il messaggio decrittografato (3) per ottenere un secondo hash e confrontalo con (4) per verificare che siano identici.

Se non sono identici significa che il messaggio è stato manomesso o è stato firmato con qualche altra chiave e non quella che pensavamo ...

Un altro esempio potrebbe essere che il mittente utilizzi un hash comune che potrebbe essere utilizzato anche dal destinatario. Per esempio:

Il mittente invia:

  1. Un messaggio
  2. Accetta un hash noto del messaggio, quindi crittografa l'hash con la chiave privata

Il ricevente:

  1. Decripta (2) e ottiene un valore di hash
  2. Hash il messaggio (1) con lo stesso hash utilizzato dal mittente
  3. Confronta i due hash per assicurarsi che corrispondano

Ciò garantisce nuovamente che il messaggio non sia stato manomesso e provenga dal mittente previsto.


6

Se dovessi riformulare la tua domanda da come la capisco, mi stai chiedendo quanto segue:

Se la crittografia a chiave pubblica garantisce che una chiave pubblica può essere derivata da una chiave privata, ma una chiave privata non può essere derivata da una chiave pubblica, allora potresti chiederti, come può una chiave pubblica decodificare un messaggio firmato con una chiave privata senza il mittente esporre al destinatario la chiave privata all'interno del messaggio firmato? (rileggilo alcune volte finché non ha senso)

Altre risposte hanno già spiegato come asimmetrici mezzi di crittografia che è possibile sia :

  1. Crittografia con chiave pubblica, decrittografia con chiave privata corrispondente (pseudocodice di seguito)
var msg = 'secret message';

var encryptedMessage = encrypt(pub_key, msg);

var decryptedMessage = decrypt(priv_key, encryptedMessage);

print(msg == decryptedMessage == 'secret message'); // True
  1. Crittografa con chiave privata, decodifica con chiave pubblica corrispondente (pseudocodice di seguito)
var msg = 'secret message';

var encryptedMessage = encrypt(priv_key, msg);

var decryptedMessage = decrypt(pub_key, encryptedMessage); // HOW DOES THIS WORK???

print(msg == decryptedMessage == 'secret message'); // True

Noi sappiamo che entrambe esempio # 1 e # 2 di lavoro. L'esempio n. 1 ha un senso intuitivo, mentre l'esempio n. 2 pone la domanda originale .

Si scopre che la crittografia della curva ellittica (chiamata anche "moltiplicazione della curva ellittica") è la risposta alla domanda originale. La crittografia con curva ellittica è la relazione matematica che rende possibili le seguenti condizioni:

  1. Una chiave pubblica può essere generata matematicamente da una chiave privata
  2. Una chiave privata non può essere generata matematicamente da una chiave pubblica (ovvero "funzione trapdoor")
  3. Una chiave privata può essere verificata da una chiave pubblica

Per la maggior parte, le condizioni n. 1 e n. 2 hanno senso, ma che dire del n. 3?

Hai due scelte qui:

  1. Puoi scendere in una tana di coniglio e passare ore e ore a imparare come funziona la crittografia a curva ellittica ( ecco un ottimo punto di partenza ) ... OPPURE ...
  2. Puoi accettare le proprietà sopra - proprio come accetti le 3 leggi del moto di Newton senza bisogno di derivarle tu stesso.

In conclusione, una coppia di chiavi pubblica / privata viene creata utilizzando la crittografia a curva ellittica, che per sua natura crea una chiave pubblica e privata che sono matematicamente collegate in entrambe le direzioni, ma non matematicamente derivate in entrambe le direzioni . Questo è ciò che ti consente di utilizzare la chiave pubblica di qualcuno per verificare che abbiano firmato un messaggio specifico, senza che ti espongano la chiave privata.


Le tue 3 condizioni spiegano tutto. Ho appena letto questa terme "curva ellittica" ans ero come wtf
Simon

5

Ho pensato di fornire una spiegazione supplementare per chiunque cerchi qualcosa di più intuitivamente rivelatore.

Una grande parte di questa confusione deriva dalla denominazione di "chiavi pubbliche" e "chiavi private" in quanto tali perché il modo in cui queste cose funzionano effettivamente è direttamente in contrasto con il modo in cui una "chiave" è intesa.

Prendi ad esempio la crittografia. Si potrebbe pensare che funzioni così:

  • Le parti che vogliono essere in grado di leggere i messaggi segreti mantengono ciascuna una chiave nascosta (ovvero una chiave privata)
  • Le parti che vogliono essere in grado di inviare messaggi segreti hanno tutti la possibilità di ottenere un blocco sbloccato (cioè un blocco pubblico)
  • Quindi inviare un messaggio segreto è facile come bloccarlo con un lucchetto sbloccato, ma sbloccarlo successivamente può essere fatto solo con una delle chiavi nascoste.

Ciò consente di inviare messaggi segreti tra le parti, ma da un punto di vista intuitivo qui, "blocco pubblico" è un nome più adatto di "chiave pubblica".

Tuttavia, per l'invio di firme digitali i ruoli sono alquanto invertiti:

  • La parte che desidera firmare i messaggi è l'unica con accesso ai blocchi sbloccati (ovvero un blocco privato)
  • Le parti che desiderano verificare la firma hanno tutte la possibilità di ottenere una chiave (ovvero una chiave pubblica)
  • Quindi ciò che fa il firmatario è creare due messaggi identici: quello che chiunque può leggere e quello che lo accompagna, ma che bloccano con uno dei loro blocchi privati.
  • Quindi, quando il destinatario riceve il messaggio, può leggerlo e quindi utilizzare la chiave pubblica per sbloccare il messaggio bloccato e confrontare i due messaggi. Se i messaggi sono uguali, sanno che:

    1. Il messaggio sbloccato non è stato manomesso durante il viaggio e,

    2. Il messaggio deve essere stato inviato dalla persona che ha il blocco corrispondente alla propria chiave pubblica.

  • E infine, l'intero sistema funziona solo se chiunque desideri convalidare la firma di un firmatario ha un posto autorevole dove andare per ottenere la chiave corrispondente ai blocchi del firmatario. Altrimenti, chiunque può dire "Ehi, ecco la chiave del blocco privato di così-così", ti mando un messaggio fingendo di esserlo ma bloccalo con il loro blocco privato, esegui tutti i passaggi precedenti e credi che il messaggio debba essere effettivamente dalla persona che hai pensato, ma sei ingannato perché sei stato fuorviato dal vero proprietario di una chiave pubblica.

Finché esiste una fonte degna di fiducia per il recupero della chiave pubblica di un firmatario, saprai chi è il legittimo proprietario di una chiave pubblica e sarai in grado di convalidare la sua firma.


4
Cambiare "chiave" in "blocco sbloccato" non fa che aumentare la confusione.
Marchese di Lorne,

@EJP Non cambio chiave in "blocco sbloccato". È stato modificato in "blocco". 'Sbloccato bloccato' viene utilizzato solo allo scopo di esprimere l'uso dell'oggetto. A proposito, questa è la tua opinione e se hai qualche esperienza a lungo termine nella community di criptovalute, è probabilmente estremamente distorto perché i termini esistenti sono come sei cresciuto per capire la tecnologia. Perché non permetti alle persone che stanno appena iniziando a determinare se l'analogia sia utile o no?
scarpa

1
Penso che l'analogia con le serrature e le chiavi sia abbastanza buona per fornire una prima comprensione di questa questione. Una volta visualizzati i blocchi e le chiavi, è possibile scambiarli con numeri interi diversi che vengono assemblati in chiavi rsa (o altro tipo di).
Andreas Lundgren,

Personalmente penso che questa intuizione sia la migliore, ho letto finora. E sicuramente vedere come l'aggiunta di lock invece di chiave a privato / pubblico rende l'intero sistema intuitivo autoesplicativo per i nuovi arrivati ​​regolari. Mentre al momento non lo è affatto. Siamo sviluppatori esperti (solo con nessun contatto diretto con la crittografia fino ad ora) e abbiamo discusso dello scopo di pubblico / privato per qualche tempo. Stavo dicendo che il privato è usato per crittografare, mentre stava dicendo che il pubblico è usato per crittografare: D
jayarjo

0

Alla tua domanda: stavo guardando l'implementazione di RSA. E ha ottenuto maggiore chiarezza sul modo in cui una chiave pubblica viene utilizzata per verificare la firma utilizzando una chiave privata. Indubbiamente, la chiave privata non è esposta. Ecco come ...

Il trucco qui è nascondere la chiave privata all'interno di una funzione. In questo caso,(p-1)*(q-1).

Considera p come chiave privata ed e come chiave pubblica. 'p' è incapsulato in un'altra funzione per renderlo nascosto.

E.g., `d = (p-1)(q-1); d * e = 1` (d is the inverse of e - public key)

Dati inviati = [crittografato (hash), messaggio] = [m ^ d, messaggio]; dove m è il messaggio Supponiamo che 'Dati inviati' = y Per verificare l'integrità troviamo y ^ e per ottenere m. Da allora m ^(d*e) = m ^1 = m.

Spero che questo ti aiuti! :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.