Advertisement
Smiechu

ElGamal v2

Dec 18th, 2022
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.21 KB | Cybersecurity | 0 0
  1. import random
  2. import secrets
  3.  
  4. def NWD(a,b):
  5.     temp = 0
  6.     while(a != b):
  7.         if(a == 1 or b == 1):
  8.             return 1
  9.         elif(a > b):
  10.             a = a - b
  11.         elif(a < b):
  12.             b = b - a
  13.  
  14.     if(a == b):
  15.         return a
  16.     elif(a > b):
  17.         return b
  18.     elif(b > a):
  19.         return a
  20.  
  21. def element_odwrotny(A, M):
  22.     m0 = M
  23.     y = 0
  24.     x = 1
  25.  
  26.     if (M == 1):
  27.         return 0
  28.  
  29.     while (A > 1):
  30.         q = A // M
  31.  
  32.         t = M
  33.  
  34.         M = A % M
  35.         A = t
  36.         t = y
  37.  
  38.         y = x - q * y
  39.         x = t
  40.  
  41.     if (x < 0):
  42.         x = x + m0
  43.  
  44.     return x
  45.  
  46.  
  47. def potegowanie_binarne(b, e, m):
  48.     if m == 1:
  49.         return 0
  50.     else:
  51.         r = 1
  52.         b = b % m
  53.         while e > 0:
  54.             if e % 2 == 1:
  55.                 r = (r*b) % m
  56.             b = (b*b) % m
  57.             e = e >> 1
  58.  
  59.     return r
  60.  
  61.  
  62. def test_fermata(n):
  63.     n=int(n)
  64.     a=random.randint(2,n-2)
  65.     r=potegowanie_binarne(a,(n-1),n)
  66.     if r == 1:
  67.         return True
  68.     else:
  69.         return False
  70.  
  71.  
  72. def reszta_kwadratowa(prime, num):
  73.     result = potegowanie_binarne(num, int((prime-1)/2), prime)
  74.     if result == prime-1:
  75.         return 0
  76.     if result == 1:
  77.         return 1
  78.  
  79. def losuj(podloga, sufit):
  80.     liczba = podloga
  81.     while(liczba < podloga + 1):
  82.         liczba = secrets.randbelow(sufit)
  83.  
  84.     return liczba
  85.  
  86.  
  87. #GENEROWANIE KLUCZA
  88. bity = 10
  89. q = secrets.randbits(bity)
  90. pierwszosc_q = test_fermata(q)
  91. pierwszosc_p = False
  92. licznik = 0
  93.  
  94. while(pierwszosc_q == False or pierwszosc_p == False):
  95.     q = secrets.randbits(bity)
  96.     pierwszosc_q = test_fermata(q)
  97.     liczba_testow = 0
  98.     while(pierwszosc_q == False):
  99.             pierwszosc_q = test_fermata(q)
  100.             liczba_testow = liczba_testow + 1
  101.             if (liczba_testow == 30):
  102.                     break
  103.     licznik = licznik + 1
  104.     p = 2 * q + 1
  105.     pierwszosc_p = test_fermata(p)
  106.  
  107. g = losuj(1,p)
  108. print("LOSOWANIE G PRZED PETLA:")
  109. print("NWD(p,g) = ", NWD(p,g))
  110. g_2 = potegowanie_binarne(g,2,p)
  111. g_q = potegowanie_binarne(g,q,p)
  112.  
  113. print("\n")
  114. print("### GENEROWANIE KLUCZA ###\n")
  115. print("p =", p)
  116. print("q =", q)
  117. print("")
  118. print("g =", g)
  119. print(f"g^2 (mod p) = {g}^2 (mod {p}) = {g_2}")
  120. print(f"g^q (mod p) = {g}^{q} (mod {p}) = {g_q}")
  121. print("PRZED PETLA LOSOWANIA Gie")
  122.  
  123. while(NWD(p,g) != 1):
  124.     g = losuj(1,p)
  125.  
  126. while(g_2 == 1 or g_q == 1):
  127.     g = losuj(1,p)
  128.     g_2 = potegowanie_binarne(g,2,p)
  129.     g_q = potegowanie_binarne(g,q,p)
  130.        
  131.  
  132. print("PO PETLI LOSOWANIA G")
  133. print(f"g^2 (mod p) = {g}^2 (mod {p}) = {g_2}")
  134. print(f"g^q (mod p) = {g}^{q} (mod {p}) = {g_q}")
  135.  
  136. x = losuj(1,p-1)
  137.  
  138. y = potegowanie_binarne(g,x,p)
  139.  
  140. print("g =", g)
  141. print("NWD(p,g) = ", NWD(p,g))
  142. print("x = ", x)
  143. print("y = ", y)
  144.  
  145. #SZYFROWANIE
  146.  
  147. print("### SZYFROWANIE ###")
  148.  
  149. M = 421807
  150. z = losuj(1,p-1)
  151. c_1 = potegowanie_binarne(g,z,p)
  152. c_2 = M * potegowanie_binarne(y,z,p)
  153.  
  154. print("M = ", M)
  155. print("z = ", z)
  156. print("c_1 = ", c_1)
  157. print("c_2 = ", c_2)
  158.  
  159. #DESZYFROWANIE
  160.  
  161. print("### DESZYFROWANIE ###")
  162.  
  163. #x = x * -1
  164. bez_c_2 = potegowanie_binarne(c_1,x,p)
  165. c_1_inv = element_odwrotny(c_1, p)
  166. M_decrypt = c_2 * potegowanie_binarne(c_1_inv,x,p)
  167.  
  168.  
  169. print("c_1^-1 = ", c_1_inv)
  170. print("bez_c_2 = ", bez_c_2)
  171. print("M_decrypt = ", M_decrypt)
  172.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement