> with(numtheory): Warning, the protected name order has been redefined and unprotected > > ## Susthma kruptografhshs ElGamal > > ## Ypologismos parametrwn > gen_params:=proc(digits) > local R,g,p: > R:=rand(10^(digits-1)..10^digits): > p:=nextprime(R()): > for g from 2 to p-1 while order(g,p) <> p-1 do > end do: > RETURN([p,g]): > end proc: > > ## Ypologismos kleidiwn > gen_keys:=proc(params) > local R,x,y,g,p: > p:=params[1]: > g:=params[2]: > R:=rand(1..p-1): > x:=R(): > y:=g&^x mod p: > RETURN([x,y]): > end proc: > > ## Kruptografhsh > encrypt:=proc(m,params,public) > local R,k,r,c,p,g: > p:=params[1]: > g:=params[2]: > R:=rand(1..p-1): > k:=R(): > r:=g&^k mod p; > c:=m*public&^k mod p: > RETURN([r,c]): > end proc: > > ## Apokruptografhsh > decrypt:=proc(cipher,params,private) > local c,r,m,p,g: > p:=params[1]: > g:=params[2]: > r:=cipher[1]: > c:=cipher[2]: > m:=c*r&^(p-1-private) mod p: > RETURN(m): > end proc: > > params:=gen_params(5); params := [38011, 2] > keys:=gen_keys(params); keys := [30737, 19677] > message:=1234; message := 1234 > ciphertext:=encrypt(message,params,keys[2]); ciphertext := [34108, 36974] > plaintext:=decrypt(ciphertext,params,keys[1]); plaintext := 1234 > params:=gen_params(30); params := [256126444952207781175113606349, 2] > keys:=gen_keys(params); keys := [248925881951877375747258092594, 29413043714189720611956139048] > message:=12345678909876543212345678909; message := 12345678909876543212345678909 > ciphertext:=encrypt(message,params,keys[2]); ciphertext := [237988914700200359164056814779, 129852134936760720564914849826] > plaintext:=decrypt(ciphertext,params,keys[1]); plaintext := 12345678909876543212345678909 >