Advertisement
Guest User

diffie hellman python

a guest
Apr 23rd, 2014
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.80 KB | None | 0 0
  1. def dif_hel(upper_bound = 1e4):
  2.  
  3. from random import randrange
  4. primes = get_primes(n = upper_bound, mode = 1)
  5. global a, A, b, B, s
  6. # create list of all primes up to upper_bound
  7.  
  8. while True:
  9. p = input("Enter a prime number in range 3 to %r or enter 'r' for random: "
  10. % primes[-1])
  11. if p == 'r' or p == 'R':
  12. p = primes[randrange(1, len(primes)-1)]
  13. break
  14. # set p to random number from 'primes'
  15. else:
  16. p = int(p)
  17. if p > primes[-1] or p not in primes[1:]:
  18. print("%r is out of bounds or not prime." % p)
  19.  
  20. if p in range(3,primes[-1]):
  21. next_prime = 0
  22. i = 0
  23. while next_prime == 0:
  24. i += 1
  25. if primes.count(p+i) > 0:
  26. next_prime = p+i
  27. break
  28. answer = input("Use %r instead? y/n: " % next_prime)
  29. if answer == 'y' or answer == 'Y' or answer == str(next_prime):
  30. p = next_prime
  31. break
  32. else:
  33. break
  34. print("Prime number:", p, "\n")
  35.  
  36. possible_roots = []
  37. for base in primes[:4]:
  38. if is_primitive(g = base, n = p) and base < p:
  39. possible_roots.append(base)
  40. if len(possible_roots) == 0:
  41. print("Error: found no suitable base for", p)
  42. return
  43. elif len(possible_roots) == 1:
  44. print("Found only one suitable base for", p)
  45. g = possible_roots[0]
  46. else:
  47. while True:
  48. g = input("Enter a base from %r or enter 'r' for random: " % possible_roots)
  49. if g == 'r' or g == 'R':
  50. g = possible_roots[randrange(len(possible_roots)-1)]
  51. break
  52. # set g to random number from 'possible_roots'
  53. else:
  54. g = int(g)
  55. if g not in possible_roots:
  56. print("%r is out of bounds." % p)
  57. else:
  58. break
  59. print("Base:", g, "\n")
  60.  
  61. a = int(input("Enter your secret number (do not divulge!): "))
  62. A = g**a % p
  63. b = randrange(int(upper_bound/2))
  64. ### these next two lines may belong in their own mode:
  65. B = g**b % p
  66. s = B**a % p
  67. #######
  68. print("Your public key:", A, "\n")
  69. B = int(input("Enter partner's public key: "))
  70. print("Your partner's public key:", B, "\n")
  71. s = B**a % p
  72. print("Shared secret:", s)
  73.  
  74.  
  75. def get_primes(n, mode=0):
  76. """ mode 0: generates n primes
  77. mode 1: generates all primes up to n """
  78.  
  79. primes = [] # = list for n primes
  80. dividend = 2 # = integer to be tested
  81. is_prime = 1 # 'dividend' is presumed prime at the outset
  82.  
  83. while len(primes) < n:
  84. if is_prime == 1:
  85. primes.append(dividend)
  86. # if no divisor has been found for 'dividend', add to 'primes'
  87.  
  88. if mode == 1 and dividend >= n:
  89. return primes
  90. # (see above for mode explanation)
  91.  
  92. dividend += 1
  93. is_prime = 1
  94.  
  95. for divisor in primes:
  96. if divisor > dividend**(1/2):
  97. break
  98. # stop checking once 'divisor' > square root of 'dividend'
  99.  
  100. if dividend % divisor == 0:
  101. is_prime = 0
  102. break
  103. # break out of loop if divisor is found
  104.  
  105. return primes
  106.  
  107. def is_primitive(g,n):
  108.  
  109. group = [g**k % n for k in range(1,n)]
  110.  
  111. if group[0] in group[1:]:
  112. return False
  113. else:
  114. return True
  115. # check whether the period of g**k % n < n-1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement