def generate_keys():
    '''Alice builds a dicsrete-log public-key cipher system.

    '''

    cyclic_group = large_random_prime()
    generator = random_near_primitive_root(cyclic_group)
    private_key = random.randint(1, cyclic_group - 1)
    public_key = fast_exponentiation(generator, private_key, cyclic_group)

    return (generator, public_key, cyclic_group), private_key
def encrypt(message, b, c, p):
    r = large_random_prime()
    c_r = fast_exponentiation(c, r, p)
    encrypted_message = message * c_r % p
    header = fast_exponentiation(b, r, p)
    return encrypted_message, header
def large_random_p_and_q():
    yield large_random_prime()
    yield large_random_prime()