/* rsa.gp */ {alphabet=[" ","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"]; } {letter_to_number(l, n)= for(n=1,27,if(alphabet[n]==l,return(n-1))); error("invalid input.") } {number_to_message(n, s="")= while(n>0, s = concat(s,alphabet[n%27+1]); n = n \ 27); return(s) } {message_to_number(w, i,n=0)= for(i=1,length(w), n = n + 27^(i-1)*letter_to_number(w[i])); return(n); } {make_rsa_key(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]); } encrypt(message, n, e)=lift(Mod(message_to_number(message),n)^e); decrypt(secret, n, d)=number_to_message(lift(Mod(secret,n)^d));