Advertisement
Guest User

gmpy2-rsa.py

a guest
Nov 15th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.36 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #-*- coding: utf-8 -*-
  3.  
  4. import gmpy2
  5. from gmpy2 import mpz
  6.  
  7. bit_count = 64
  8. rand_state = gmpy2.random_state(42)
  9.  
  10. def generate_prime(bits):
  11.     temp = gmpy2.mpz_rrandomb(rand_state, bit_count)
  12.     return gmpy2.next_prime(temp)
  13.  
  14. # Настройка шифрования
  15. #
  16. p = generate_prime(bit_count)
  17. q = generate_prime(bit_count)
  18. assert(p != q)
  19.  
  20. n = gmpy2.mul(p, q)
  21. phi = gmpy2.mul(p-1, q-1)
  22.  
  23. print("p: %d" % p)
  24. print("q: %d" % q)
  25. print("n: %d" % n)
  26. print("phi: %d" % phi)
  27.  
  28.  
  29. # Генерация ключей
  30. #
  31. # Выберите 1 < e < phi такое что НОД(e, phi) = 1
  32. # e будет нашим открытым ключом
  33. #
  34. # Выберите d - мультипликативно обратное e в Z/phi
  35. # d будет нашим закрытым ключом
  36. #
  37. e = gmpy2.mpz_random(rand_state, phi)
  38. while (e <= 1 or gmpy2.gcd(e, phi) != 1):
  39.     e = gmpy2.mpz_random(rand_state, phi)
  40. assert(e > 1)
  41. assert(gmpy2.gcd(e, phi) == 1)
  42.  
  43. d = gmpy2.invert(e, phi)
  44. assert(d != 1)
  45. assert(gmpy2.t_mod(e*d, phi) == 1)
  46.  
  47. print("PK(e): %d" % e)
  48. print("SK(d): %d" % d)
  49.  
  50.  
  51. # Шифрование и Дешифрование
  52. #
  53. m = mpz(123456789101112131415)
  54. c = gmpy2.powmod(m, e, n)
  55. m_rec = gmpy2.powmod(c, d, n)
  56.  
  57. print("Original message: %d" % m)
  58. print("Ciphertext: %d" % c)
  59. print("Recovered message: %d" % m_rec)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement