Cum verifică o cheie publică o semnătură? (Programare, Semnătură Digitală, Criptare Cu Cheie Publică, Cheie Privată, Cheie Publică, Pki)

jcampos8782 a intrebat.

Încerc să înțeleg mai bine cum funcționează cheile publice/private. Înțeleg că un expeditor poate adăuga o semnătură digitală la un document folosind cheia sa privată pentru a obține, în esență, un hash al documentului, dar ceea ce nu înțeleg este cum poate fi folosită cheia publică pentru a verifica acea semnătură.

Am înțeles că cheile publice criptează, iar cheile private decriptează… Mă poate ajuta cineva să înțeleg?

Comentarii

  • Bună întrebare. 🙂 –  > Por Suraj Jain.
  • Nu am vrut să adaug acest lucru ca răspuns și să risc flăcările care vor urma, dar dacă folosirea cuvântului „cum” înseamnă de fapt „cum pot verifica o semnătură”, atunci o posibilitate este să descărcați gpg4win. Odată instalat, puteți face clic dreapta pe un fișier și îl puteți verifica. Este o suită de produse care se integrează în shell-ul Windows. Un astfel de utilitar este Kleopatra, care va căuta certificate online pentru a face validarea. –  > Por Newclique.
6 răspunsuri
Shadowman

Înțelegerea ta despre „cheile publice criptează, cheile private decriptează” este corectă… pentru ENCRIPTAREA datelor/messajelor. Pentru semnăturile digitale, este invers. Cu o semnătură digitală, încercați să dovediți că documentul semnat de dvs. a venit de la dvs. Pentru a face acest lucru, trebuie să folosiți ceva ce numai Dvs. aveți: cheia dvs. privată.

În cea mai simplă descriere, o semnătură digitală este un hash (SHA1, MD5 etc.) al datelor (fișier, mesaj etc.) care este ulterior criptat cu cheia privată a semnatarului. Deoarece acesta este un lucru pe care doar semnatarul îl are (sau ar trebui să îl aibă), de aici vine încrederea. TOATĂ lumea are (sau ar trebui să aibă) acces la cheia publică a semnatarului.

Așadar, pentru a valida o semnătură digitală, destinatarul

  1. Calculează un hash al acelorași date (fișier, mesaj etc.),
  2. decriptează semnătura digitală folosind cheia PUBLICĂ a expeditorului și
  3. compară cele două valori hash.

Dacă acestea corespund, semnătura este considerată validă. Dacă nu se potrivesc, înseamnă fie că a fost folosită o cheie diferită pentru a semna, fie că datele au fost modificate (fie intenționat, fie neintenționat).

Sper că acest lucru vă ajută!

Comentarii

    15

  • Eu am înțeles că cheile nu sunt simetrice… adică obiectele criptate cu o cheie publică pot fi decriptate cu cheia privată, dar că această relație nu funcționează invers… mai exact, nu am crezut că obiectele criptate cu cheia privată pot fi decriptate cu cheia publică. Dacă acesta este într-adevăr cazul, atunci acest lucru răspunde cu siguranță la întrebarea mea. –  > Por jcampos8782.
  • 75

  • Cheile funcționează invers una față de cealaltă. Ați criptat ceva cu cheia dvs. publică? Descifrează-l cu cheia ta privată. Invers, dacă ai criptat ceva cu cheia ta privată, îl decriptezi cu cheia ta publică. Aceasta este natura criptografiei asimetrice. –  > Por Shadowman.
  • 26

  • Simetrică înseamnă doar că se folosește aceeași cheie pentru criptare/decriptare. Asimetrică înseamnă că o cheie criptează și o altă cheie decriptează (și că și invers este valabil). –  > Por gtrig.
  • @Jodimoro, Din punct de vedere tehnic, un mesaj NU este „Secret” dacă este criptat cu o cheie privată. Dacă este criptat cu o cheie privată, oricine cu cheia „publică” disponibilă public poate decripta mesajul. –  > Por RayLoveless.
  • @Jodimoro Singurul motiv pentru care hash-ul este criptat cu o cheie privată într-o semnătură este pentru a se asigura că hash-ul nu este modificat… nu pentru a se asigura că este „secret”. –  > Por RayLoveless.
Jaakko

Cheile funcționează invers:

Cheia publică criptează, cheia privată decriptează (criptează):

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

Cheia privată criptează, cheia publică decriptează (semnare):

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

Mai jos este un exemplu de script pentru a testa acest întreg flux cu openssl.

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

# 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
"

# 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
"

# 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
"

Acest script produce următoarele rezultate:

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

Comentarii

  • Vă mulțumim pentru adăugarea scriptului – cu siguranță a ajutat la clarificarea lucrurilor. –  > Por Pat.
  • Mulțumesc foarte mult, întotdeauna îmi este mai ușor să înțeleg cu ajutorul unui exemplu –  > Por Simon.
wueb

Cheia publică criptează și numai cheia privată o poate decripta, iar invers este adevărat. Ambele criptează în hashes diferite, dar fiecare cheie poate decripta criptarea celeilalte.

Există câteva modalități diferite de a verifica dacă un mesaj provine de la un anumit expeditor așteptat. De exemplu:

Expeditorul trimite:

  1. Mesajul

  2. hash-ul mesajului criptat cu cheia sa privată

Destinatarul:

  1. Decriptează semnătura (2) cu cheia publică pentru a obține un mesaj, care se presupune că este același mesaj ca și (1), dar nu știm încă. Acum avem două mesaje despre care trebuie să verificăm dacă sunt identice. Pentru a face acest lucru, le vom cripta pe amândouă cu cheia noastră publică și vom compara cele două hashes. Deci, vom ….
  2. Criptați mesajul original (1) cu cheia publică pentru a obține un hash.
  3. vom cripta mesajul decriptat (3) pentru a obține un al doilea hash și îl vom compara cu (4) pentru a verifica dacă sunt identice.

Dacă nu sunt identice, înseamnă că fie mesajul a fost falsificat, fie a fost semnat cu o altă cheie și nu cu cea pe care o credeam…

Un alt exemplu ar fi ca expeditorul să folosească un hash comun pe care receptorul ar putea ști că îl folosește și el. De exemplu:

Expeditorul trimite:

  1. un mesaj
  2. Ia un hash cunoscut al mesajului, apoi criptează hash-ul cu cheia privată.

Receptorul:

  1. Decriptează (2) și obține o valoare hash.
  2. Anulează mesajul (1) cu același hash folosit de expeditor.
  3. Compară cele două hash-uri pentru a se asigura că se potrivesc.

Acest lucru asigură din nou că mesajul nu a fost falsificat și că provine de la expeditorul așteptat.

Comentarii

  • Cum ar putea pasul 5 din primul exemplu, hash-ul unui mesaj deja hașurat, să genereze același hash ca și pasul 4? –  > Por Kok How Teh.
Zach Gollwitzer

Dacă ar trebui să reformulez întrebarea dumneavoastră din modul în care am înțeles-o, întrebați următoarele:

Dacă criptografia cu cheie publică asigură că o cheie publică poate poate fi derivată dintr-o cheie privată, dar o cheie privată nu poate poate fi derivată dintr-o cheie publică, atunci vă puteți întreba, cum poate o cheie publică decripta un mesaj semnat cu o cheie privată fără ca expeditorul să expună destinatarului cheia privată din mesajul semnat? (recitiți acest lucru de câteva ori până când are sens)

Alte răspunsuri au explicat deja cum asimetric înseamnă că criptografia asimetrică înseamnă că puteți fie:

  1. criptați cu cheia publică, decriptați cu cheia privată corespunzătoare (pseudocod de mai jos)
var msg = 'secret message';

var encryptedMessage = encrypt(pub_key, msg);

var decryptedMessage = decrypt(priv_key, encryptedMessage);

print(msg == decryptedMessage == 'secret message'); // True
  1. criptarea cu cheia privată, decriptarea cu cheia publică corespunzătoare (pseudocod de mai jos)
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 știm că că atât exemplul nr. 1, cât și exemplul nr. 2 funcționează. Exemplul nr. 1 are un sens intuitiv, în timp ce exemplul nr. 2 ridică întrebarea întrebarea inițială.

Se pare că, criptografia cu curbă eliptică (numită și „multiplicare cu curbă eliptică”) este răspunsul la întrebarea inițială. Criptografia cu curbă eliptică este relația matematică care face posibile următoarele condiții:

  1. O cheie publică poate fi generată matematic dintr-o cheie privată
  2. O cheie privată nu poate fi să fie generată matematic dintr-o cheie publică (adică „funcția trapdoor”).
  3. O cheie privată poate fi verificată de o cheie publică

Pentru cei mai mulți, condițiile nr. 1 și nr. 2 au sens, dar cum rămâne cu nr. 3?

Aveți două opțiuni aici:

  1. Puteți să vă băgați într-o gaură de iepure și să petreceți ore întregi învățând cum funcționează criptografia cu curbă eliptică (aici este un bun punct de plecare)… SAU…
  2. Puteți accepta proprietățile de mai sus – la fel cum acceptați cele 3 legi ale mișcării ale lui Newton fără a fi nevoie să să derivați să le faci tu însuți.

În concluzie, o pereche de chei publice/private este creată folosind criptografia cu curbă eliptică, care prin natura sa, creează o cheie publică și una privată care sunt matematic legate matematic în ambele direcții, dar nu și matematic. derivate matematic. în ambele direcții. Acest lucru vă permite să utilizați cheia publică a cuiva pentru a verifica dacă a semnat un anumit mesaj, fără ca acesta să vă expună cheia sa privată.

Comentarii

  • Cele 3 condiții ale dumneavoastră explică totul. Tocmai am citit acest termen „curbă eliptică” și m-am întrebat: wtf –  > Por Simon.
pantof

M-am gândit să ofer o explicație suplimentară pentru oricine caută ceva mai intuitiv revelator.

O mare parte din această confuzie rezultă din denumirea de „chei publice” și „chei private” ca atare, deoarece modul în care aceste lucruri funcționează de fapt este în contradicție directă cu modul în care se înțelege că este o „cheie”.

Să luăm ca exemplu criptarea. Ar putea fi gândită ca funcționând astfel:

  • Părțile care doresc să poată citi mesajele secrete păstrează fiecare o cheie ascunsă (adică o cheie privată).
  • Părțile care doresc să poată trimite mesaje secrete au toate capacitatea de a obține o cheie blocată (adică o cheie publică).
  • În acest caz, trimiterea unui mesaj secret este la fel de simplă ca și cum l-ai bloca cu o încuietoare deblocată, dar deblocarea lui ulterioară se poate face numai cu una dintre cheile ascunse.

Acest lucru permite trimiterea de mesaje secrete între părți, dar, din punct de vedere intuitiv aici, „încuietoare publică” este un nume mai potrivit decât „cheie publică”.

Cu toate acestea, pentru trimiterea de semnături digitale, rolurile sunt oarecum inversate:

  • Partea care dorește să semneze mesaje este singura care are acces la încuietorile deblocate (adică la o încuietoare privată).
  • părțile care doresc să verifice semnătura au toate posibilitatea de a obține o cheie (adică o cheie publică).
  • Apoi, ceea ce face semnatarul este să creeze două mesaje identice: unul pe care oricine îl poate citi și unul care să îl însoțească, dar pe care îl blochează cu una dintre încuietorile sale private.
  • Apoi, atunci când receptorul primește mesajul, îl poate citi, iar apoi poate folosi cheia publică pentru a debloca mesajul blocat și pentru a compara cele două mesaje. Dacă mesajele sunt identice, atunci ei știu acest lucru:

    1. mesajul deblocat nu a fost modificat în timpul călătoriei și,

    2. Mesajul trebuie să provină de la persoana care are cheia publică care se potrivește cu cheia sa publică.

  • În cele din urmă, întregul sistem funcționează numai dacă oricine dorește să valideze semnătura unui semnatar are un loc autorizat unde să se adreseze pentru a obține cheia corespunzătoare la încuietorile semnatarului. În caz contrar, oricine poate spune „Hei, iată cheia de la lacătul privat al lui așa și așa”, vă poate trimite un mesaj pretinzând că este el, dar îl blochează cu lacătul său privat, dumneavoastră efectuați toți pașii de mai sus și credeți că mesajul trebuie să provină de fapt de la persoana pe care ați crezut-o, dar ați fost păcălit pentru că ați fost indus în eroare în ceea ce privește adevăratul proprietar al unei chei publice.

Atâta timp cât există o sursă demnă de încredere pentru recuperarea cheii publice a unui semnatar, veți ști cine este proprietarul de drept al unei chei publice și veți putea valida semnătura acestuia.

Comentarii

  • Schimbarea cuvântului „cheie” cu „încuietoare deblocată” nu face decât să sporească confuzia. –  > Por user207421.
  • @EJP Eu nu schimb cheia în ‘unlocked lock’. Se schimbă în ‘blocare’. ‘Unlocked locked’ se folosește doar în scopul exprimării utilizării obiectului. Regardles, aceasta este opinia ta, iar dacă ai o experiență pe termen lung în comunitatea cripto, este probabil extrem de părtinitoare, deoarece termenii existenți sunt modul în care ai ajuns să înțelegi tehnologia. De ce nu îi lăsați pe cei care sunt la început să stabilească dacă analogia este sau nu utilă? –  > Por pantof.
  • Cred că analogia cu încuietorile și cheile sunt destul de bune pentru a oferi o primă înțelegere a acestei chestiuni. Odată ce vizualizați încuietorile și cheile, acestea pot fi schimbate diferite numere întregi care sunt asamblate la cheile rsa (sau alt tip de chei). –  > Por Andreas Lundgren.
  • Personal, cred că această perspectivă este cea mai bună, pe care am citit-o până acum. Și cu siguranță văd cum adăugarea lacătului în loc de cheie la privat/public face ca întregul sistem să fie intuitiv și autoexplicativ pentru noii veniți obișnuiți. În timp ce în prezent nu este deloc așa. Suntem dezvoltatori experimentați (doar că nu am avut contact direct cu criptografia până acum) și ne-am certat de ceva timp cu privire la scopul public/privat. Eu spuneam că private este folosit pentru a cripta, în timp ce el spunea că public este folosit pentru a cripta 😀 -.  > Por jayarjo.
George John

La întrebarea ta – mă uitam la implementarea RSA. Și am obținut mai multă claritate asupra modului în care o cheie publică este folosită pentru a verifica semnătura cu ajutorul unei chei private. Fără îndoială, cheia privată nu este expusă. Iată cum…

Șmecheria aici este de a ascunde cheia privată într-o funcție. În acest caz, (p-1)*(q-1).

considerăm că p este cheia privată și e este cheia publică. ‘p’ este încapsulată într-o altă funcție pentru a fi ascunsă.

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

Date trimise = [criptat(hash), mesaj] = [m ^d, mesaj]; unde m este mesajulSupunem că „Date trimise” = yPentru a verifica integritatea găsim y ^e pentru a obține m. Deoarece m ^(d*e) = m ^1 = m.

Sper că acest lucru vă ajută! 🙂