Rešitev: Algoritem za zakrivanje z javnim ključem (Mathematica)

Iz MaFiRaWiki

Implementacija

Funkcija PretvoriVStevilo

In[1]:=   PretvoriVStevilo[s_String] := Fold[256#1 + #2 &, 0, ToCharacterCode[s]]
In[2]:=   PretvoriVStevilo["Racunalnistvo"]
Out[2]:=  6526849610331528453800095676015

Funkcija PretvoriVBesedilo

In[3]:=   NarediTabelo[0] := {};
          NarediTabelo[n_Integer] := Append[NarediTabelo[Quotient[n, 256]], Mod[n, 256]]
          PretvoriVBesedilo[n_Integer] := StringJoin[Map[FromCharacterCode, NarediTabelo[n]]]
In[6]:=   PretvoriVBesedilo[6526849610331528453800095676015]
Out[6]:=  Racunalnistvo

Funkcija VelikoPrastevilo

In[7]:=   NajblizjePrastevilo[n_Integer] := Module[{m},
          If[EvenQ[n], m = n + 1, m = n];
          While[! PrimeQ[m], m = m + 2];
          m]
          VelikoPrastevilo[n_Integer] := 
          NajblizjePrastevilo[Random[Integer, {10^(n - 1)), 10^(n)}]]
In[9]:=   VelikoPrastevilo[20]
Out[9]:=  61749609209745709709

Funkciji Kodiraj in Dekodiraj

In[10]:=  Kodiraj[x_Integer] := PowerMod[x, e, n]
In[11]:=  Dekodiraj[y_Integer] := PowerMod[y, d, n]

Delovanje RSA

Ključa

In[12]:=  p = 90036595358370388667;
          q = 61749609209745709709;
          n = p*q;
In[15]:=  P[n_Integer] := EulerPhi[n]
In[16]:=  P[n]
Out[16]:= 5559724577955375970436947363081969369528
In[17]:=  e = VelikoPrastevilo[20];
          While[GCD[e, P[n]] > 1, e = VelikoPrastevilo[5]]
          e
Out[19]:= 85602866491793244949
In[20]:=  d = Mod[ExtendedGCD[e, P[n]][[2, 1]], P[n]]
Out[20]:= 3667426147686508319182055875332561891509

Kodiranje in dekodiranje

In[21]:=  PretvoriVStevilo["Racunalnistvo"]
Out[21]:= 6526849610331528453800095676015
In[22]:=  Kodiraj[6526849610331528453800095676015]
Out[22]:= 1233587205076776545495912318845865502286
In[23]:=  Dekodiraj[1233587205076776545495912318845865502286]
Out[23]:= 6526849610331528453800095676015
In[24]:=  PretvoriVBesedilo[6526849610331528453800095676015]
Out[24]:= Racunalnistvo
Osebna orodja