Added function

Signed-off-by: Marcin Woźniak <y0rune@aol.com>
This commit is contained in:
Marcin Woźniak 2021-01-02 14:42:22 +01:00
parent ec4a4773cc
commit 47a90f46a9
Signed by: y0rune
GPG Key ID: F204C385F57EB348
2 changed files with 20 additions and 24 deletions

View File

@ -34,8 +34,9 @@ def main
puts "Ciphers: #{c1} + #{c2}" puts "Ciphers: #{c1} + #{c2}"
# ALICE # ALICE
xc1 = wielokrotnoscPunktu(a,b,p,x,c1[0],c1[1]) #xc1 = wielokrotnoscPunktu(a,b,p,x,c1[0],c1[1])
pmd = sumaPunktow(a,b,p,c2[0],c2[1],xc1[0],-xc1[1]) #pmd = sumaPunktow(a,b,p,c2[0],c2[1],xc1[0],-xc1[1])
pmd = deSzyfrowanieElGamala(a,b,p,c1[0],c1[1],c2[0],c2[1],x)
d = algorytmDeKodowania(a,b,p,pmd[0],pmd[1],n,u) d = algorytmDeKodowania(a,b,p,pmd[0],pmd[1],n,u)
puts "Dekodowana wiadomość #{d.inspect}" puts "Dekodowana wiadomość #{d.inspect}"
end end

View File

@ -445,37 +445,26 @@ end
# Oblicza wartość pierwiastka z dużych # Oblicza wartość pierwiastka z dużych
# liczb # liczb
# #
# Źródło: https://codegolf.stackexchange.com/questions/85555/the-fastest-square-root-calculator # Źródło: https://stackoverflow.com/questions/8226087/how-do-i-get-math-sqrt-to-return-a-bignum-and-not-a-float
################################################################################# #################################################################################
def mysqrt(n) def mysqrt(x)
highest = 1 return 0 if x==0
sqrt_highest = 1 m=x
while highest < n p=x
highest <<= 2 loop do
sqrt_highest <<= 1 r=(m+p/m)/2
return m if m<=r
m=r
end end
n /= highest+0.0
result = (n/4) + 1
result = (result/2) + (n/(result*2))
result = (result/2) + (n/(result*2))
return result*sqrt_highest
end end
################################################################################# #################################################################################
# Funkcja liczenieOrd(p) # Funkcja liczenieOrd(p)
# #
# Oblicza wartość ord dla podanych p. # Oblicza wartość ord dla podanych p.
# Wynik jest zaokrąglany do podłogi, jeżeli chodzi o `mysqrt(p).to_i`
#
# Np.
# 2 * mysqrt(8) => 5.68756145526057
# (2 * mysqrt(8)).to_i => 5
################################################################################# #################################################################################
def liczenieOrd(p) def liczenieOrd(p)
ord = (p + 1 - (2 * mysqrt(p)).to_i ) % p ord = (p + 1 - (2 * mysqrt(p))) % p
return ord return ord
end end
@ -551,3 +540,9 @@ def szyfrowanieElGamala(m,n,u,a,b,p,px,py,qx,qy)
puts "Wiadomość na prostej jako punkt #{c.inspect}" puts "Wiadomość na prostej jako punkt #{c.inspect}"
return c return c
end end
def deSzyfrowanieElGamala(a,b,p,c1x,c1y,c2x,c2y,x)
xc1 = wielokrotnoscPunktu(a,b,p,x,c1x,c1y)
pmd = sumaPunktow(a,b,p,c2x,c2y,xc1[0],-xc1[1])
return pmd
end