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

Iz MaFiRaWiki

(Razlika med različicami)
Različica od 19:01, 2 junij 2007
Korezr (Pogovor | prispevki)

← Prejšnja različica
Trenutna različica
Korezr (Pogovor | prispevki)
Delovanje
Vrstica 1: Vrstica 1:
 +
 +== Implementacija ==
 +
'''Funkcija PretvoriVStevilo''' '''Funkcija PretvoriVStevilo'''
<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'''
<pre> <pre>
-In[3]:= NarediTabelo[0] := {};+In[3]:= NarediTabelo[0] := {};
- 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'''
<pre> <pre>
-In[7]:= NajblizjePrastevilo[n_Integer] := Module[{m},+In[7]:= NajblizjePrastevilo[n_Integer] := Module[{m},
- If[EvenQ[n], m = n + 1, m = n];+ If[EvenQ[n], m = n + 1, m = n];
- While[! PrimeQ[m], m = m + 2];+ While[! PrimeQ[m], m = m + 2];
- m]+ m]
- 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[20]
 +Out[9]:= 61749609209745709709
 +</pre>
 +'''Funkciji Kodiraj in Dekodiraj'''
 +<pre>
 +In[10]:= Kodiraj[x_Integer] := PowerMod[x, e, n]
 +In[11]:= Dekodiraj[y_Integer] := PowerMod[y, d, n]
 +</pre>
 + 
 +== Delovanje RSA ==
 + 
 +'''Ključa'''
 +<pre>
 +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
 +</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