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

Iz MaFiRaWiki

(Razlika med različicami)
Različica od 19:07, 2 junij 2007
Korezr (Pogovor | prispevki)
Uporaba
← Prejšnja različica
Trenutna različica
Korezr (Pogovor | prispevki)
Delovanje
Vrstica 5: Vrstica 5:
<pre> <pre>
In[1]:= PretvoriVStevilo[s_String] := Fold[256#1 + #2 &, 0, ToCharacterCode[s]] In[1]:= PretvoriVStevilo[s_String] := Fold[256#1 + #2 &, 0, ToCharacterCode[s]]
-In[2]:= PretvoriVStevilo["Janez Novak"]+In[2]:= PretvoriVStevilo["Racunalnistvo"]
-Out[2]:= 89920616654361488803651947+Out[2]:= 6526849610331528453800095676015
</pre> </pre>
'''Funkcija PretvoriVBesedilo''' '''Funkcija PretvoriVBesedilo'''
Vrstica 13: Vrstica 13:
NarediTabelo[n_Integer] := Append[NarediTabelo[Quotient[n, 256]], Mod[n, 256]] NarediTabelo[n_Integer] := Append[NarediTabelo[Quotient[n, 256]], Mod[n, 256]]
PretvoriVBesedilo[n_Integer] := StringJoin[Map[FromCharacterCode, NarediTabelo[n]]] PretvoriVBesedilo[n_Integer] := StringJoin[Map[FromCharacterCode, NarediTabelo[n]]]
-In[6]:= PretvoriVBesedilo[89920616654361488803651947]+In[6]:= PretvoriVBesedilo[6526849610331528453800095676015]
-Out[6]:= Janez Novak+Out[6]:= Racunalnistvo
</pre> </pre>
'''Funkcija VelikoPrastevilo''' '''Funkcija VelikoPrastevilo'''
Vrstica 24: Vrstica 24:
VelikoPrastevilo[n_Integer] := VelikoPrastevilo[n_Integer] :=
NajblizjePrastevilo[Random[Integer, {10^(n - 1)), 10^(n)}]] NajblizjePrastevilo[Random[Integer, {10^(n - 1)), 10^(n)}]]
-In[9]:= VelikoPrastevilo[10]+In[9]:= VelikoPrastevilo[20]
-Out[9]:= 7404799921+Out[9]:= 61749609209745709709
</pre> </pre>
'''Funkciji Kodiraj in Dekodiraj''' '''Funkciji Kodiraj in Dekodiraj'''
Vrstica 33: Vrstica 33:
</pre> </pre>
-== Delovanje ==+== Delovanje RSA ==
 + 
 +'''Ključa'''
<pre> <pre>
-In[11]:= p = 1951851851;+In[12]:= p = 90036595358370388667;
- q = 5651564047;+ q = 61749609209745709709;
n = p*q; 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
 +</pre>
 +'''Kodiranje in dekodiranje'''
 +<pre>
 +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
</pre> </pre>

Trenutna različica

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