Puncte:7

Putem alege ce cheie este privată sau publică în criptarea asimetrică? Cheile chiar criptează și decriptează un text cifrat?

drapel in

M-ați putea ajuta să înțeleg mai bine cum funcționează perechea de chei în criptarea asimetrică?

Studiez mai întâi criptografia la nivel de suprafață. În timp ce citesc mai multe texte și vorbesc cu colegii, încă nu sunt sigur de două lucruri.

  1. După generarea unei perechi de chei, putem alege ce cheie va fi privată sau publică? Prima mea presupunere a fost că putem, dar după ce am citit despre algoritmi se pare că nu putem, din motive matematice cum sunt generate cheile, prin urmare doar una dintre chei poate fi privată.

  2. Criptăm sau decriptăm un Cipher Text cu o anumită cheie? Este corect din punct de vedere tehnic să spui așa? Sau poate că acesta este doar un fel de proces de verificare și algoritmul este ceea ce amestecă un mesaj?

Este corect să spunem că:

Având această pereche de chei, pot cripta un mesaj cu cheia mea privată și apoi îl pot publica. Faptul că oricine poate decripta mesajul cu cheia mea publică înseamnă că l-am criptat cu cheia mea privată, ceea ce înseamnă că trebuie să fi fost eu cel care am făcut mesajul, deoarece doar eu am cheia mea privată. Criptarea datelor cu cheia privată a expeditorului numim un format de mesaj deschis, deoarece oricine are o copie a cheii publice corespunzătoare poate decripta mesajul.

DannyNiu avatar
drapel vu
Am adunat această întrebare în [lista noastră de citire](https://crypto.meta.stackexchange.com/a/1523/36960) sper că nu vă deranjează.
Tomasz Nazarenko avatar
drapel in
Pentru a adăuga, există o întrebare de la Security Stack Exchange care m-a ajutat să obțin ideile. Lipesc linkul, deoarece cineva ar putea găsi util https://security.stackexchange.com/questions/81760/what-happens-when-encrypting-with-private-key
drapel mx
Citatului de la sfârșitul întrebării lipsește orice context. Scrie „această pereche de chei”, dar nu avem idee despre ce pereche de chei este vorba. Deci, nu putem spune dacă declarația făcută este corectă sau nu pentru perechea de chei la care se referea. Ar putea fi sau nu. Cum am putea ști?
jjj avatar
drapel cn
jjj
În general, ambele chei pot fi de o formă diferită (cum ar fi curbele eliptice, punct și număr), astfel încât acantul să fie schimbat. Probabil vă referiți la RSA (unde pot fi schimbate), vă rugăm să adăugați această etichetă la întrebarea dvs.
Puncte:21
drapel vu

Nu Nu NU! Nu poți alege ce cheie este privată și care publică. Acest fals sentiment de libertate se datorează

  1. oamenii nu înțeleg că criptografia cu cheie publică este diferită conceptual de cifrurile și
  2. cel mai popular algoritm cu cheie publică RSA fiind o permutare bijectivă.

Cu logaritmul discret, de exemplu, cheia dumneavoastră privată este întotdeauna un număr întreg scalar, iar cheia publică este întotdeauna puterea. Criptarea și schimbul de chei sunt construite din formula de tip Diffie-Hellman, iar semnătura digitală din proprietățile asociative și comutative ale aritmeticii scalare.

Există și alte criptosisteme cu cheie publică (în special post-cuantică) în care perechea de chei de criptare/decriptare este incompatibilă din punct de vedere matematic cu cheia de semnare/verificare a criptosistemului bazat pe aceeași familie de primitive matematice.

fgrieu avatar
drapel ng
Adăugare: chiar și în RSA așa cum este practicat, nu există libertatea de a alege ce cheie este publică și care este privată. În mod obișnuit, unul dintre cele două are un exponent mic (adesea 65537). _trebuie_ să fie cheia publică. Dacă ar fi cheia privată, cealaltă ar fi cheia publică, deci publică, astfel cunoscută adversarilor, și toată securitatea ar fi pierdută, pentru că ar fi banal să găsim ambele chei și să factorizezi modulul public.
fgrieu avatar
drapel ng
În plus, în ceea ce privește Q2: când există o cheie publică și una privată și este implicată criptarea, criptăm cu cheia publică și decriptăm cu cheia privată; nu există excepție. Afirmațiile contrare pot confunda criptarea și semnătura: semnăm cu cheia privată și verificăm cu cheia publică; nu există nici o excepție.
drapel cn
@fgrieu Diferența este că pentru RSA, așa cum este definit în mod obișnuit, „doar” rupeți securitatea. Pentru multe alte PKE sunt obiecte complet diferite și schimbarea lor nu ar avea nici măcar sens din punct de vedere matematic.
fgrieu avatar
drapel ng
@Maeher: într-adevăr! Reafirmam că răspunsul la Q1 este negativ, iar RSA (așa cum este practicat) nu face excepție.
ilkkachu avatar
drapel ws
@fgrieu, dar folosirea lui 65537 este doar un obicei, nu? Ai putea crea de ex. un certificat cu un exponent de criptare arbitrar (`openssl req -x509 -newkey rsa:4096 -pkeyopt rsa_keygen_pubexp:12345653`). Nu sunt sigur dacă vreun program va cânta la asta sau dacă alte contexte codifică efectiv exponentul.
fgrieu avatar
drapel ng
@ikkachu: da poți, iar majoritatea programelor moderne vor accepta certificatul și va fi sigur.Dar totuși, schimbarea $e$ și $d$ nu va fi sigură, deoarece după acea schimbare va rămâne ușor să găsiți $d$ (valoarea neobișnuită a $e$) și factorul $n$ având în vedere cheia publică. Acest lucru funcționează cu $e$ neobișnuit până la aproximativ $n^{0.292\ldots}$ din cauza [un atac al lui Boneh și Durfee](https://doi.org/10.1007/3-540-48910-X_1). De asemenea, openSSL va pune doar $e$ în cheia privată.
Puncte:10
drapel ar

După generarea unei perechi de chei, putem alege ce cheie va fi privată sau publică?

Nu, în general nu putem. Pentru cele mai multe criptosisteme asimetrice cheile private și publice sunt tipuri complet diferite de obiecte (de exemplu, unul poate fi un număr, iar celălalt un punct pe o curbă eliptică) și nu există nicio modalitate de a folosi unul în locul celuilalt.

Există, totuși, o cvasi-excepție notabilă: the Criptosistem RSA are chei publice și private care poate fi reprezentat ca același tip de obiect (un modul și un exponent) și utilizat în aceeași operație matematică (exponentiație modulară) pentru a cripta și decripta mesajele. Asa de, teoretic, s-ar putea genera o pereche de taste RSA „simetrică” (așa cum este descris în această întrebare) și apoi alegeți ce jumătate să publicați și ce jumătate să păstrați privată.

În practică, totuși, chiar și generarea de chei RSA nu funcționează în acest fel, din câteva motive:

  • Este mai eficient să alegeți exponentul public să fie un număr mic fix cu o formă simplă în binar. (Alegerile comune sunt 3 și 65537 = 216 + 1.) Acest lucru este sigur de făcut pentru cheia publică, dar ar fi, evident, dezastruos de nesigur pentru cheia privată (deoarece exponentul este singura parte secretă a cheii private – modulul este același pentru ambele jumătăți ale cheii private). pereche de chei).

  • Există modalități de a accelera operațiunile cu cheia privată RSA (adică decriptarea sau semnarea) utilizând trucuri matematice suplimentare, cum ar fi Teorema chineză a restului, dar acestea necesită informații suplimentare despre modul în care au fost generate cheile (cum ar fi factorii primi secreti ai modulului). Stocarea acestor informații suplimentare alături de cheia privată nu este nicio problemă, iar formatele de chei private RSA cele mai frecvent utilizate chiar o fac. Dar publicarea acestuia ar permite oricui să spargă perechea de chei și să decripteze și/sau să falsifice mesaje.

Rezultatul tuturor acestor lucruri este că, în practică, este posibil să se calculeze o cheie publică RSA din cheia privată, dar nu invers. După cum spune răspunsul legat (pe care l-am scris) pe security.SE, teoretic ar fi posibil să se genereze o cheie RSA privată securizată din care cheia publică nu poate fi calculată, dar acest lucru ar necesita utilizarea atât a unui algoritm de generare a cheilor nestandard, cât și a unui algoritm nestandard. format de stocare a cheii private. Și chiar dacă problemele de format ar fi rezolvate, nu toate implementările RSA ar funcționa cu astfel de chei private (din cauza lipsei informațiilor suplimentare menționate mai sus).


Criptăm sau decriptăm un Cipher Text cu o anumită cheie? Este corect din punct de vedere tehnic să spui așa?

Un fel, da. Dar ce noi de obicei do este generarea unei chei aleatorii pentru a cifru simetric precum AES, criptați textul simplu cu asta și apoi criptați cheia AES utilizând algoritmul de criptare asimetrică și cheia publică a destinatarului vizat. Și apoi trimitem atât textul cifrat AES, cât și cheia AES criptată asimetric către destinatar, care poate decripta mai întâi cheia AES și apoi textul cifrat.

Motivul principal pentru a folosi astfel criptare hibridă este că cifrurile simetrice precum AES sunt proiectate pentru a cripta rapid multe date, în timp ce sistemele asimetrice nu sunt:

  • Criptarea asimetrică tinde să fie relativ lentă – adesea de zeci sau sute sau mii de ori mai lentă decât criptarea aceleiași cantități de date cu un cifru simetric rapid precum AES. Decriptarea asimetrică este adesea și mai lentă (în timp ce decriptarea AES este de obicei la fel de rapidă ca și criptarea).

  • Toate schemele sigure de criptare asimetrică produc text cifrat mai lung decât textul simplu, din cauza necesității de a injecta o anumită aleatorie în procesul de criptare pentru a preveni atacurile de ghicire. Unele (cum ar fi ElGamal-like schemes) va dubla lungimea textului simplu (după ce îl completează până la dimensiunea blocului de mesaje). Altele, cum ar fi RSA, necesită completarea textului simplu de până la zeci de ori lungimea inițială. Evident, acest lucru nu este de dorit atunci când se criptează cantități mari de date. Între timp, cifrurile simetrice, cum ar fi AES, adaugă în general doar câteva zeci de octeți de date suplimentare textului cifrat, indiferent de lungimea acestuia (în funcție de modul de operare).

  • În general, schemele de criptare asimetrică pur și simplu nu sunt concepute pentru a cripta mesaje mai lungi de câteva zeci de octeți sau cam asa ceva (în funcție de dimensiunea cheii și de alți parametri ai schemei). O cheie AES se va potrivi bine, dar chiar și un singur mesaj de chat nu va â și o întreagă pagină web sau o imagine sau un flux video categoric nu va.

    (Tehnic, la fel este cam adevărat pentru simetric cifruri bloc ca și AES: de asemenea, criptează datele în bucăți de câteva zeci de octeți, iar pentru a cripta mesajele lungi, acestea trebuie să fie utilizate cu un dispozitiv adecvat. mod de operare care aplică cifrul blocului cu bloc de date. Dar există o mulțime de moduri de operare de criptare bloc rapide și sigure pe care majoritatea software-ului și hardware-ului cripto le acceptă imediat, în timp ce pentru schemele de criptare asimetrică nu există practic niciuna. Și dacă ați încerca să proiectați și să implementați unul singur, șansele sunt că nu ar fi nici eficient, nici sigur.)


Este corect să spunem că:

Având această pereche de chei, pot cripta un mesaj cu cheia mea privată și apoi îl pot publica.Faptul că oricine poate decripta mesajul cu cheia mea publică înseamnă că l-am criptat cu cheia mea privată, ceea ce înseamnă că trebuie să fi fost eu cel care am făcut mesajul, deoarece doar eu am cheia mea privată. Criptarea datelor cu cheia privată a expeditorului numim un format de mesaj deschis, deoarece oricine are o copie a cheii publice corespunzătoare poate decripta mesajul.

Nu, nu chiar. Cheia privată într-o schemă de criptare asimetrică este pentru decriptare, în timp ce cheia publică este pentru criptare. În general, nu puteți cripta nimic cu cheia privată, la fel cum nu puteți decripta cu cheia publică.

Cu toate acestea, există și asimetrice scheme de semnătură digitală care vă permit semn date cu o cheie privată și pentru verifica semnătura cu o cheie publică, dovedind că datele au fost de fapt semnate cu jumătatea privată a aceleiași perechi de chei.

Unele scheme de semnătură digitală se bazează într-adevăr pe scheme de criptare asimetrică. De fapt, o semnătură digitală poate fi considerată, într-un anumit sens general, ca a dovada de cunoștințe zero a faptului că semnatarul ar putea decripta un anumit text cifrat (de obicei derivat din a hash a mesajului care este semnat) cu cheia lor privată folosind o schemă de criptare asimetrică, demonstrând astfel că au avut acces atât la mesaj (sau cel puțin hash-ul acestuia), cât și la cheia privată.

În special, criptosistemul RSA poate fi folosit și ca parte a unei scheme de semnătură (cum ar fi RSA-PSS), folosind același tip de chei publice și private și aceleași operații matematice (exponentiare modulară) ca și pentru criptarea RSA. Aceasta (și primele explicații populare ale criptografiei cu cheie publică) este de unde provine descrierea comună, dar înșelătoare a semnării (RSA) ca „criptare cu cheie privată”. Tehnic nu este în întregime greșit, cel puțin dacă ignori toate alte părți ale schemei (hashing, padding, etc.), cu excepția exponențiației modulare din nucleul algoritmului RSA.

Dar dacă sunteți dispus să simplificați lucrurile atât de departe, ați putea la fel de bine să rețineți că ambii Criptarea și decriptarea RSA (și semnarea și verificarea semnăturii) sunt în principiu doar exponențiații modulare, așa că ați putea spune la fel de bine că sunt toate același lucru, iar semnarea RSA este de fapt doar decriptare RSA aplicată unui text cifru special. Ceea ce ar fi, de asemenea, adevărat din punct de vedere tehnic, într-un fel și, probabil, nu mai mult (sau mai puțin) înșelător decât descrierea acesteia ca „criptare cu cheie privată”.

Puncte:8
drapel in

În RSA, criptarea și decriptarea sunt similare. Dacă alegeți e aleatoriu și calculați potrivirea d, ați putea alege să schimbați rolurile lor și să alegeți oricare dintre ele ca cheie publică.

De obicei nu facem asta, alegem un mic exponent public cu câțiva biți setați. Acest lucru face operațiunile cu chei publice mult mai rapide. Nu putem schimba rolurile și face operațiunile cheii private mai rapide în acest scenariu, deoarece există puține opțiuni pentru exponenți atât de mici. Deci cea mică trebuie să fie cheia publică, nu cea privată.

Puncte:6
drapel xk

Răspunsurile existente de la DannyNiu și Meir Maor răspund bine la confuzia despre dacă cheile private și publice sunt interschimbabile. Dar merită, cred, să abordăm acest fragment de la întrebare:

Având această pereche de chei, pot cripta un mesaj cu cheia mea privată și apoi îl pot publica. Faptul că oricine poate decripta mesajul cu cheia mea publică înseamnă că l-am criptat cu cheia mea privată, ceea ce înseamnă că trebuie să fi fost eu cel care am făcut mesajul, deoarece doar eu am cheia mea privată. Criptarea datelor cu cheia privată a expeditorului numim un format de mesaj deschis, deoarece oricine are o copie a cheii publice corespunzătoare poate decripta mesajul.

Nu, este foarte greșit! Modul normal în care este utilizată criptarea este astfel:

  1. Îmi public cheia publică și îmi păstrez cheia privată secretă.
  2. Decizi să-mi trimiți un mesaj. Folosiți cheia mea publică pentru a vă cripta mesajul; îmi trimiți mesajul criptat.
  3. Folosesc cheia mea privată pentru a decripta mesajul, astfel încât să-l pot citi.

Promisiunea pe care o face criptarea este că, după pasul 2, puteți oferi mesajul criptat oricui doriți. Oricine nu sunt eu (și, prin urmare, nu are cheia mea privată) va primi doar gunoi aparent aleatoriu; nu există nicio modalitate ca ei să învețe vreo proprietate netrivială a mesajului original, necriptat.

În mod critic, cele mai simple promisiuni de criptare fac nu oferi orice garanții cu privire la proveniență. Dacă Joe îmi dă un mesaj criptat și spune că este de la Bob, nu am cum să verific dacă este de fapt de la Bob și, chiar dacă este de la Bob, nu am cum să verific dacă mesajul nu a fost modificat. (De exemplu, dacă Joe știa că mesajul scrie „Bob ar dori să transfere \$XXXXX din contul lui Bob în contul lui Joe”, în unele scheme de criptare este posibil ca Joe să schimbe mesajul în „Bob ar dori să transfere \$99999 din contul lui Bob în contul lui Joe”, chiar dacă Joe nu poate afla care a fost XXXXX original.)

Sunt separa algoritmi care pot oferi garanții de proveniență, numite semnături digitale. În semnăturile digitale, utilizarea normală este astfel:

  1. Îmi public cheia publică și îmi păstrez cheia privată secretă.
  2. Hotărăsc că aș dori să-ți demonstrez că susțin un mesaj. Folosesc cheia mea privată pentru a semna mesajul și pentru a vă trimite semnătura (și mesajul).
  3. Folosiți cheia mea publică pentru a verifica dacă am creat semnătura și că semnătura este despre mesajul dat.

Promisiunea pe care o fac semnăturile este că, după pasul 2, îmi pot da semnătura oricui doresc. Oricine nu sunt eu (și, prin urmare, nu are cheia mea privată) nu o va putea folosi pentru a crea semnături pentru orice alte mesaje în numele meu doar din informațiile pe care le învață în această semnătură.

Dual față de discuția de mai sus despre lucruri nu promis prin criptare, sunt lucruri nu promis prin semnături. De exemplu, o semnătură poate dezvălui informații non-triviale despre mesajul căruia i se aplică, așa că nu promite secret, așa cum o face criptarea. Deci criptarea și semnarea sunt tehnici complementare.

...și, desigur, există algoritmi mai complicati care fac promisiuni mai complicate, inclusiv promițând un amestec de secret pe care îl obțineți din criptare și integritatea/provenința pe care o obțineți de la semnături.

AnoE avatar
drapel ws
Nu înțeleg complet ideea pe care o spui.Fragmentul pe care l-ați citat din OP pare să precizeze corect aspectul semnăturii criptografiei cu cheie publică (poate cu mica optimizare că cineva ar decide în mod regulat să semneze doar un hash al mesajului în loc de mesajul în sine; dar din punct de vedere tehnic/criptologic rezultatul final ar fi fi la fel). Puteți specifica un pic mai mult care parte a blocului citat este cea incorectă?
drapel xk
@AnoE Blocul citat vorbește despre criptarea și decriptarea unui mesaj, nu despre semnarea și verificarea unei semnături; aceasta este greșeala principală. Nu este doar o diferență de terminologie, așa cum am discutat în răspunsul meu: semnăturile nu promit nicio direcție cu privire la informațiile pe care le semnează, nici că informația poate fi recuperată, nici că nu poate, așa că vorbim despre recuperarea mesajul de la semnătură folosind cheia publică nu are sens.
AnoE avatar
drapel ws
Fiecare propoziție din blocul citat are sens în sine și niciuna dintre ele nu este în contradicție una cu cealaltă. Mă pierde puțin la „formatul mesajului deschis” (deși asta poate fi o problemă de limbă - cred că vrea doar să spună că textul cifrat este trimis în public, ceea ce este oarecum evident). Și, evident, nimic nu are aplicabilitate practică, dar, așa cum a spus el, se uită la primele baze teoretice. Dar din punct de vedere concepțional mi se pare foarte bine. Răspunzând „Nu, este foarte greșit!” pare cam exagerat...
drapel xk
@AnoE „Pot cripta un mesaj cu cheia mea privată și apoi îl public” este incorect în general: în multe (majoritatea) schemelor de criptare, cheia privată nu are în interior datele potrivite pentru criptare. „oricine poate decripta mesajul cu cheia mea publică” este incorect dintr-un motiv similar. „trebuie să fi fost eu cel care am făcut mesajul, pentru că doar eu am cheia mea privată” este incorect deoarece criptarea nu face promisiuni de proveniență. „oricine are o copie a cheii publice corespunzătoare poate decripta mesajul” este incorect din același motiv pentru care „oricine poate decripta mesajul cu cheia mea publică” este.
drapel xk
@AnoE Cu alte cuvinte, spre deosebire de „fiecare propoziție are sens în sine”, *fiecare propoziție conține o eroare*, iar unele conțin mai multe.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.