c GENERAZIONE DELLE CHIAVI c c Definizioni c integer p,q,E,h c p e q sono numeri primi;E è l'indicatore di Eulero di p x q c h è il codice di gruppo, fisso per tutti i membri del c gruppo; è stato scelto 46337, max primo < 46340 integer a,b,aa,bb,r,quoto(99),qq,s(99),w c a,b,aa,bb,r,quoto,qq,s,w sono utilizzati nel calcolo di MCD c e dell'inverso c c Tabella dei 63 numeri primi compresi tra 101 e 457 integer primi(63) data primi /101,103,107,109,113,127,131,137,139,149, *151,157,163,167,173,179,181,191,193,197,199,211,223, *227,229,233,239,241,251,257,263,269,271,277,281,283, *293,307,311,313,317,331,337,347,349,353,359,367,373, *379,383,389,397,401,409,419,421,431,433,439,443,449, *457/ h=46337 c c Scelta casuale di p e q c call random_seed call random(v) k1=63*v+1 p=primi(k1) max=46340/p 1 call random(v) k2=63*v+1 q=primi(k2) if(q.gt.max) go to 1 c c Calcolo di n e di E c n=p*q E=(p-1)*(q-1) c c Calcolo della chiave privata j c c j è l'inverso di h modulo E; prima bisogna calcolare MCD c a=E b=h aa=a bb=b c Calcolo di MCD(a,b) k=1 2 r=mod(a,b) qq=(a-r)/b quoto(k)=qq if(r.eq.0) go to 5 a=b b=r w=k if(w.eq.99) go to 3 k=k+1 go to 2 3 write (6,4) 4 format (' Troppe divisioni') stop 5 mcd=b c Calcolo di j s(0)=1 s(1)=-quoto(1) do 6 i=2,w s(i)=s(i-2)-s(i-1)*quoto(i) 6 continue j=s(w) if(j.lt.0)j=j+aa c c Stampa delle chiavi c write (6,7) h 7 format (' Codice di gruppo: ', i10) write (6,8) n 8 format (' Chiave pubblica: ', i10) write (6,9) j 9 format (' Chiave privata: ', i10) stop end 1