Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.07 KB | None | 0 0
  1. import random
  2. import time
  3. from builtins import int
  4. from typing import Dict, List
  5.  
  6. size: int = 0
  7.  
  8.  
  9. class Country:
  10. secret: int
  11. restoredSecret: int
  12. sharesCount: int
  13. threshold: int
  14. secretShares = Dict[int, int]
  15.  
  16. def __init__(self, secret: int, sharesCount: int, threshold: int) -> None:
  17. self.secret = secret
  18. self.sharesCount = sharesCount
  19. self.threshold = threshold
  20.  
  21.  
  22. def isPrime(n: int) -> bool: # Test czy wylosowana liczba jest liczba pierwsza
  23. """
  24. Miller-Rabin primality test.
  25.  
  26. A return value of False means n is certainly not prime. A return value of
  27. True means n is very likely a prime.
  28. """
  29. if n != int(n):
  30. return False
  31. n = int(n)
  32. # Miller-Rabin test for prime
  33. if n == 0 or n == 1 or n == 4 or n == 6 or n == 8 or n == 9:
  34. return False
  35.  
  36. if n == 2 or n == 3 or n == 5 or n == 7:
  37. return True
  38. s = 0
  39. d = n - 1
  40. while d % 2 == 0:
  41. d >>= 1
  42. s += 1
  43. assert (2 ** s * d == n - 1)
  44.  
  45. def trial_composite(a):
  46. if pow(a, d, n) == 1:
  47. return False
  48. for i in range(s):
  49. if pow(a, 2 ** i * d, n) == n - 1:
  50. return False
  51. return True
  52.  
  53. for i in range(8): # number of trials
  54. a = random.randrange(2, n)
  55. if trial_composite(a):
  56. return False
  57.  
  58. return True
  59.  
  60.  
  61. def egcd(a, b):
  62. if a == 0:
  63. return b, 0, 1
  64. g, y, x = egcd(b % a, a)
  65. return g, x - (b // a) * y, y
  66.  
  67.  
  68. def modinv(a, m): # Inversja modulo
  69. g, x, y = egcd(a, m)
  70. if g != 1:
  71. raise Exception('No modular inverse')
  72. return x % m
  73.  
  74.  
  75. def getProbablePrime(size: int):
  76. while True:
  77. prime = random.getrandbits(size) # Generuj liczbe o podanym rozmiarze dopki nie bedzie to liczba pierwsza
  78. if isPrime(prime): # o zadanej wielkosci
  79. return prime
  80.  
  81.  
  82. def shareSecret(country: Country, p: int) -> Dict[int, int]: # Tworzenie cieni
  83. A: List[int] = list()
  84.  
  85. for i in range(0, country.threshold - 1):
  86. A.append(random.getrandbits(size))
  87.  
  88. allShares: Dict[int, int] = dict()
  89.  
  90. for i in range(1, country.sharesCount + 1):
  91. v: int = 0
  92. for j in range(0, country.threshold - 1):
  93. v = v + (A[j] * (i ** (country.threshold - j - 1)))
  94. v = v + country.secret
  95. allShares[i] = v % p
  96. print(f"\t{i} : {allShares[i]}")
  97.  
  98. return allShares
  99.  
  100.  
  101. def pickShares(country: Country) -> Dict[int, int]: # Wybranie cieni aby odtworzyc sekret potrzebnych jest tyle
  102. givenSharesIdx: List[int] = list() # ile wyznaczonych do odtworzenia jest w danym kraju
  103. while len(givenSharesIdx) != country.threshold:
  104. shareNr: int = random.randrange(1, country.sharesCount + 1)
  105. if shareNr in givenSharesIdx:
  106. continue
  107. givenSharesIdx.append(shareNr)
  108.  
  109. givenShares: Dict[int, int] = dict()
  110. for s in country.secretShares.keys():
  111. if s in givenSharesIdx:
  112. givenShares[s] = country.secretShares[s]
  113. # print(f"\t{s}: {givenShares[s]}")
  114. return givenShares
  115.  
  116.  
  117. def restoreSecret(givenShares: Dict[int, int], p: int) -> int:
  118. secret: int = 0
  119. for i in givenShares.keys():
  120. tmp: int = givenShares[i] * delta(i, givenShares, p) # Odszyfrowanie sekretu
  121. secret = secret + (tmp % p) # Wykorzystujac pod-funckje delta
  122.  
  123. return secret % p
  124.  
  125.  
  126. def delta(i: int, shares: Dict[int, int], p: int) -> int: # Tworzenie mini-funkcji dla kazdego z odwiedzanych punktow
  127. res: int = 1 # wspoltworzacych wielomian sekretu
  128. for s in shares.keys():
  129. if s != i:
  130. denominator: int = (i - s) % p
  131. tmp: int = -s % p
  132. r: int = tmp % p * modinv(denominator, p)
  133. r = r % p
  134. res = res * r
  135. return res
  136.  
  137.  
  138. if __name__ == '__main__':
  139. random.seed()
  140. size = int(input("Podaj rozmiar:"))
  141.  
  142. p: int = getProbablePrime(size + 5) # Wyznaczenie wartosci p do operacji modulo
  143. secret: int = random.getrandbits(size) # Wyznaczenie wartosci sekretu o zadanej wielkosci
  144.  
  145. print("------------- ETAP 1 -------------")
  146. print("------------- Podział sekretu głównego -------------\n")
  147. print(f"Sekret to: {secret}")
  148.  
  149. countriesCnt: int = 3
  150. print(f"Dzielę sekret na {countriesCnt} państw")
  151.  
  152. secretShares: List[int] = list()
  153. currShares: int = 0
  154.  
  155. for i in range(0, countriesCnt - 1): # Generowanie sekretow poszczegolnych panstw
  156. share: int = random.getrandbits(size)
  157. secretShares.append(share)
  158. currShares = currShares ^ share
  159. print(f"Sekret państwa {i + 1} to {share}")
  160.  
  161. secretShares.append(currShares ^ secret)
  162.  
  163. print(f"Sekret państwa {countriesCnt} to {currShares ^ secret}")
  164.  
  165. print("\n------------- ETAP 2 -------------")
  166. print("------------- Podział sekretu państwa -------------\n")
  167.  
  168. countries: List[Country] = list()
  169. # Lista krajow do odtworzenia sekretu, kraj pierwszy ma 6 senatorow i aby odtworzyc swoj sekret potrzebuje 3
  170. # senatorow, drugi ma czterech i potrzebuje 3 , trzeci kraj ma 10 i potrzebuje az 6 aby odtworzyc sekret
  171. countries.append(Country(secretShares[0], 6, 3))
  172. countries.append(Country(secretShares[1], 4, 3))
  173. countries.append(Country(secretShares[2], 10, 6))
  174.  
  175. for i in range(0, len(countries)):
  176. x: Country = countries[i]
  177. print(f"Cienie państwa {i + 1}:")
  178. x.secretShares = shareSecret(x, p) # Generowanie cieni dla poszczegolnych panstw
  179.  
  180. print("\n------------- ETAP 3 -------------")
  181. print("------------- Odszyfrowanie sekretów państw -------------\n")
  182.  
  183. print("------------- Odszyfrowanie głównego sekretu -------------\n")
  184.  
  185. recreationTimes = [0, 0, 0]
  186. start1 = time.time_ns()
  187. for _ in range(0, 1000):
  188. for i in range(0, len(countries)):
  189. x: Country = countries[i]
  190. # print(f"Wybór losowych cieni państwa {i + 1}")
  191. start = time.time_ns()
  192. givenShares: Dict[int, int] = pickShares(x) # Wybranie odpowiednich cieni aby odtworzyc sekret
  193. restoredSecret: int = restoreSecret(givenShares, p) # Odszyfrowanie sekretu danego Pnastwa
  194. stop = time.time_ns()
  195. # print(f"\t\tSekretem państwa {i + 1} jest {restoredSecret}")
  196. x.restoredSecret = restoredSecret
  197. recreationTimes[i] += stop - start
  198. stop1 = time.time_ns()
  199.  
  200. print("\n------------- ETAP 4 -------------")
  201. print("------------- Odszyfrowanie głównego sekretu -------------\n")
  202.  
  203. result: int = 0
  204. for i in range(0, len(countries)):
  205. result = result ^ countries[i].restoredSecret # otrzymanie sekretu glownego z sekretow poszczegolnych krajow
  206. print(f"Odtwarzanie sekretu dla kraju nr {i + 1} : {recreationTimes[i]/(10**6)}")
  207. print(f"Czas wspolny odtwarzania: {(stop1 - start1)/(10**6)}")
  208. print(f"Odszyfrowany sekret to {result}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement