jukaukor

RSAPrivatKeyComputing.py

Aug 8th, 2019
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.32 KB | None | 0 0
  1. # RSA salauksen murtaminen onnistuu, kun ensin
  2. # lasketaan julkisen kokonaislukuavaimen n tulontekijät p ja q
  3. # Sitten alkulukujen p ja q sekä julkisen eksponentin e avulla
  4. # lasketaan privaatti purkuavain d
  5. # Edellytyksenä on, että julkinen avain n on tarpeeksi lyhyt
  6. # jolloin sen alkulukutekijät voidaan laskea
  7.  
  8. # Juhani Kaukoranta 8.8.2019
  9. import math
  10. import time
  11. # numba-kääntä & njit nopeuttaa laskentaa 10-kertaiseksi
  12. # jolloin risuaidat numban ja njit edestä pois
  13. # pienillä avaimilla < 32 bit ei hyötyä
  14. # suurilla avaimilla laskenta-aika kasvaa todella suureksi
  15. #from numba import njit
  16.  
  17. # Avaimen n factorointi
  18. #@njit
  19. def factor(n):
  20. for x in range(3, int(math.sqrt(n)) + 1,2):
  21. if n % x == 0:
  22. p = x
  23. q = n // x
  24. factors = [p,q]
  25. return factors
  26.  
  27. # apufunktio extended euclidean algoritm
  28. # ax + by = gcd(a,b)
  29. # käytetään modular inverse modinv(a,m)-funktiossa
  30. def extended_gcd(aa, bb):
  31. lastremainder, remainder = abs(aa), abs(bb)
  32. x, lastx, y, lasty = 0, 1, 1, 0
  33. while remainder:
  34. lastremainder, (quotient, remainder) = remainder, divmod(lastremainder, remainder)
  35. x, lastx = lastx - quotient*x, x
  36. y, lasty = lasty - quotient*y, y
  37. return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1)
  38.  
  39. # least common multiple tarvitaan privaatin purkuavaimen d laskemiseen
  40. def lcm(x, y):
  41. return x*y // math.gcd(x,y)
  42.  
  43. # modular inverse tarvitaan privaatin purkuavaimen d laskemiseen
  44. def modinv(a, m):
  45. g, x, y = extended_gcd(a, m)
  46. if g != 1:
  47. raise ValueError
  48. return x % m
  49.  
  50. # *** Pääohjelma ***
  51. e = 65537 # julkinen suositeltu eksponentti
  52. n = int(input("Anna julkinen salausavain n: "))
  53. time0 = time.perf_counter() # timer begin
  54. [p,q] = factor(n)
  55. print("Avaimen n alkulukutekijät = ",[p,q])
  56. time1 = time.perf_counter() # timer stop
  57. print("Aikaa kului ",time1 - time0," sekuntia")
  58. print("p = ",p)
  59. print("q = ",q)
  60. print("Tarkistus p * q = ",p,"*",q," = ",p*q)
  61.  
  62. # Saatujen alkulukujen p ja q sekä eksponentin avulla
  63. moduli = lcm(p-1,q-1) # "Carmichaelin totientti"
  64. d = modinv(e,moduli) # purkuavain d
  65. print("Privaatti purkuavain d = ",d)
  66. # Avaimet
  67. print("Julkinen avain n = ",n)
  68. print("Julkinen eksponentti e = ",e)
  69. print("Privaatti purkuavain d = ",d)
Advertisement
Add Comment
Please, Sign In to add comment