De ce îmi pasă: Vreau să implementez câteva sesiuni securizate pentru comunicarea prin internet și, din moment ce sunt un amator complet în asta și nu vreau să petrec mult timp învățând despre criptografie sau despre anumite biblioteci (deoarece fac asta doar pentru distracție), am doresc să aibă o pregătire minimă din partea programării. Din punct de vedere matematic, sunt bun la asta, așa că petrecerea timpului suplimentar gândindu-se (spre deosebire de căutarea pe Google și citirea documentațiilor) nu este o problemă.
Conjectura/intrebarea mea: Partea interesantă vine când mi-am dat seama că având un singur cifru asimetric (bloc sau flux), numiți-l $X$, este suficient pentru toate nevoile criptografice de bază.Cu alte cuvinte, toate celelalte categorii criptografice de bază (alte tipuri de cifruri, funcții hash și semnături, nu altele) pot fi reduse la acest algoritm; ai putea crea un algoritm de hashing folosind numai $X$, și un algoritm de semnare folosind numai $X$. Aceasta ar însemna că combinarea algoritmilor precum RSA+ChaCha+Poly1305 sau orice nu este depășită atunci când viteza este irelevantă. Nu țintesc mai sus decât comunicarea pe internet. FHE și similare sunt în afara domeniului de aplicare. Atunci, nu este suficient doar să implementezi $X$ când timpul și viteza nu sunt relevante? De ce atunci oamenii inventează toți acești algoritmi, în afară de motive de viteză?
Dovada mea:
Transformarea unui cifr de flux într-un cifru bloc:
Doar procesați un flux de lungime fixă cu un cifr de flux și numiți-l un cifru bloc.
Transformarea unui cifr bloc care acționează asupra unui set de dimensiuni arbitrare într-un cifr bloc care acționează asupra unui set de dimensiuni ale unei puteri de $2$.
Lăsa $A$ fii decorul $\{1,\dots,N\}$. Lăsa $X$ să fie un cifru bloc cu două funcții $E$ și $D$ (funcția de criptare și decriptare) din care cartografiază elementele $A$ la $A$. Lăsa $2^k$ fi cea mai mare putere a $2$ mai mic sau egal cu $N$. Lăsa $B$ fii decorul $\{1,\dots,2^k\}$. Lăsa $x$ fi un număr de la $A$. Secvența $x,E(x),E(E(x)),...$ se presupune că este aleatoriu și uniform distribuit pe set $A$ (de asemenea, un ciclu lung, deoarece acesta este un cifru asimetric), care rezultă că un număr din $B$ apare, în medie, după fiecare $\frac{|B|}{|A|}$ elemente. Putem lua prima astfel de apariție ca imaginea noii funcție $E'$ care acum mapează din $B$ la $B$. Defini $D'$ a fi inversul $E'$. Perechea $(E',D')$ este un nou cifru bloc care acționează asupra unui set de dimensiuni $2^k$, cu alte cuvinte pe blocuri de $k$ biți. Este la fel de sigur ca $X$ pentru că dacă putem sparge această fisură acest cifru, înseamnă că putem găsi rezultatul cifrului original aplicat de câteva ori, să zicem $m$ ori.Apoi putem reaplica cifrul $m-1$ de mai multe ori pe un mesaj criptat și apoi folosiți acest crack pentru a-l anula $m$ ori. De cand $m$ este de așteptat să fie mai mic decât $k$, acest lucru este fezabil.
Transformarea unui cifr de bloc de dimensiune $2^k$ într-un cifr de flux.
Sa presupunem $k$ este par (este mai simplu de explicat conceptul). Din punct de vedere tehnic, doar criptez și decriptez un mesaj de dimensiune arbitrară, care nu este tocmai un cifr de flux. În primul rând, extindeți mesajul pentru a avea o lungime care este un multiplu de $\frac{k}{2}$. Gândiți-vă la acest mesaj ca la o secvență de blocuri de dimensiuni $\frac{k}{2}$. Putem encrpyt perechi la locul acestor blocuri: primul și al doilea bloc împreună, apoi al doilea și al treilea și așa mai departe... până la sfârșit. Până acum, acesta seamănă cu un cifru de flux. Opțional, putem adăuga un început aleatoriu la mesaj dacă mesajul a fost prea scurt inițial. Putem, de asemenea, opțional, să inversăm ordinea acestor blocuri și să aplicăm aceeași secvență de criptare. Acum, putem fie decripta întregul mesaj, fie nimic: dacă pierdem o parte din el, nu putem decripta nimic. La fel cum cifrul bloc inițial este menit să se comporte. Acesta este la fel de sigur ca cifrul bloc original, deoarece dacă putem sparge întregul mesaj, atunci putem relua criptarea și putem produce toate inter-produsele, inclusiv decriptarea ultimelor 2 blocuri pe care le-a criptat criptatorul.
Transformarea unui cifru bloc într-o funcție hash.
Am editat această parte, pentru că prima idee a fost greșită...
Creați două perechi de chei și aruncați cheile private și codificați cheile publice în algoritm. La fel ca și în partea anterioară, pregătiți blocurile. Acum criptați primul $k$ biți la locul lor, mai întâi cu o cheie, apoi cu cealaltă, eliminați $l<<k$, $l|k$ biți „aleatoriu” (pseudo-aleatoriu, însămânțați de un simplu hash al mesajului) din acest produs $k$ biți și concatenează restul biților. Continuați să faceți acest lucru până când există numai $k$ biți rămase, apoi numiți-o hașul puternic.Acest lucru este la fel de sigur ca cifrul, deoarece dacă presupunem că am găsit un alt mesaj cu aceeași ieșire, atunci în timp ce le reluăm pe amândouă în același timp, la un moment dat vom produce același $k-l$ biți (după eliminarea aleatorie $l$ biți). Iată de ce este greu: Aceia $k-l$ biți pot fi completați până la $k$ biți în cel mult $2^l\binom{k}{l}$ moduri (pe care le putem lega la un număr mic), atunci majoritatea dintre ele nu vor produce același lucru $k-l$ biți care ajută la delimitarea acestuia, atunci chiar dacă am putea decripta o altă combinație de $k$ biți (ceea ce poate ar putea fi posibil pentru că seamănă cu originalul $k$ biți), cei decriptați $k$ biții ar trebui să fie decriptați din nou, dar acum nu seamănă cu originalul $k$ biți, așa că practic ar trebui să spargem cifrul în acest moment. Folosim două cifruri diferite (două chei publice diferite) pentru că dorim să eliminăm orice maleabilitate.
Transformarea unui cifru bloc într-o funcție de semnătură.
Putem calcula mai întâi hash-ul mesajului și apoi criptăm hash-ul. Acest lucru este evident sigur, deoarece așa funcționează algoritmii actuali.
Îmi cer scuze că am folosit diferite etichete, pur și simplu nu știam ce să folosesc.