Cryptography
<Text-field layout="Heading 1" style="Heading 1">Monalphabetic substitution ciphers</Text-field>with(StringTools):toNumbers:=message-> map(x->x-96,map(Ord,(Explode(Select(IsLower,LowerCase(message)))))):toNumbers("Affine cipher");NiM3LiIiIiIiJ0YlIiIqIiM5IiImIiIkRiYiIzsiIilGKCIjPQ==modpositive:=(m,n)->modp(m-1,n)+1:map(x->modpositive(9*x+18,26),[1, 6, 6, 9, 14, 5, 3, 9, 16, 8, 5, 18]);NiM3LiIiIiIjP0YlIiNAIiM5IiM2IiM+RiYiIiciIzdGKCIjQw==toLetters:=numbers->UpperCase(Join(map(Char,map(x->x+96,numbers)),"")):toLetters([1, 20, 20, 21, 14, 11, 19, 21, 6, 12, 11, 24]);NiNRLUFUVFVOS1NVRkxLWDYiLowerCase(toLetters(map(x->modpositive(3*(x-18),26),toNumbers("ATTUNKSUFLKX"))));NiNRLWFmZmluZWNpcGhlcjYi
<Text-field layout="Heading 1" style="Heading 1">The Pohlig-Hellman cipher and the discrete logarithm problem</Text-field>toNumbers("polygraphic");NiM3LSIjOyIjOiIjNyIjRCIiKCIjPSIiIkYkIiIpIiIqIiIkn := 123456789: for i from n while not(isprime(n)) do n:=n+1: end do: print(n); NiMiKiJ6Y003gcd(123,123456790);NiMiIiI=map(x->modp(x&^123,123456791),[16151225, 07180116, 080903]);NiM3JSIpdGAjZikiKE1yOCQiKFA7IXA=msolve({123*rprime=1},123456790);NiM8Iy9JJ3JwcmltZUc2IiIpKG8mPV0=map(x->modp(x&^50185687,123456791),[85925373, 3137134, 6901637]);NiM3JSIpRDc6OyIoOyw9KCImLjQptoLetters([16,15,12,25,7,18,1,16,8,9,3]);NiNRLFBPTFlHUkFQSElDNiI=
<Text-field layout="Heading 1" style="Heading 1">The Massey-Omura exchange</Text-field>a:=123456789:p:=41889443039:s:=85479892289:gcd(s,p-1);NiMiIiI=a1:=modp(a&^s,p);NiM+SSNhMUc2IiIsLFxoYiI+r:=46828919:gcd(r,p-1);NiMiIiI=a2:=modp(a1&^r,p);NiM+SSNhMkc2IiIrdiZwUTgnmsolve({s*sprime=1},p-1);NiM8Iy9JJ3NwcmltZUc2IiIsRDlaOUgka3:=modp(a2&^32914471425,p);NiM+SSNhM0c2IiIrRTZiQEA=msolve({r*rprime=1},p-1);NiM8Iy9JJ3JwcmltZUc2IiIsKDMkKSl6RCQ=modp(a3&^32579883087,p);NiMiKip5Y003
<Text-field layout="Heading 1" style="Heading 1">The RSA algorithm</Text-field>p:=115518123229:q:=8445806041:n:=p*q;NiM+SSJuRzYiIjYqUUUxWjdJbVZjKCo=m:=(p-1)*(q-1);NiM+SSJtRzYiIjY/cnAxJikpR21WYygqr:=875189387279:gcd(m,r);NiMiIiI=modp(123456789&^r,n);NiMiNihmL1Y0UVwncD1rIg==msolve({r*rprime=1},m);NiM8Iy9JJ3JwcmltZUc2IiI2ZiwwcjNYbG9gMCQ=modp(164186964938094304597&^305536865450871050159,n);NiMiKip5Y003
<Text-field layout="Heading 1" style="Heading 1">Notes</Text-field>
<Text-field layout="Heading 2" style="Heading 2">Computing powers mod <Font italic="true">p</Font></Text-field>ourpowermod:=proc(a,k,n) local b,c,ktemp,r; b:=1; c:=a; ktemp:=k; while ktemp>0 do r:=modp(ktemp,2); if r=1 then b:=modp(b*c,n) end if; c:=modp(c^2,n); ktemp:=(ktemp-r)/2; end do; return(b); end proc:ourpowermod(123456789, 85479892289, 41889443039);NiMiLCxcaGIiPg==