def generate(bits, randfunc=None, e=65537):
 if (bits < 1024):
  raise ValueError('RSA modulus length must be >= 1024')
 if (((e % 2) == 0) or (e < 3)):
  raise ValueError('RSA public exponent must be a positive, odd integer larger than 2.')
 if (randfunc is None):
  randfunc = Random.get_random_bytes
 d = n = Integer(1)
 e = Integer(e)
 while ((n.size_in_bits() != bits) and (d < (1 << (bits // 2)))):
  size_q = (bits // 2)
  size_p = (bits - size_q)
  min_p = min_q = (Integer(1) << ((2 * size_q) - 1)).sqrt()
  if (size_q != size_p):
   min_p = (Integer(1) << ((2 * size_p) - 1)).sqrt()
  def filter_p(candidate):
   return ((candidate > min_p) and ((candidate - 1).gcd(e) == 1))
  p = generate_probable_prime(exact_bits=size_p, randfunc=randfunc, prime_filter=filter_p)
  min_distance = (Integer(1) << ((bits // 2) - 100))
  def filter_q(candidate):
   return ((candidate > min_q) and ((candidate - 1).gcd(e) == 1) and (abs((candidate - p)) > min_distance))
  q = generate_probable_prime(exact_bits=size_q, randfunc=randfunc, prime_filter=filter_q)
  n = (p * q)
  lcm = (p - 1).lcm((q - 1))
  d = e.inverse(lcm)
 if (p > q):
  (p, q) = (q, p)
 u = p.inverse(q)
 return RsaKey(n=n, e=e, d=d, p=p, q=q, u=u)

def generate ( bits , randfunc = None , e = 65537 ) : if ( bits < 1024 ) : raise ValueError ( 'RSA modulus length must be >= 1024' ) if ( ( ( e % 2 ) == 0 ) or ( e < 3 ) ) : raise ValueError ( 'RSA public exponent must be a positive, odd integer larger than 2.' ) if ( randfunc is None ) : randfunc = Random . get_random_bytes d = n = Integer ( 1 ) e = Integer ( e ) while ( ( n . size_in_bits ( ) != bits ) and ( d < ( 1 << ( bits // 2 ) ) ) ) : size_q = ( bits // 2 ) size_p = ( bits - size_q ) min_p = min_q = ( Integer ( 1 ) << ( ( 2 * size_q ) - 1 ) ) . sqrt ( ) if ( size_q != size_p ) : min_p = ( Integer ( 1 ) << ( ( 2 * size_p ) - 1 ) ) . sqrt ( ) def filter_p ( candidate ) : return ( ( candidate > min_p ) and ( ( candidate - 1 ) . gcd ( e ) == 1 ) ) p = generate_probable_prime ( exact_bits = size_p , randfunc = randfunc , prime_filter = filter_p ) min_distance = ( Integer ( 1 ) << ( ( bits // 2 ) - 100 ) ) def filter_q ( candidate ) : return ( ( candidate > min_q ) and ( ( candidate - 1 ) . gcd ( e ) == 1 ) and ( abs ( ( candidate - p ) ) > min_distance ) ) q = generate_probable_prime ( exact_bits = size_q , randfunc = randfunc , prime_filter = filter_q ) n = ( p * q ) lcm = ( p - 1 ) . lcm ( ( q - 1 ) ) d = e . inverse ( lcm ) if ( p > q ) : ( p , q ) = ( q , p ) u = p . inverse ( q ) return RsaKey ( n = n , e = e , d = d , p = p , q = q , u = u )
generate a new private key on the given curve .