Gjenerimi i Numrave Random në Kriptografi

**Abstrakt**

*Ky material fokusohet në përdorimin e numrave të rastësishëm në kriptografi, rëndësinë e këtyre numrave në këtë fushë dhe metodat e gjenerimit të tyre.*
*Dy kategoritë kryesore të metodave të gjenerimit të numrave random janë metodat fizike dhe ato llogaritëse (aritmetike).*
*Më vonë kuptojmë se me metoda aritmetike nuk është e mundur të gjenerojmë numra vërtetë të rastësishëm, por vetëm numra (të pseudo-rastësishëm) të cilët i përafrohen atyre. Kualiteti i një algoritmi përcaktohet saktësisht nga kjo veti.* *Metodat fizike, duke përdorur vetë fenomenet fizike, sjellin rezultate më të kënaqshme dhe sekuenca më reale të numrave random.*

*Si rrjedhojë e rëndësisë së tyre, studiuesëve të kësaj lëmie i është paraqitur një sfidë e gjetjes së një zgjidhjeje e cila i afrohet sa më shumë një algoritmi “perfekt” për gjenerimin e numrave vërtetë të rastësishëm.* *Përpjekjet për të arritur këtë qëllim kanë qenë të shumta dhe kanë rezultuar në krijimin e një numri të madh të algoritmeve, me kualitete të ndryshme.*

**1 Hyrje**

Numrat e rastësishëm kanë përdorim të gjerë në shumë fusha shkencore apo qoftë edhe për argëtim. 
Do të ishte shumë mirë për algoritmet kriptografike nëse numrat e rastësishëm të përdorur aty janë numra vërtetë të rastësishëm. Rezultatet nuk do të mund të riprodhoheshin dhe siguria do të ishte maksimale. Mirëpo realiteti funksionon ndryshe dhe metodat për gjenerimin e këtyre numrave janë të rralla.
Dikush mund të mendojë që mënyra më e mirë për të krijuar numra të rastësishëm është që të pëdorim një algoritëm “të rastit” i cili kryen një varg të operacioneve të llojllojshme (matematikore, logjike) me qëllim të nxjerrjes së një numri të rastësishëm. 

Formulimi i këtyre algoritmeve është më vështirë se që duket dhe sekuencat e numrave të rastësishëm të gjeneruar nga këto algoritme eventualisht fillojnë të përsëriten apo të shfaqin algoritmet prapa tyre. 

Numrat që duken si numra vërtetë të rastësishëm e që në esencë nuk janë, njihen me termin pseudo-random. 

Pasi që numrat vërtetë të rastësishëm nuk mund të gjenerohen nga proceset e paracaktuara, idea kryesore është që gjenerimi i numrave të pseudo-rastësishëm t’i përafrohet sa më shumë procesit të gjenerimit të numrave vërtetë të rastësishëm.

***2 Përmbajtja***

**2.1 Numrat e rastësishëm**

Numrat e rastësishëm janë numra të cilët gjenerohen nga procese të rastësishme në natyrë që ndikohen nga faktorë të pamundshëm për t’u përcaktuar. 

Numrat e rastësishëm (random) kanë përdorim të gjerë ne eksperimente statistikore, në algoritme të tjera të gjenerimit të numrave të rastësishëm dhe posaçërisht në kriptografi. 

**2.1.1 Numrat e pseudo-rastësishëm**

Që nga fillimi i kompjuterizimit, është paraqitur sfida e gjenerimit të numrave të rastësishëm me anë të algoritmeve. Problemi qëndronte te fakti se asnjë numër “i rastësishëm” i gjeneruar nga proceset kompjuterike nuk është numër vërtetë i rastësishëm. Këta numra i quajmë numra të pseudo-rastësishëm.

Numrat e pseudo-rastësishëm duken si numra të gjeneruar në mënyrë të rastësishme, mirëpo në realitet prapa procesit të gjenerimit të tyre qëndron një algoritëm që bën caktimin e tyre. 
Kjo është arsyeja pse këta numra quhen të pseudo-rastësishëm (‘ pseudo’ – ‘ jo real’). Përdorimi i proceseve të pseudo-rastësishme rezulton në pseudo-siguri.
Edhe pse këta numra nuk janë numra vërtetë të rastësishëm, në shumicën e aplikacioneve mund të përdoren si të tillë. 

**2.1.2 Gjeneratorët e numrave të rastësishëm**

Një gjenerator i numrave të rastësishëm (apo shkurt RNG) është një pajisje llogaritëse apo fizike e dizajnuar për të gjeneruar një sekuencë të numrave apo simboleve me strukturë kaotike.
PRNG (Pseudo-random number generator) - Këto lloje të gjeneratorëve përfshijnë algoritme të cilat bazohen në formula matematikore. Numrat e gjeneruar nga këto algoritme duken si numra vërtetë të rastësishëm, por në esencë janë të predeterminuara.

TRNG (True random number generator) - Në krahasim me PRNG, gjeneratorët e numrave vërtetë të rastësishëm ekstraktojnë rastësinë nga fenomenet fizike dhe ia pasojnë kompjuterit.

**2.4 Numrat e rastësishëm në kriptografi**

Sistemet e sotme të sigurisë themelohen mbi baza të forta të algoritmeve kriptografike të cilat zhvillohen vazhdimisht dhe bëjnë të pamundur gjetjen e një modeli apo përsëritje (ang. pattern) prapa kodeve të tyre. Në zemër të të gjitha sistemeve kriptografike është gjenerimi i numrave sekret dhe të rastësishëm.

Mirëpo, siguria e këtyre sistemeve varet nga vetë gjenerimi i çelësave apo fjalëkalimeve të tyre. 
Një sulmues i sistemit mund ta ketë shumë të lehtë të riprodhojë mjedisin që ka bërë gjenerimin nëse gjenerimi ka qenë i dobët.

Shumë aspekte të kriptografisë kërkojnë numra të rastësishëm, si:
•	Gjenerimi i çelësave
•	One-time pad
•	Gjenerimi i salt-it 
•	Nonce (number used only once)
•	Vektori i inicializimit
•	Bajtat e padding-ut
Kushtet e kualitetit të numrave të rastësishëm për këto aplikacione ndryshojnë. Për shembull, në disa protokole është më shumë e rëndësishme që këta numra të jenë unik se sa që të jenë të rastësishëm. Mirëpo në anën tjetër, p.sh. te enkriptimi me one-time pad, do të kemi fshehtësi të të dhënave vetëm nëse numrat janë vërtetë të rastësishëm.
Një vërtetim i rëndësisë së madhe të përdorimit të këtyre numrave në kriptografi është rasti i gjenerimit të çelësave (publik dhe privat) në RSA (Rivest-Shamir-Adleman).
Nëse për gjenerimin e parametrave fillestare për krijimin e një çelësi (publik apo privat) përdorim një algoritëm i cili nuk përmbush kushtet për numra kriptografikisht të sigurt , atëhere rrezikojmë sistemin e sigurisë së komunikimit. Rreziku qëndron te fakti se një sulmues, duke përdorur këtë pikë të dobët, mund të riprodhojë parametrat fillestar duke dhënë hyrjen e njëjtë.
Enkriptimi me one-time pad (OTP) është enkriptim i cili bazohet plotësisht në rastësinë e çelësit. Është vërtetuar se thyerja e këtij enkriptimi është e pamundshme nëse çelësi i përdorur është vërtetë i rastësishëm. Sa më shumë që i largohemi këtij kushti, aq më i pasigurt do të jetë enkriptimi. 
Fjalëkalimi është një shembull tipik i një sekuence të numrave të rastësishëm, zakonisht në formë stringu. Por natyrisht, nuk ofron siguri të mirë nëse është i lehtë për t’u qëlluar.

***2.5 Format e gjenerimit***

**2.5.1 Metodat fizike**

Metodat më të hershme për gjenerimin e numrave random – hudhja e zarit, monedhës, ruleti – janë ende në përdorim sot e kësaj dite, kryesisht nëpër lojëra dhe bixhoz pasi që janë shumë të ngadalshme për shumicën e aplikacioneve në statistikë dhe kriptografi.
Mekanika kuantike është metoda më moderne, poashtu dhe metoda më funksionale për gjenerimin e numrave random dhe kjo mbështetet nga fakti se në bazë të ligjeve të kësaj fushe është prodhuar gjeneratori i parë i numrave vërtetë të rastësishëm (në vitin 2010).
Burimet e entropisë (gjendjeve jostabile) përfshijnë zbërthimet radioaktive, zhurmat e ndryshme të shkaktuara nga proceset fizike, apo edhe matja e kohës së kokës për lexim dhe shkrim në hard disk. Të gjitha këto janë burime të mundshme për gjenerimin e numrave të rastësishëm. Mirëpo, aparetet për matjen e këtyre burimeve paraqesin konflikte të ndryshme që pengojnë rezultatet e sakta.
Një burim tjetër i numrave random do të ishte një “nxjerrës” i rastit, si p.sh. hash funksionet, që mund të përdoren për fitimin e një sekuence unike të bitave nga një burim jo-unik. 
Ka edhe shumë mënyra të ndryshme për nxjerrjen e numrave random. Një teknikë e tillë do të ishte ekzekutimi i hash funksionit ndaj një video stream që vjen nga një burim i paparashikuar, apo edhe gjenerimi i numrave nga zhurma atmosferike e inçizuar nga një radio. Edhe vetë njeriu paraqet një burim të këtyre numrave per shkak se vetë sjellja e njeriut është e paparashikuar. Një shembull tipik që vlen të theksohet është lëvizja e mausit. 

**2.5.2 Metodat llogaritëse**

“Anyone who considers arithmetical methods of producing random digits is, of course, in a state of sin.” – John von Neumann
John von Neumann ka theksuar se nuk duhet bazuar në metoda aritmetike për gjenerimin e numrave random, por e vetma zgjidhje është përdorimi i proceseve fizike për gjenerimin e këtyre numrave.
Për të argumentuar të kundërtën, Donald Knuth ka provuar një algoritëm të tillë dhe rezultatet nuk kanë qenë të kënaqshme. Gjatë procesit të gjenerimit, sekuenca e numrave të rastësishëm ka hasur në një pikë të konvergjimit, ku filloi të dukej algoritmi prapa saj. Pas kësaj prove erdhi në përfundim se mënyra më e mirë e gjenerimit të numrave të rastësishëm është që të përdoret shkenca dhe t’i kushtohet një kujdes i vecantë krijimit të një algoritmi për qëllim të tillë.

Në kategorinë e metodave llogaritëse bëjnë pjesë gjeneratorët e numrave pseudo-random (PRNG) të cilët automatikisht krijojnë sekuenca të gjata të numrave me veti të mira të rastësisë por eventualisht do të përsëriten. Kjo është dobësia e këtyre sistemeve. Një seri e vlerave të gjeneruara nga një algoritëm i tillë në pergjithësi është e përcaktuar nga një numër fillestar fiks i quajtar seed (shq. farë).
Një metodë e thjeshtë për gjenerimin e numrave random është ajo e John von Neumann e quajtur middle square method (metoda e katrorit të brendshëm) e cila funksionon kështu: 
Numri i zgjedhur ngritet në katror, pastaj marrim shifrat të cilat gjenden në mes të rezultatit të fituar pas ngritjes në katror të numrit te zgjedhur. Numrat e zgjedhur nga mesi duhet të jenë po aq shifror sa numri fillestar.
Shumica e gjuhëve të programimit, në kornizat e tyre, përmbajnë librari ku janë të definuara gjeneratorët e numrave të rastësishëm. Funksionet e këtilla kanë veti të dobëta dhe fillojnë të përsëriten përafërsisht pas dhjetra mijëra numrash të gjeneruar. Si vlerë inicializuese (seed), zakonisht përdoret koha reale e kompjuterit.

**2.5.3 Numrat random në kornizën .NET**

.NET Framework përmban këto klasa për gjenerimin e numrave random:
•	Klasa Random
•	Klasa RandomNumberGenerator (System.Security.Cryptography)
•	Klasa RNGCryptoServiceProvider (System.Security.Cryptography)
Klasa Random nuk përdorët në kriptografi (ose së paku nuk sugjerohet) për arsye se nuk gjeneron numra kriptografikisht të sigurt. Gjenerimi i numrave random nga kjo klasë fillon me një vlerë fillestare. Në qoftë se kjo vlerë fillestare përdoret vazhdimisht atëherë do të gjenerohen sekuenca të njejta.