Facebook
From Round Pig, 3 Years ago, written in Python.
Embed
Download Paste or View Raw
Hits: 58
  1. import datetime
  2. import hashlib
  3. import codecs
  4.  
  5. # + DANE WEJSCIOWE PRZYPADKU TESTOWEGO:
  6. g = 2
  7. p = 826 * (2^256 + 297) + 1
  8. A = 42463453489046421827996953285270976791039960776773031565373820328717752373085105
  9. B = 74431962970322258898740862853418488921843421761336220388456850850534859078805104
  10. INTERVAL_BEG = datetime.datetime(2020, 4, 2, 8, 0, 0)
  11. INTERVAL_END = datetime.datetime(2020, 4, 2, 16, 0, 1)
  12.  
  13. # + funkcja od niego, nic ciekawego
  14. def Alice_secret_gen(rand):
  15.     h = hashlib.sha256()
  16.     h.update(bin(rand).encode("UTF-8"))
  17.     _digest = h.digest()
  18.     secret = int(codecs.encode(_digest, 'hex'), 16)
  19.     return secret
  20.  
  21. # 1
  22. EPOCH = datetime.datetime(1970, 1, 1)
  23.  
  24. # + _datetime zawiera jedną z tych dat co chcemy sprawdzić a epoch datę początku epoki więc żeby obliczyć
  25. # + czas jaki minał od epoki do danej daty można, wykorzystując format datetime odjąć je od siebie.
  26. # + Efekt tego otrzymujemy okres czasu. Aby z tego okresu wyciągnąć liczbę sekund, możemy użyć funkcji dla datetime
  27. # + jaką jest .total_seconds(). Zwraca ona float (1585814400.0) a jako że to jest liczba całkowita to nie potrzebujemy jej w float
  28. # + stąd konwersja na całkowite poprzez int().
  29. def seconds_since_epoch(_datetime):
  30.     return int((_datetime - EPOCH).total_seconds())
  31.  
  32.  
  33. # zakres poszukiwanych wartości RAND
  34. beg = seconds_since_epoch(INTERVAL_BEG)
  35. end = seconds_since_epoch(INTERVAL_END)
  36.  
  37.  
  38.  
  39. # 2
  40.  
  41. # Wejście:
  42. # - g – generator ciała
  43. # - prime - liczba pierwsza definiująca ciało
  44. # - secret – tajny klucz
  45. # + Proste, podnosimy g^secret w ciele prime, wykorzystując funkcję którą tam pod koniec zadania podał
  46. def public_component(g, prime, secret):
  47.     return pow(g, secret, prime)
  48.  
  49.  
  50. # Wejście:
  51. # - rcv – otrzymany component publiczny
  52. # - prime - liczba pierwsza definiująca ciało
  53. # - secret – tajny klucz
  54. # Wyjście:
  55. # wspólny klucz kryptograficzny
  56. # + Jak wyżej, klucz wspólny w Diffie-Hellman'ie to podniesienie klucza publicznego drugiej osoby do swojego sekretu
  57. def common_key(rcv, prime, secret):
  58.     return pow(rcv, secret, prime)
  59.  
  60.  
  61. # 3
  62.  
  63. # sprawdzanie, czy i jest źródłem losowości
  64. # tj. czy Alice_secret_gen(i) jest sekretną wartością Alicji
  65. # + Niewiadomą jest sekret alicji, ale mamy podany jej klucz publiczny (pod A) i wszystko inne więc
  66. # + wystarczy dla każdego możliwego i sprawdzać czy wygenerowany przy jego pomocy klucz publiczny się zgadza.
  67. # + Jak już na taki trafimy to wykorzystujemy napisane wcześniej funkcje żeby policzyć co chce, wypisać mu to ładnie
  68. # + i dodałem też potwierdzenie że te klucze publiczne się zgadzają
  69. for i in range(beg, end):
  70.     if public_component(g, p, Alice_secret_gen(i)) == A:
  71.         k = common_key(B, p, i)
  72.         s = Alice_secret_gen(i)
  73.         kp = public_component(g, p, s)
  74.         print("s =", s)
  75.         print("k =", k)
  76.         print("i =", i)
  77.         print("Klucz publiczny Alice (wykorzystując s) = ", kp)
  78.         if kp == A:
  79.             print("Klucze publiczne się zgadzają")