From 6ed57a7241e774a3257984d26fd0fc9ee0a4bfce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Wo=C5=BAniak?= Date: Tue, 22 Dec 2020 15:43:02 +0100 Subject: [PATCH] Updated MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcin Woźniak --- 6/krzywa.rb | 87 +++++++++++++++++------------- module.rb | 152 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 173 insertions(+), 66 deletions(-) diff --git a/6/krzywa.rb b/6/krzywa.rb index 711bcd9..ecdae66 100755 --- a/6/krzywa.rb +++ b/6/krzywa.rb @@ -53,45 +53,60 @@ load '../module.rb' ################################################## # Zadanie od profersora -a=239614427021073265587611886177902927263167863041565491257781227550405368115731464059190159 -b=447169285435982716467332439542997876345372330045685811964291613238129105735899852114277221 -p=1183779584357076950937981497685946292711107412152534481102525547387604378262522402526266939 -px=285113634279465403319996581740169338329454608669814309137990174814243655992779447106132850 -py=598700530906084162596261101440667782569915319623798143751082061599951188013331503150304328 - - -puts "Zadanie 1 #{generatorKrzywej(p).inspect}" -puts "Zadanie 2 #{punktNaKrzywej(a,b,p).inspect}" -puts "Zadanie 3 #{czyPunktNalezyDoKrzywej(a,b,p,px,py).inspect}" -puts "Zadanie 4 #{punktPrzeciwny(px,py).inspect}" -puts "Zadanie 5" -pp=sumaPunktow(a,b,p,px,py,px,py) -qx,qy=pp[0],pp[1] -r=sumaPunktow(a,b,p,px,py,qx,qy) -puts "P+P=Q = #{pp.inspect}" -puts "P+Q=R = #{r.inspect}" - -################################################## +#a=239614427021073265587611886177902927263167863041565491257781227550405368115731464059190159 +#b=447169285435982716467332439542997876345372330045685811964291613238129105735899852114277221 +#p=1183779584357076950937981497685946292711107412152534481102525547387604378262522402526266939 +#px=285113634279465403319996581740169338329454608669814309137990174814243655992779447106132850 +#py=598700530906084162596261101440667782569915319623798143751082061599951188013331503150304328 +# +# +#puts "Zadanie 1 #{generatorKrzywej(p).inspect}" +#puts "Zadanie 2 #{punktNaKrzywej(a,b,p).inspect}" +#puts "Zadanie 3 #{czyPunktNalezyDoKrzywej(a,b,p,px,py).inspect}" +#puts "Zadanie 4 #{punktPrzeciwny(px,py).inspect}" +#puts "Zadanie 5" +#pp=sumaPunktow(a,b,p,px,py,px,py) +#qx,qy=pp[0],pp[1] +#r=sumaPunktow(a,b,p,px,py,qx,qy) +#puts "P+P=Q = #{pp.inspect}" +#puts "P+Q=R = #{r.inspect}" +# +################################################# #Zadania od Marcina -puts `clear` -p = 489198001832658669053371291694019055502521600295245000665130252689633682157211441103746103 -a = 143655542375421547495538657783935617582804745476111687935604061101439410572992748159327949 -b = 317483121238416221164186798475625852751072649807905602729473072669192329094502393489452530 -px = 214920231222257412002472184644105947527864300425093926130634470978902408198296382507987372 -py = 213782952948563488188771820496583435437623918801486982688994669228366002105132455299788553 +#puts `clear` +#p = 489198001832658669053371291694019055502521600295245000665130252689633682157211441103746103 +#a = 143655542375421547495538657783935617582804745476111687935604061101439410572992748159327949 +#b = 317483121238416221164186798475625852751072649807905602729473072669192329094502393489452530 +#px = 214920231222257412002472184644105947527864300425093926130634470978902408198296382507987372 +#py = 213782952948563488188771820496583435437623918801486982688994669228366002105132455299788553 +# +#puts "Zadanie1: #{generatorKrzywej(p).inspect}" +#puts "Zadanie2: #{punktNaKrzywej(a,b,p).inspect}" +#puts "Zadanie3: #{czyPunktNalezyDoKrzywej(a,b,p,px,py).inspect}" +#puts "Zadanie4: #{punktPrzeciwny(px,py).inspect}" +#puts "Zadanie5:" +#pe = sumaPunktow(a,b,p,px,py,"e","e") +#pmp = sumaPunktow(a,b,p,px,py,px,-py) +#pp = sumaPunktow(a,b,p,px,py,px,py) +#puts "P + e = #{pe.inspect}" +#puts "P + (-P) = #{pmp.inspect}" +#puts "P + P = #{pp.inspect}" +# +#qx = 642259555221384310824793582418757985600466641224722883964129011723625337870528779957486982 +#qy = 217544632016156259911730007881694454319320868952565819223745628076715981593127804307986145 +#puts "P + Q = #{sumaPunktow(a,b,p,px,py,qx,qy)}" +# +p = 1538255343667180808195708522177986895059786729714603384471797563076417208690821410309839367 +a = 715342794670902354305018359597199506955388115300843026803751557193763639728084344185723 +b = 1310687127378189233907141356419474988172837541544430152741262021759183741113116543743146348 puts "Zadanie1: #{generatorKrzywej(p).inspect}" puts "Zadanie2: #{punktNaKrzywej(a,b,p).inspect}" -puts "Zadanie3: #{czyPunktNalezyDoKrzywej(a,b,p,px,py).inspect}" -puts "Zadanie4: #{punktPrzeciwny(px,py).inspect}" -puts "Zadanie5:" -pe = sumaPunktow(a,b,p,px,py,"e","e") -pmp = sumaPunktow(a,b,p,px,py,px,-py) +px = 594932631894926193421437283987806574765302728699542654903674886448369552319213626349713311 +py = 957752861784564367578830846183560854043857673111182304497829726211341185920049820320440474 +qx = 876637806459659863220283205686618437204645589144030749155094254881674465651564141161317623 +qy = 466327193499960026299197596349518168121975030810688292370617392939557876329218294835906002 pp = sumaPunktow(a,b,p,px,py,px,py) -puts "P + e = #{pe.inspect}" -puts "P + (-P) = #{pmp.inspect}" +pq = sumaPunktow(a,b,p,px,py,qx,qy) puts "P + P = #{pp.inspect}" - -qx = 642259555221384310824793582418757985600466641224722883964129011723625337870528779957486982 -qy = 217544632016156259911730007881694454319320868952565819223745628076715981593127804307986145 -puts "P + Q = #{sumaPunktow(a,b,p,px,py,qx,qy)}" +puts "P + Q = #{pq.inspect}" diff --git a/module.rb b/module.rb index 9864694..19a6d5e 100755 --- a/module.rb +++ b/module.rb @@ -46,10 +46,10 @@ def extended_euklides(a, b) end #################################### -# Funkcja nwd(a,b) +# Funkcja random_gen_Zn(k,n) # -# Oblicza nwd podanych liczb np -# nwd(10,14) => 2 +# Oblicza losowy element z zbioru Z_n +# random_gen_Zn(1,10) => 1 # #################################### def random_gen_Zn(k,n) @@ -80,11 +80,14 @@ def random_gen_Zn(k,n) end #################################### -# Funkcja nwd(a,b) +# Funkcja reciprocal_Phi_p(n,p) # -# Oblicza nwd podanych liczb np -# nwd(10,14) => 2 +# Oblicza odwrotnosc w grupie Phi(n) +# reciprocal_Phi_p(10,7) => 5 # +# Funkcja oblicza 10^(-1) mod 7 = 5 +# Dowód: 5 * 10 mod 7 = 1 +# a^(-1) * a mod p = e = 1 #################################### def reciprocal_Phi_p(n,p) u = extended_euklides(n,p)[0] @@ -104,10 +107,10 @@ def reciprocal_Phi_p(n,p) end #################################### -# Funkcja nwd(a,b) +# Funkcja betterExponentiation(x,k,n) # -# Oblicza nwd podanych liczb np -# nwd(10,14) => 2 +# Oblicza potęgi x^k mod n +# betterExponentiation(8,2,30) => 4 # #################################### def betterExponentiation(x,k,n) @@ -137,10 +140,11 @@ def betterExponentiation(x,k,n) end #################################### -# Funkcja nwd(a,b) +# Funkcja remSqEuler(a,b) # -# Oblicza nwd podanych liczb np -# nwd(10,14) => 2 +# Sprawdzenie czy element a jest +# reszta kwadratowa w Z_p +# remSqEuler(3,13) => true # #################################### def remSqEuler(a,p) @@ -153,10 +157,7 @@ def remSqEuler(a,p) end #################################### -# Funkcja nwd(a,b) -# -# Oblicza nwd podanych liczb np -# nwd(10,14) => 2 +# Funkcja squareRootFp(a,b) # #################################### def squareRootFp(p,b) @@ -167,10 +168,10 @@ def squareRootFp(p,b) end #################################### -# Funkcja nwd(a,b) +# Funkcja primalityTest(n) # -# Oblicza nwd podanych liczb np -# nwd(10,14) => 2 +# Test pierwszości +# primalityTest(13) => true # #################################### def primalityTest(n) @@ -194,12 +195,11 @@ def primalityTest(n) end #################################### -# Funkcja nwd(a,b) +# Funkcja specyficPrimaryNumber # -# Oblicza nwd podanych liczb np -# nwd(10,14) => 2 -# -#################################### +# Generuje potrzebne do pierwszego +# ElGamala +##################################### def specyficPrimaryNumber p = 0 q = 0 @@ -225,10 +225,10 @@ def specyficPrimaryNumber end #################################### -# Funkcja nwd(a,b) +# Funkcja generator(a,b) # -# Oblicza nwd podanych liczb np -# nwd(10,14) => 2 +# Generuje generator dla podanych liczb +# do RSA i ElGamala # #################################### def generator(p,q) @@ -243,10 +243,10 @@ def generator(p,q) end #################################### -# Funkcja nwd(a,b) +# Funkcja generate(n) # -# Oblicza nwd podanych liczb np -# nwd(10,14) => 2 +# Generator liczby losowej o podanej +# n-bitowej liczbie # #################################### def generate(n) @@ -254,22 +254,52 @@ def generate(n) end #### MODULE 2 #### + +#################################### +# Funkcja returnRownanie(a,b,p) +# +# Zwraca ładniejszą formę równania +# +#################################### def returnRownanie(a,b,p) puts puts "Równanie krzywej jest równe: " + "Y^2 = X^3+" + a.inspect + "X+" + b.inspect + " mod "+ p.inspect puts end +#################################### +# Funkcja delta(a,b,p) +# +# Oblicza deltę dla krzywej +# eliptycznej o podanych parametrach +# a,b nad ciałem F_p +# +#################################### def delta(a,b,p) d = ((4 * betterExponentiation(a,3,p) % p) + (27 * betterExponentiation(b,2,p) % p)) % p return d end +#################################### +# Funkcja rownanieKrzywej(a,b,p,x) +# +# Oblicza wartość fx dla podanej +# krzywej eliptycznej o podanych +# parametrach a,b,p,x +# +#################################### def rownanieKrzywej(a,b,p,x) fx = ((betterExponentiation(x,3,p) + (a * x) % p + b % p) % p) % p return fx end +#################################### +# Funkcja generatorKrzywej(p) +# +# Generuje krzywą o podanej liczbie +# pierwszej p. +# +#################################### def generatorKrzywej(p) a = 0 b = 0 @@ -298,6 +328,14 @@ def generatorKrzywej(p) end end +#################################### +# Funkcja punktNaKrzywej(a,b,p) +# +# Zwraca losowy punkt na krzywej +# eliptycznej o podanych wartościach +# a,p,p. +# +#################################### def punktNaKrzywej(a,b,p) if (delta(a,b,p) != 0) && (p % 4 == 3) while true @@ -311,6 +349,13 @@ def punktNaKrzywej(a,b,p) end end +#################################### +# Funkcja czyPunktNalezyDoKrzywej(a,b,p,x,y) +# +# Sprawdza czy podany punkt nalezy +# do krzywej eliptycznej. +# +#################################### def czyPunktNalezyDoKrzywej(a,b,p,x,y) fx = rownanieKrzywej(a,b,p,x) @@ -321,10 +366,23 @@ def czyPunktNalezyDoKrzywej(a,b,p,x,y) end end +#################################### +# Funkcja punktPrzeciwny(x,y) +# +# Zwraca przeciwny punkt dla (x,y) +# +#################################### def punktPrzeciwny(x,y) return x,-y end +#################################### +# Funkcja sumaPunktow(a,b,p,x1,y1,x2,y2) +# +# Oblicza sumę punktów na krzywej +# eliptycznej dla podanych a,b,p,x1,y1,x2,y2 +# +#################################### def sumaPunktow(a,b,p,x1,y1,x2,y2) # 0 - element neutrany --> P + 0 = P if (x1 == "e" && y1 == "e" ) @@ -354,6 +412,13 @@ def sumaPunktow(a,b,p,x1,y1,x2,y2) end #### MODULE 3 #### + +#################################### +# Funkcja wielokrotnoscPunktu(a,b,p,n,x,y) +# +# Oblicza wielokrotność punktów np. +# 2n = n + n +#################################### def wielokrotnoscPunktu(a,b,p,n,x,y) punktQ = [x,y] punktR = ["e","e"] @@ -369,6 +434,12 @@ def wielokrotnoscPunktu(a,b,p,n,x,y) return punktR end +#################################### +# Funkcja liczenieOrd(a,b,p) +# +# Oblicza wartość ord dla podanych +# a,b,p. +#################################### def liczenieOrd(a,b,p) threads = [] punktyNaKrzywej = Array.new @@ -407,6 +478,12 @@ def liczenieOrd(a,b,p) return unikalnePunktyNaKrzywej.count end +#################################### +# Funkcja generowanieKluczyElGamalKrzywaEliptyczna(k) +# +# Generatoruje klucz publiczny +# oraz prywatny. +#################################### def generowanieKluczyElGamalKrzywaEliptyczna(k) while true p = generate(k) @@ -433,6 +510,10 @@ def generowanieKluczyElGamalKrzywaEliptyczna(k) end end +#################################### +# Funkcja algorytmKodowania(a,b,p,m,n,u) +# +#################################### def algorytmKodowania(a,b,p,m,n,u) if (m < n) && (p > n*u) for i in 1..u @@ -448,11 +529,22 @@ def algorytmKodowania(a,b,p,m,n,u) return [x,y] end +#################################### +# Funkcja algorytmDeKodowania(a,b,p,x,y,n,u) +# +# Zwraca odszyfrowaną wiadomość. +#################################### def algorytmDeKodowania(a,b,p,x,y,n,u) m = (x - 1) / u return m end +#################################### +# Funkcja szyfrowanieElGamala(m,n,u,a,b,p,px,py,qx,qy) +# +# Koduje wiadomość na punkt na krzywej +# eliptycznej. +#################################### def szyfrowanieElGamala(m,n,u,a,b,p,px,py,qx,qy) c = algorytmKodowania(a,b,p,m,n,u) puts "Wiadomość na prostej jako punkt #{c.inspect}"