#!/usr/bin/env python3
from Cryptotools.Groups.cyclic import Cyclic
from Cryptotools.Numbers.primeNumber import getPrimeNumber
from random import randint, choice
from math import log, log10

"""
    Here, we will try to understand why we need to have a generator when we encrypt data for Diffie-Hellman
    https://crypto.stackexchange.com/questions/25489/why-does-diffie-hellman-need-be-a-cyclic-group
"""
def operation(a, b, n):
    return (a ** b) % n

def getGenerator(gr, p):
    cyclic = Cyclic(gr, p, operation)
    generators = cyclic.getGenerators()
    print(f"All generators: {generators}")
    cyclic.identity()
    print(f"Identity: {cyclic.getIdentity()}")
    
    return generators


gr = list()
# Public value
p = 13
g = 0
for i in range(1, p):
    gr.append(i)

print(f"p = {p}")
print(f"G = {gr}")
# We try with a generator which is not in list
generators = getGenerator(gr, p)

g = 3 # In the group
#g =  # Not in the group
#print(f"g = {g}")



# Try to compute the cyclic subgroup
for G in range(p + 1):
    res = 0
    for a in range(G):
        r = operation(G, a, p)
        res = res + r
    if res == p:
        print(f"G = {G}; res = {res}")
