me30

misc_crypto.py

Dec 7th, 2020
382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.01 KB | None | 0 0
  1. import math, random, sys
  2.  
  3. def gcd(a, b, verbose=False):
  4.     if a < b:
  5.         a, b = b, a
  6.     #initialization m -> μ, l = λ, m_1 means μ₋₁ (\u03BC\u208b\u2081)
  7.     #i = 0
  8.     r_1 = a
  9.     r0 = b
  10.     l_1 = 1
  11.     m_1 = 0
  12.     l0 = 0
  13.     m0 = 1
  14.     #computation
  15.     while(a * l0 + b * m0 == r0):
  16.         q = r_1 // r0
  17.         if(verbose):
  18.             print(f'r_1 = {r_1}, r0 = {r0}')
  19.             print(f'l_1 = {l_1}, l0 = {l0}')
  20.             print(f'm_1 = {m_1}, m0 = {m0}')
  21.             print(f'q = {q}\n----------')
  22.         l_tmp = l0
  23.         l0 = l_1 - q * l0
  24.         l_1 = l_tmp
  25.         m_tmp = m0
  26.         m0 = m_1 - q * m0
  27.         m_1 = m_tmp
  28.         r_tmp = r0
  29.         r0 = r_1 % r0
  30.         if r0 == 0:
  31.             return (l_1, m_1, a * l_1 + b * m_1)
  32.         r_1 = r_tmp
  33.  
  34. def bin_pow_n(a, z, n):
  35.     res = 1
  36.     while(z):
  37.         if (z & 1):
  38.             res = (res * a) % n
  39.         a *= a % n
  40.         z >>= 1
  41.     return res
  42.  
  43. def miller_rabin_test(n, k = 7):
  44.     """use Rabin-Miller algorithm to return True (n is probably prime)
  45.    or False (n is definitely composite)"""
  46.     if n < 6:  # assuming n >= 0 in all cases... shortcut small cases here
  47.         return [False, False, True, True, False, True][n]
  48.     elif n & 1 == 0:  # should be faster than n % 2
  49.         return False
  50.     else:
  51.         s, d = 0, n - 1
  52.         while d & 1 == 0:
  53.             s, d = s + 1, d >> 1
  54.               # Use random.randint(2, n-2) for very large numbers
  55.         for a in random.sample(range(2, min(n - 2, 999999999999999999)), min(n - 4, k)):
  56.             x = bin_pow_n(a, d, n)
  57.             if x != 1 and x + 1 != n:
  58.                 for r in range(1, s):
  59.                     x = bin_pow_n(x, 2, n)
  60.                     if x == 1:
  61.                         return False  # composite for sure
  62.                     elif x == n - 1:
  63.                         a = 0  # so we know loop didn't continue to end
  64.                         break  # could be strong liar, try another a
  65.                 if a:
  66.                     return False  # composite if we reached end of this loop
  67.         return True  # probably prime if reached end of outer loop
  68.  
  69. def miller_rabin(n, k=7):
  70.  
  71.     # Implementation uses the Miller-Rabin Primality Test
  72.     # The optimal number of rounds for this test is 40
  73.     # See http://stackoverflow.com/questions/6325576/how-many-iterations-of-rabin-miller-should-i-use-for-cryptographic-safe-primes
  74.     # for justification
  75.  
  76.     # If number is even, it's a composite number
  77.     if n == 1:
  78.         return False
  79.  
  80.     if n == 2 or n == 3:
  81.         return True
  82.  
  83.     if n & 1 == 0:
  84.         return False
  85.  
  86.     r, s = 0, n - 1
  87.     while s & 1 == 0:
  88.         r += 1
  89.         s //= 2
  90.     for _ in range(k):
  91.         a = random.randrange(2, n - 1)
  92.         x = bin_pow_n(a, s, n)
  93.         if x == 1 or x == n - 1:
  94.             continue
  95.         for _ in range(r - 1):
  96.             x = bin_pow_n(x, 2, n)
  97.             if x == n - 1:
  98.                 break
  99.         else:
  100.             return False
  101.     return True
Add Comment
Please, Sign In to add comment