大素数的生成算法验证
郝伟 2022/06/24
生成1024位的大素数的生成算法。
…
1024 bit prime is:
161597389454119846040844295762016440901152205096496815100669539003114282897647310227855945279208505572483227781657391334098337320607749325433257709656139061098173376537708296916107118054400614170759263672363294529891003645964237374886942278876428155573516373357615930942317993234662741215675736259443494894731
# How to generate Large Prime numbers for RSA Algorithm # https://www.geeksforgeeks.org/how-to-generate-large-prime-numbers-for-rsa-algorithm/ # Large Prime Generation for RSA, Pre generated primes according to # [1] Miller Rabin Primlity Test, https://www.geeksforgeeks.org/primality-test-set-3-miller-rabin/ # import random, math def isPrime(n): for i in range(2, int(math.sqrt(n)) + 1): if n % i == 0: return False return True small_primes = [] for i in range(2, 1024): if isPrime(i): small_primes.append(i) # why 349? because 349*3=1047 > 1024 small_primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349] def is_prime(n): for divisor in small_primes: if pc % divisor == 0 and divisor**2 <= pc: return False else: return True def getLowLevelPrime(n): '''Generate a prime candidate divisible by first primes''' while True: # Obtain a random number and test divisibility by pre-generated primes pc = random.randrange(2 ** (n - 1) + 1, 2 ** n - 1) for divisor in small_primes: if pc % divisor == 0 and divisor**2 <= pc: break else: return pc def isMillerRabinPassed(mrc): '''Run 20 iterations of Rabin Miller Primality test''' maxDivisionsByTwo = 0 ec = mrc-1 while ec % 2 == 0: ec >>= 1 maxDivisionsByTwo += 1 assert(2**maxDivisionsByTwo * ec == mrc-1) def trialComposite(round_tester): if pow(round_tester, ec, mrc) == 1: return False for i in range(maxDivisionsByTwo): if pow(round_tester, 2**i * ec, mrc) == mrc-1: return False return True # Set number of trials here numberOfRabinTrials = 100 for i in range(numberOfRabinTrials): round_tester = random.randrange(2, mrc) if trialComposite(round_tester): return False return True while True: print('.', end='') n = 1024 prime_candidate = getLowLevelPrime(n) if isMillerRabinPassed(prime_candidate): print(f"\n{n} bit prime is: \n{prime_candidate}") break