/* * Program to find discrete logarithms of user identities * using Pollard's rho method. * * Suitable trap-door primes are generated by "genprime" program * * See "Non-Interactive Public-Key Cryptography" * by U. Maurer & Y. Yacobi. Proc Eurocrypt '91 * */ #include #include #include #include "miracl.h" #define NPRIMES 15 #define PROOT 2 static big p,p1,order,lim1,lim2; static big pp[NPRIMES],rem[NPRIMES]; static BOOL flag=FALSE; static int np; void iterate(big x,big q,big r,big a,big b) { /* apply Pollards random mapping */ if (mr_compare(x,lim1)<0) { mad(x,q,q,p,p,x); incr(a,1,a); if (mr_compare(a,order)==0) zero(a); return; } if (mr_compare(x,lim2)<0) { mad(x,x,x,p,p,x); premult(a,2,a); if (mr_compare(a,order)>=0) subtract(a,order,a); premult(b,2,b); if (mr_compare(b,order)>=0) subtract(b,order,b); return; } mad(x,r,r,p,p,x); incr(b,1,b); if (mr_compare(b,order)==0) zero(b); } long rho(big q,big r,big m,big n) { /* find q^m = r^n */ long iter,rr,i; char stack_mem[mr_big_reserve(6,50)]; big ax,bx,ay,by,x,y; memset(stack_mem,0,mr_big_reserve(6,50)); ax=mirvar_mem(stack_mem,0); bx=mirvar_mem(stack_mem,1); ay=mirvar_mem(stack_mem,2); by=mirvar_mem(stack_mem,3); x=mirvar_mem(stack_mem,4); y=mirvar_mem(stack_mem,5); convert(1,y); zero(ay); zero(by); iter=0L; rr=1L; do { /* Brent's Cycle finder */ copy(y,x); copy(ay,ax); copy(by,bx); rr*=2; for (i=1L;i<=rr;i++) { iter++; iterate(y,q,r,ay,by); if (mr_compare(x,y)==0) break; } } while (mr_compare(x,y)!=0); subtract(ax,ay,m); if (size(m)<0) add(m,order,m); subtract(by,bx,n); if (size(n)<0) add(n,order,n); return iter; } void getprime(char *fname) { /* get prime details from file */ FILE *fp; int i; fp=fopen(fname,"rt"); if (fp==NULL) { printf("file %s not found\n",fname); exit(0); } fscanf(fp,"%d\n",&np); for (i=0;iIOBUFF); printf("Check Identity= %s\n",mip->IOBUFF); return 0; }