RSA (Algoritëm): Dallime mes rishikimesh

[pending revision][pending revision]
Content deleted Content added
Rreshti 10:
Një parim bazë prapa RSA është vrojtimi se është praktike të gjenden tre numra të plotë pozitivë shumë të mëdhenj ''e'', ''d'' dhe ''n'', të tillë që me fuqizim modular për të gjithë numrat e plotë ''m'' (për 0 ≤ ''m'' < ''n'') vlen:
 
<math>(m^e)^d \equiv m \pmod{n}pmod__L_CURLY__n__R_CURLY__</math>
 
dhe se njohja ''e'' dhe ''n'', apo edhe ''m'', mund të jetë jashtëzakonisht e vështirë për të gjetur ''d''. Barazimi i trefishtë (≡) këtu nënkupton [[Kongruenca modulare|kongruencë modulare]].
Rreshti 16:
Përveç kësaj, për disa veprime është e përshtatshme që rendi i dy fuqive të mund të ndryshohet dhe se ky relacion nënkupton gjithashtu
 
<math>(m^d)^e \equiv m \pmod{n}pmod__L_CURLY__n__R_CURLY__.</math>
 
RSA përfshin një çelës publik dhe një çelës privat. Çelësi publik mund të njihet nga të gjithë dhe përdoret për enkriptimin e mesazheve. Synimi është që mesazhet e enkriptuara me çelës publik mund të deshifrohen në një kohë të arsyeshme vetëm duke përdorur çelësin privat. Çelësi publik përfaqësohet nga numrat e plotë ''n'' dhe ''e'', dhe çelësi privat nga numri i plotë ''d'' (edhe pse ''n'' përdoret gjithashtu gjatë procesit të deshifrimit, kështu që mund të konsiderohet gjithashtu si pjesë e çelësit privat). ''m'' përfaqëson mesazhin (i përgatitur më parë me një teknikë të caktuar të shpjeguar më poshtë).
Rreshti 31:
#* ''λ''(''n'') mbahet sekret.
# Zgjidhet një numër i plotë ''e'' i tillë që ''1 < e < λ(n)'' dhe [[Pjesëtuesi më i madh i përbashkët|pmmp]](''e'', ''λ''(''n'')) = 1; d.m.th. ''e'' dhe ''λ''(''n'') janë relativisht të thjeshtë.
#* ''e'' në qoftë se ka gjatësi të shkurtër bitësh dhe peshë të vogël të Hammingut(''ang. [[Pesha e Hamming|Hamming weight]]'') rezulton në enkriptim më efikas - vlera më së shpeshti e zgjedhur për ''e'' është <math>2^{16__L_CURLY__16} + 1 = 65537</math>. Vlera më e vogël (dhe më e shpejtë) e mundshme për ''e'' është 3, por një vlerë kaq e vogël për ''e'' është treguar të jetë më pak e sigurt në disa mjedise.<ref name="Boneh99">{{cite journal|last=Boneh|first=Dan|year=1999|title=Twenty Years of attacks on the RSA Cryptosystem|url=http://crypto.stanford.edu/~dabo/abstracts/RSAattack-survey.html|journal=[[Notices of the American Mathematical Society]]|language=en|volume=46|issue=2|pages=203–213}}</ref>
#* ''e'' shpërndahet si pjesë e çelësit publik.
# Përcaktohet ''d'' si <math>d \equiv e^{__L_CURLY__-1} \pmod{pmod__L_CURLY__\lambda{lambda__L_CURLY__(n)}}</math>; d.m.th. , ''d'' është inversi multiplikativ i ''e'' modul ''λ''(''n'').
#* Kjo do të thotë: llogaritet për ''d'' ekuacioni <math>d*e \equiv 1 \pmod{pmod__L_CURLY__\lambda{lambda__L_CURLY__(n)}}</math>.
#* ''d'' mbahet sekret si eksponent i çelësit privat.
Çelësi publik përbëhet nga moduli ''n'' dhe eksponenti publik (ose enkriptues) ''e''. Çelësi privat përbëhet nga eksponenti privat (ose deshifrues) ''d'', i cili duhet të mbahet sekret. ''p'', ''q'', dhe ''λ''(''n'') duhet gjithashtu të mbahen sekrete sepse ato mund të përdoren për të llogaritur ''d''. Në fakt, të gjitha mund të fshihen pasi të jetë llogaritur ''d''.<ref>Applied Cryptography, John Wiley & Sons, New York, 1996. [[Bruce Schneier]], p. 467.</ref>
Rreshti 48:
Për ta bërë këtë, ai së pari e kthen {{mvar|M}} (tekstin e thjeshtë) në një numër të plotë ''{{mvar|m}}'' (tekstin e "përbërë"), ashtu që {{math|0 ≤ ''m'' < ''n''}} duke përdorur një protokoll të rimbursuar të njohur si një mbushje skemë. Ai pastaj llogarit tekstin e enkriptuar {{mvar|c}}, duke përdorur çelësin publik të Erikës {{mvar|e}}, që korrespondon me
 
<math>c \equiv m^e \pmod{n}pmod__L_CURLY__n__R_CURLY__.</math>
 
Kjo mund të bëhet mjaft shpejt, madje edhe për numra shumë të mëdhenj, duke përdorur eksponentim modular. Fati pastaj i dërgon {{mvar|c}} Erikës. Vini re se të paktën nëntë vlera të ''{{mvar|m}}'' do të japin një tekst të enkriptuar {{mvar|c}} të barabartë me ''{{mvar|m}}'',<ref>Domethënë, vlerat e ''m'' të cilat janë të barabarta me −1, 0, ose 1 modul ''p'' përderisa gjithashtu të barabarta me −1, 0, ose 1 modul ''q''. Ka më shumë vlera të ''m'' ashtu që ''c'' = ''m'' nëse ''p''&nbsp;−&nbsp;1 ose ''q''&nbsp;−&nbsp;1 kanë plotpjesëtues të përbashkët me ''e''&nbsp;−&nbsp;1 perveq 2 sepse kjo i jep më shume vlera ''m'' ashtu që <math>m^{e__L_CURLY__e-1} \bmod p = 1</math> ose <math>m^{e__L_CURLY__e-1} \bmod q = 1</math> respektivisht.</ref> por kjo nuk ka gjasa të ndodhë në praktikë.
 
=== Dekriptimi ===
Erika mund të rimarrë {{mvar|m}} nga {{mvar|c}} duke përdorur eksponentin çelësit privat të saj ''d'' nga llogaritja
 
<math>c^d \equiv (m^e)^d \equiv m \pmod{n}pmod__L_CURLY__n__R_CURLY__.</math>
 
Duke pasur {{mvar|m}}, ajo mund të rimarrë mesazhin origjinal {{mvar|M}} duke përmbysur skemën e mbushjes.
Rreshti 72:
 
* Llogaritet ''λ''(''n''), ku ''λ(n) = [[Shumëfishi më i vogel i përbashkët|shmvp]](p - 1, q - 1).''
<math>\lambda{lambda__L_CURLY__(n)}__R_CURLY__=shmvp(18,28)=252</math>
* Zgjidhet një numër i plotë ''e'', ashtu që ''1 < e < λ''(''n'')=''252''. Që të mbajmë shembullin të thjeshtë do të zgjedhim një ''e'' të vogël.
<math>e = 17</math>
* Përcaktohet ''d'' si <math>d \equiv e^{__L_CURLY__-1} \pmod{pmod__L_CURLY__\lambda{lambda__L_CURLY__(n)}}</math>. <syntaxhighlight lang="python3">
import itertools
 
Rreshti 89:
</syntaxhighlight>Duke përdorur kodin e mësipërm gjejmë se <math>d = 89</math>.
 
Deri tani kemi vlerat <math>p=19;q=29;n=551;\lambda{lambda__L_CURLY__(n)}__R_CURLY__=252;e=17;d=89
</math>, ku <math>e=17</math> është çelësi publik ndërsa <math>d=89</math> është çelësi privat.
 
==== Enkriptimi ====
Për të enkriptuar mesazhin tonë "76 - 73 - 78 - 85 - 88" përdorim formulën <math>c \equiv m^e \pmod{n}pmod__L_CURLY__n__R_CURLY__</math> e cila në [[Python]] mund të shprehet si <math>pow(m, e, n)</math>.<syntaxhighlight lang="python3">
>>> p, q, n, tot, e, d = 19, 29, 551, 252, 17, 89
>>> m = [76, 73, 78, 85, 88]
Rreshti 102:
 
==== Denkriptimi ====
Për të deshifruar mesazhin e enkriptuar "171 - 424 - 257 - 530 - 407", atëherë përdorim formulën <math> m \equiv c^d \pmod{n}pmod__L_CURLY__n__R_CURLY__</math>.<ref>{{Cite web|title=RSA Algorithm|url=https://www.di-mgt.com.au/rsa_alg.html|url-status=live|access-date=25 janar 2022|website=[[RSA Algorithm]]|language=en}}</ref><syntaxhighlight lang="python3">
>>> m_ = [pow(i, d, n) for i in c]
>>> print(m_)