\\ \\--------------------------------------------------------------------------------- \\ input: NO - phb() \\--------------------------------------------------------------------------------- \\ \\ The program encrypts and decrypts a random word \\ \\--------------------------------------------------------------------------------- \\ \\ allocatemem(1024000000); \\ phb()={ \\ local(); \\ NRAND=100000000000; NREX=3000; \\ p=randomprime(NRAND); q=randomprime(NRAND); N=p*q; print("\nN=",N); print("\np=",p," q=",q); if(p%4==1,ep=p-1,ep=p+1); if(q%4==1,eq=q-1,eq=q+1); epq=ep*eq; print("\nepq=",epq); print("\nep=",ep," eq=",eq); print("\nN%=",N%4," p%=",p%4," q%=",q%4); fl0=1; while(fl0, kex=random(NREX); if(kex<3,kex=3); mkex=Mod(kex,epq); if(gcd(kex,epq)==1,mdex=mkex^(-1);fl0=0); ); \\ print("\n1=",mkex*mdex," mkex=",mkex," mdex=",mdex); \\ cc=2; \\cc=1,2,4,8... \\ D=-(2*cc*N)^2; \\ print("\nThe number of words generated - ? "); iw=input(); kex=component(mkex,2); dex=component(mdex,2); \\ chyba=0; for(i=1,iw, w=random(N); \\ Originally the word cw=moc(N,cc,w,kex); \\ Encrypted word dw=moc(N,cc,cw,dex); \\ Decrypted word \\ \\ print(w); \\ print(cw); \\ print(dw); \\ print(" "); \\ if(w==dw, ,chyba++); ); \\ print("\n kex=",kex); print("\n dex=",dex); print("\nerror=",chyba); print(" "); \\ return(); \\ } \\------------------------------------------------------------------------------------------- \\--------------------------------------------------------------------------------- qcomp(x1,x2,N,cc)={ local(xsuma,gc); xsuma=x1+x2; gc=gcd(xsuma,N); if(gc==1, ,return(-gc)); return(((x1*x2-cc^2)/xsuma)%N); } \\--------------------------------------------------------------------------------- \\--------------------------------------------------------------------------------- moc(N,cc,y,ex)={ local(i,bex,y0); \\ bex=binary(ex); y0=y; for(i=2,matsize(bex)[2], if(bex[i], y=qcomp(y,y,N,cc); if(y<0,printf("i=%5d factorizacia-y0 %35d\n\n",i,-y);return()); y=qcomp(y,y0,N,cc); if(y<0,printf("i=%5d factorizacia-y1 %35d\n\n",i,-y);return()); , y=qcomp(y,y,N,cc); if(y<0,printf("i=%5d factorizacia-y2 %35d\n\n",i,-y);return()); ); ); \\ return(y); } \\---------------------------------------------------------------------------------