from algo import *

def main():
    mu = [
        31726849986005826981,
        305966565717393601613,
        61497322861823383198,
        269645690420162032117,
        155457162093765938384,
        24931468152962121635,
        138444967690527010216,
        282789589899417404817,
        134251529920691060404,
        423054566352157178418,
        265453042944217161627,
        39119050384849643825
    ]                           # encrypted message
    n = 455649012989940178621   # first element public key
    e = 5303                    # second element public key

    length = len(mu)

    # --- private element ---
    M = []      # decriypted message
    msg = ""    # message (string)
    p = 0       # fisrt prime number
    q = 0       # second prime number
    d = 0       # private key

    #--- crack RSA ---
    a, b = fermat_factorization(n)
    
    p = a + b
    q = a - b
    
    fi = (p - 1) * (q - 1)
    d = inverse_modulaire(e, fi) # get private key

    # --- decode mu & initialise msg ---
    for i in range(length):
        M.append(exponentiation_rapide(mu[i], d, n))

    for m in M:
        msg += decode_msg(m)

    # --- output ---
    print("p   :", p, "\nq   :", q, "\nfi  :", fi, "\nd   :", d, "\nmsg :", msg)
    
    
if __name__ == "__main__":
    main()