/********************************************************* Languasco & Zaccagnini, Introduzione alla Crittografia, Hoepli. Capitolo 5.9 pag. 128 e Capitolo 9.6.2 pag. 271 *********************************************************/ {alfabeto=["A","B","C","D","E","F","G","H","I","J","K", "L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",";",".","'"," "]; } {da_lettera_a_numero(lettera)=local(j); for(j=1,30,if(alfabeto[j]==lettera,return(j-1))); error("input non valido.") } {da_numero_a_messaggio(num,s="")= local(m,i); i=floor(log(n)/log(30))-1; while(i>0, s = concat(s,alfabeto[num\(30^i)+1]); num = num % (30)^i;i--); \\ n \ 30 e` la divisione intera di num per 30 s = concat(s,alfabeto[num+1]); return(s) } {da_messaggio_a_numero(w,num=0)= local(l,i,j); l=length(w); i=floor(log(n)/log(30)); for(j=1,l, num = num + 30^(i-j)*da_lettera_a_numero(w[j])); if(i>l, for(j=l+1,i,num = num + 30^(i-j)*da_lettera_a_numero(" "))); return(num); } {genera_chiave_rsa(len,p,q,n,e,d)= p = nextprime(random(10^(len\2+1))); q = nextprime(random(10^(len\2+3))); n = p*q; phin = (p-1)*(q-1); e = random(phin); while(gcd(e,phin)!=1,e=e+1); d = lift(Mod(e,phin)^(-1)); return([n,e,d]); } cifra(messaggio, n, e) = lift(Mod(da_messaggio_a_numero(messaggio),n)^e); decifra(segreto, n, d) = da_numero_a_messaggio(lift(Mod(segreto,n)^d));