def testinvertible1(p=2,n=4,seed=1,maxc=2): """ cryptography based on non-invertible matrices """ def getma(): M=Ms.random_element() while M.det()==0: M=Ms.random_element() return M def getmaz(): M=Ms.random_element() while M.det()!=0: M=Ms.random_element() return M if seed: set_random_seed(seed) K=GF(p) Ms=MatrixSpace(K,n,n) limr=p**3 M_0=getmaz() N_A,N_B=randint(1,limr),randint(1,limr) #XXX M_A=M_0**N_A M_B=M_0**N_B X_A=getma() X_B=getma() P_A=M_A*X_A P_B=M_B*X_B S_B=M_B*P_A S_A=M_A*P_B print(S_B*X_A**(-1)==S_A*X_B**(-1),M_A*M_B==M_B*M_A,M_A*M_B==S_B*X_A**(-1)) soa=[] sob=[] for Y_M_A in Ms: if Y_M_A*P_B != S_A: continue try: Y_X_A=Y_M_A.solve_right(P_A) except: continue soa += [(Y_M_A,Y_X_A)] if len(soa)>=maxc: break for Y_M_B in Ms: if Y_M_B*P_A != S_B: continue try: Y_X_B=Y_M_B.solve_right(P_B) except: continue sob += [(Y_M_B,Y_X_B)] #print(len(sob)) if len(sob)>=maxc: break for Y_M_A,Y_X_A in soa: for Y_M_B,Y_X_B in sob: print(Y_M_A*Y_X_A==P_A,Y_M_A*P_B==S_A, Y_M_B*Y_X_B==P_B,Y_M_B*P_A==S_B, "secret?",Y_M_A*Y_M_B==M_A*M_B)