{VERSION 6 0 "IBM INTEL NT" "6.0" } {USTYLETAB {CSTYLE "Maple Input" -1 0 "Courier" 0 1 255 0 0 1 0 1 0 0 1 0 0 0 0 1 }{CSTYLE "" -1 256 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 257 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 258 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 259 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 260 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 261 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 263 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 264 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 265 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 266 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 268 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 269 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 270 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 271 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 272 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 273 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {CSTYLE "" -1 274 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 275 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 276 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 277 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 }{CSTYLE "" -1 278 "" 1 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 } {PSTYLE "Normal" -1 0 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }1 1 0 0 0 0 1 0 1 0 2 2 0 1 }{PSTYLE "Heading 1" -1 3 1 {CSTYLE "" -1 -1 "Times" 1 18 0 0 0 1 2 1 2 2 2 2 1 1 1 1 }1 1 0 0 8 4 1 0 1 0 2 2 0 1 }{PSTYLE "Normal" -1 256 1 {CSTYLE "" -1 -1 "Times" 1 12 0 0 0 1 2 2 2 2 2 2 1 1 1 1 }3 1 0 0 0 0 1 0 1 0 2 2 0 1 }} {SECT 0 {PARA 0 "" 0 "" {TEXT -1 0 "" }}{SECT 1 {PARA 3 "" 0 "" {TEXT -1 14 "CryptoRoutines" }}{EXCHG {PARA 0 "" 0 "" {TEXT 257 69 "Orginall y developed by Neil Sigmon, http://www.radford.edu/~npsigmon/" }{TEXT -1 0 "" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 16743 "restart:\nnospace := p roc(sentence)\n local i, nsent;\n nsent := \"\":\n for i from 1 to len gth(sentence) do\n if substring(sentence, i) <> \" \" then\n nsent \+ := cat(nsent, substring(sentence, i));\n fi:\n od:\nend:\ninspace := \+ proc(sentence, bl)\n local i, j, nsent;\n nsent := \"\";\n for i from \+ 1 to length(sentence) do\n if (i) mod bl <> 0 then\n nsent := cat(n sent, substring(sentence, i));\n else\n nsent := cat(nsent, substri ng(sentence, i));\n nsent := cat(nsent, \" \");\n fi:\n od:\nend:\n shiftamount := proc(fromletter, toletter)\n local abet, shift;\n abet \+ := \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n shift := (SearchText(toletter, ab et) - SearchText(fromletter,abet)) mod 26;\nend:\nstrgraph := proc(mes s, sl, info)\nlocal i, j, k, str1, ct, str2, strset, olist, dlist, pos , gcddlist,flist:\nstrset := \{\}:\nflist := []:\nfor i from 1 to leng th(mess)-sl+1 do\nct := 1:\nolist := [i]: dlist := []:\npos := i: gcdd list := 0;\nstr1 := substring(mess, i..i+sl-1):\nif not member(str1, s trset) and searchtext(\" \", str1) = 0 then\nfor j from i+sl to length (mess)-sl+1 do\nstr2 := substring(mess, j..j+sl-1):\nif str1=str2 then \nolist := [op(olist), j];\ndlist := [op(dlist), j-pos];\npos := j:\nc t := ct + 1:\nfi:\nod:\nif ct > 1 then\ngcddlist := igcd(seq(dlist[k], k = 1..nops(dlist)));\nfi:\nfi:\nif ct >= 2 and not member(str1, strs et) then\nif info = true then\nflist := [op(flist), [cat(convert(sl, s tring),\"-graph \", str1 ,\" occurs \", \nconvert(ct, string) ,\" time s at positions \",convert(olist, string), \n\" at distances \",convert (dlist, string),\". \" , \n\"Prime dlist = \",convert(map(ifactor, dli st), string), \". \",\n\"Gcd of distances = \", convert(gcddlist,strin g)), ct]];\nelse\nflist := [op(flist), [cat(convert(sl, string), \"-gr aph \",str1,\n\" occurs \", convert(ct, string),\" times\"), ct]];\nfi :\nfi:\nstrset := strset union \{str1\}:\nod:\nflist := sort(flist, (x ,y) -> evalb(x[2] > y[2]));\nseq(lprint(flist[i][1]), i = 1..nops(flis t));\nend:\nshiftcipher := proc(mess, shift, type)\nlocal letters, lta ble, i, j, rmess, lmess;\nletters := array(0..25, [\"A\", \"B\", \"C\" , \"D\", \"E\", \"F\", \"G\", \"H\", \"I\",\n\"J\", \"K\", \"L\", \"M \", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \n \"W\", \"X\", \"Y\", \"Z\"]):\nltable := table():\nfor i from 0 to 25 \+ do\nltable[ letters[i] ] := i:\nod:\nrmess := \"\": \nlmess := convert (mess, list);\nif type = 'encipher' then\nfor i from 1 to length(mess) do\nrmess := cat(rmess, letters[ (ltable[ lmess[i] ] + shift) mod 26 \+ ]);\nod:\nelif type = 'decipher' then\nfor i from 1 to length(mess) do \nrmess := cat(rmess, letters[ (ltable[ lmess[i] ] - shift) mod 26 ]); \nod:\nelse\nlprint(\"third parameter must be encipher or decipher\"): \nfi:\nrmess;\nend:\naffinecipher := proc(mess, a, b, type)\nlocal let ters, ltable, i, j, rmess, lmess;\nletters := array(0..25, [\"A\", \"B \", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\",\n\"J\", \"K\", \" L\", \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \" V\",\n\"W\", \"X\", \"Y\", \"Z\"]):\nif gcd(a,26) <> 1 then\nRETURN(lp rint(cat(\"gcd of multiplication parameter \", convert(a, string), \" \+ and 26 = \", convert(gcd(a,26), string),\". The gcd must be 1.\")));\n end:\nltable := table():\nfor i from 0 to 25 do\nltable[ letters[i] ] \+ := i:\nod:\nrmess := \"\":\nlmess := convert(mess, list);\nif type = ' encipher' then\nfor i from 1 to length(mess) do\nrmess := cat(rmess, l etters[ (a*ltable[ lmess[i] ] + b) mod 26 ]);\nod:\nelif type = 'decip her' then\nfor i from 1 to length(mess) do\nrmess := cat(rmess, letter s[ a^(-1)*(ltable[ lmess[i] ] - b) mod 26 ]);\nod:\nelse\nlprint(\"thi rd parameter must be encipher or decipher\"):\nfi:\nrmess;\nend:\nrdup := proc(key) \nlocal i, nkey, skey;\nnkey := \"\";\nskey := convert( convert(key,list), set);\nfor i from 1 to length(key) do\nif member(ke y[i],skey) then\nnkey := cat(nkey, key[i]):\nskey := skey minus \{key[ i]\};\nfi:\nod:\nRETURN(nkey):\nend:\nkeywordcoltrans := proc(message, keyword, ctype)\nlocal key, p, i, answer, mess, r, q, c, n, j, column , nmess;\nmess := message;\nc := length(keyword);\nn := length(message );\nr := n mod c;\nif r <> 0 then\nmess := cat(mess, seq(\"X\", i = 1. .(c-r)));\nlprint(\"Message length is not a multiple of keyword length .\");\nlprint(\"X's will be padded to end of message.\");\nfi:\nkey := rdup(cat(seq(sort(convert(keyword, list))[i],\n i = 1..c))) ;\np := [seq( StringTools[SearchAll](key[i],keyword), i = 1..c ) ]; pr int(p);\nq := n/c;\n print(p); print(q);\n# answer := array(1..5);\n \+ nmess := \"\";\n if ctype = 'encipher' then\n# for j from 1 t o c do\n# print( (q*(p(j)-1)+1) ); print(q*p(j)); \n# \+ column := cat(seq(mess[((i-1) mod q)*c+iquo((i-1),q) + 1], i = (q*(p [j]-1)+1)..q*p[j]));\n# answer := cat(answer, column);\n# \+ od:\n elif ctype = 'decipher' then\n# for j from 1 to c do \n # print( (q*(p[j]-1)+1) ); print(q*p[j]); \n# column := cat(seq(mess[((i-1) mod c)*q+iquo((i-1),c) + 1], i = (q*(p[j]-1)+1).. q*p[j]));\n# print(column);\n# answer := cat(answer, c olumn);\n# answer[j] := column;\n# od:\n for j from 1 to c do\n column := substring(mess, q*(p[j]-1)+1..q*p[j]); \n nmess := cat(nmess, column);\n od:\n \+ print(nmess);\n answer := cat(seq(nmess[((i-1) mod c)*q+iquo((i -1),c) + 1], i = 1..n)) \n else\n lprint(\"third parameter must be encipher or decipher\"):\n fi:\n print(answer);\nend:\nvigener e := proc(message, keyword, ctype)\n local i, j, otext, messct, keyc t, letters, ltable, vtable;\n letters := array(0..25, [\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \n \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \+ \"V\", \"W\", \"X\", \"Y\", \"Z\"]):\n ltable := table():\n for i \+ from 0 to nops(convert(letters, list)) - 1 do\n ltable[ letters[i ] ] := i:\n od:\n vtable := table():\n for i from 0 to nops(conv ert(letters, list)) - 1 do\n for j from 0 to nops(convert(letters , list)) - 1 do\n vtable[ letters[i], letters[j] ] := letters[ \+ (i+j) mod 26 ]:\n od:\n od:\n otext := \"\";\n if ctype = ' encipher' then\n messct := 0; \n while messct < length(messa ge) do\n keyct := 0: \n while (keyct < length(keyword) ) and (messct < length(message)) do\n keyct := keyct + 1: \n messct := messct + 1: \n otext := cat(otext , vtable[substring(keyword,keyct), substring(message, \+ messct)]);\n od:\n od:\n elif ctype = 'decipher' \+ then\n messct := 0;\n while messct < length(message) do\n \+ keyct := 0: \n while (keyct < length(keyword)) and ( messct < length(message)) do\n keyct := keyct + 1:\n \+ messct := messct + 1: \n otext := cat(otext, letter s[ ( ltable[ substring(message, messct) ] - ltable[ subst ring(keyword, keyct) ]) mod 26 ]): \n od:\n od:\n el se\n lprint(\"third parameter must be encipher or decipher\"):\n fi:\n RETURN(otext);\nend:\nvigenkey := proc(ptext, ctext)\n \+ vigenere(ctext,ptext,decipher);\nend:\nic := proc(mess) \n local i , j, letterct, lsum, alphabet, nmess, ncoin , fl;\n alphabet := \"AB CDEFGHIJKLMNOPQRSTUVWXYZ\";\n ncoin := 0;\n nmess := mess; \n fo r i from 1 to length(alphabet) do\n lsum := 0; fl := SearchText(s ubstring(alphabet, i), nmess);\n while fl <> 0 do\n lsum \+ := lsum + 1;\n nmess := cat(substring(nmess, 1..fl-1), substri ng(nmess, fl+1..length(nmess)));\n fl := SearchText(substring( alphabet, i), nmess);\n od:\n ncoin := ncoin + lsum*(lsum-1) ;\n od:\n RETURN(ncoin/(length(mess)*(length(mess) - 1)));\nend:\n vigencoset := proc(kwl, mess)\n local i, monolist, pos, bstr;\n mo nolist := []; \n for i from 1 to kwl do\n pos := i: bstr := \" \"; \n while substring(mess, pos) <> \"\" do\n bstr := ca t(bstr, substring(mess, pos));\n pos := pos + kwl;\n od: \n monolist := [op(monolist), bstr]:\n od:\n RETURN(monolist) ;\nend:\nkeyletters := proc(keylist)\n local i, keystring;\n keyst ring := convert(cat(seq(keylist[i], i = 1..nops(keylist))), list);\n \+ linalg[transpose](matrix(nops(keylist), length(keylist[1]), keystring )); \nend:\nletterdist := proc(message)\n local i, j, r, s, t, freq , pa, alphabet, pt;\n freq := length(message)*letterfreq(message); \n pa := array(1..nops(freq));\n 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];\n for i from 1 to nops(freq) do \n if freq[i] <> 0 then\n pa[i] := plot([[i-0.5, r, r \+ = 0..freq[i]], \n [s, freq[i], s = i-0.5..i+0.5],\n \+ [i+0.5, t, t = 0..freq[i]]], color = black):\n else \n pa[i] := plots[pointplot]([i,0]):\n fi: \n od:\n \+ pt:= plots[textplot]([ seq([i, -1, alphabet[i]], i = 1..nops(alphab et)) ]):\n plots[display]([seq(pa[i], i = 1..nops(freq)), pt], colo r = black, thickness = 2, \n xtickmarks=0);\nend:\nsignature \+ := proc(flist)\n local sflist, i; \n sflist := sort(flist);\n \+ plots[pointplot]([ seq([i, sflist[i]], i = 1..nops(sflist)) ], connect = true);\nend:\nshiftletter := proc(anumber)\n local alphabet;\n \+ alphabet := \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n substring(alphabet, an umber+1);\nend:\nscrawl := proc(flist)\n local i, alphabet, p1, p2; \n 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] ;\n p1 := plots[pointplot]([ seq([i, flist[i]], i = 1..nops(flist)) \+ ], connect = true, \n color = red, thickness = 3):\n p2:= plots[te xtplot]([ seq([i, -.003, alphabet[i]], i = 1..nops(alphabet)) ]):\n \+ plots[display]([p1,p2], xtickmarks = 0, title = \"Scrawl for given fre quency distribution\");\nend:\nfscrawl := proc(flist, shift, clr, thic kv) \n local i, j, nlist, alphabet, p1, p2;\n 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];\n nlist := [seq(fli st[i], i = 1+shift..nops(flist)), seq(flist[j], j = 1..shift) ]:\n p 1 := plots[pointplot]([ seq([i, nlist[i]], i = 1..nops(nlist)) ], conn ect = true, \n color = clr, thickness = thickv):\n p2:= plots[text plot]([ seq([i, -.003, alphabet[i]], i = 1..nops(alphabet)) ]):\n pl ots[display]([p1,p2], xtickmarks = 0):\nend:\nascrawl := proc(coset) \+ \n local i, elist, flist:\n elist := [.08167, 0.01492, 0.02782, 0 .04253, 0.12702, 0.02228, 0.02015, 0.06094, \n 0.06966, 0. 00153, 0.00772, 0.04025, 0.02406, 0.06749, 0.07507, 0.01929, \n \+ 0.00095, 0.05987, 0.06327, 0.09056, 0.02758, 0.00978, 0.02360, 0 .00150, \n 0.01974, 0.00074];\n flist := letterfreq(nosp ace(coset));\n plots[display](seq(display([fscrawl(elist, 0, red, 3) , \n fscrawl(flist, i, blue, 1)], title = cat(\"left shift = \", \n \+ convert(i, string))), i = 0..25), insequence = true);\nend:\nletterf req := proc(mess)\n local i, abet, flist, ct, j:\n flist := []:\n \+ abet := \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n for i from 1 to length(a bet) do\n ct := 0:\n for j from 1 to length(mess) do\n \+ if evalb(substring(abet,i) = substring(mess, j)) then\n \+ ct := ct + 1\n fi:\n od:\n flist := [op(flist), ct]: \n od:\n flist := flist/length(mess):\nend:\nprintletterfreq := pr oc(mess)\n local i, abet, alist;\n abet := \"ABCDEFGHIJKLMNOPQRSTU VWXYZ\";\n alist := length(mess)*letterfreq(mess);\n for i from 1 \+ to length(abet) do\n lprint(cat(\"Letter \", substring(abet,i), \+ \" occurs \", \n convert(alist[i], string), \" times.\")); \n od:\nend:\ncosetsign := proc(ctext, cl)\n local fkey, p1, p2, e list;\n elist := sort([.08167, 0.01492, 0.02782, 0.04253, 0.12702, 0 .02228, 0.02015, 0.06094, \n 0.06966, 0.00153, 0.00772, 0. 04025, 0.02406, 0.06749, 0.07507, 0.01929, \n 0.00095, 0.0 5987, 0.06327, 0.09056, 0.02758, 0.00978, 0.02360, 0.00150, \n \+ 0.01974, 0.00074]);\n fkey := vigencoset(cl, ctext):\n p1 := \+ plots[display]([seq(display(signature(letterfreq(sort(fkey[i])))), i = 1..cl)], \n color = black, thickness = 1):\n p2 := display( signature(elist), color = red, thickness = 3):\n plots[display]([p1, p2], title = cat(\"Signature for coset length \", convert(cl, string)) );\nend:\ncosetdata := proc(mess, l)\n local i, j, k, V, A, coset, l freq;\n coset := mlist(l, mess): \n for j from 1 to l do\n lf req := evalf(sort(letterfreq(coset[j])));\n V[j] := 1/2*add(k,k = [seq(lfreq[i] + lfreq[i-1], i = 14..26)]) \n - add(k,k = [seq(lfreq[i] + lfreq[i-1], i = 2..14)]);\n od:\n A := 0;\n for j from 1 to l do\n A := A + V[j];\n od:\n A := evalf(A/l);\n end:\nscrawldata := proc(ctext, kwl) \n local i, j, k, sv, shiftl , efreq, flist, dlist, coset, s;\n efreq := [.08167, 0.01492, 0.027 82, 0.04253, 0.12702, 0.02228, 0.02015, 0.06094, \+ 0.06966, 0.00153, 0.00772, 0.04025, 0.02406, 0.06749 , 0.07507, 0.01929, \n 0.00095, 0.05987, 0.06327, 0.09056, 0.02758, 0.00978, 0.02360, 0.00150, \n 0.01974, 0.00074]; \n coset := mlist(kwl, ctext):\n for i from 1 to kwl do\n dli st := []: \n flist := evalf(letterfreq(coset[i]));\n for sv from 0 to 25 do \n shiftl := [seq(flist[j], j = sv+1..26), seq(flis t[j], j = 1..sv)]; \n dlist := [op(dlist), evalf(linalg[dotprod] (efreq, shiftl),3)]; \n od: \n member(evalf(max(seq(dlist[i], i = 1..nops(dlist))),3), dlist, 's');\n print(cat(\"Scrawl for sh ift for coset \", convert(i,string), \" is \"), dlist, \n \"Max = \+ \", evalf(max(seq(dlist[i], i = 1..nops(dlist))),3), \"at shift value \+ \", s-1); \n od:\nend:\ncsubsetup := proc(message)\n local i, j, \+ subc;\n subc := linalg[matrix](2, length(message));\n for j from 1 to length(message) do\n subc[1,j] := convert(substring(message, \+ j), symbol); \n subc[2,j] := convert(\" \", symbol);\n od: \n \+ for i from 1 to linalg[coldim](subc) by 26 do\n if (i + 26 - 1) \+ > linalg[coldim](subc) then\n print(linalg[augment](linalg[col ](subc,i..linalg[coldim](subc))));\n else\n print(linalg[ augment](linalg[col](subc,i..i+26-1)));\n fi: \n print(\" \" );\n od:\n RETURN(evalm(subc)):\nend:\nsubcipher := proc(fromlette r, toletter, ctextm)\n local subc, j, i;\n subc := ctextm;\n for j from 1 to linalg[coldim](subc) do\n if convert(subc[1,j], stri ng) = fromletter then\n subc[2,j] := convert(toletter, symbol) :\n fi:\n od:\n for i from 1 to linalg[coldim](subc) by 25 do \n if (i + 25 - 1) > linalg[coldim](subc) then\n print(li nalg[augment](linalg[col](subc,i..linalg[coldim](subc))));\n else \n print(linalg[augment](linalg[col](subc,i..i+25-1)));\n \+ fi: \n print(\" \");\n od:\n RETURN(evalm(subc)):\nend:\nsub cipher := proc(fromletter, toletter, ctextm)\n local subc, j, i;\n \+ subc := ctextm;\n for j from 1 to linalg[coldim](subc) do\n if convert(subc[1,j], string) = fromletter then\n subc[2,j] := c onvert(toletter, symbol):\n fi:\n od:\n for i from 1 to linal g[coldim](subc) by 25 do\n if (i + 25 - 1) > linalg[coldim](subc) \+ then\n print(linalg[augment](linalg[col](subc,i..linalg[coldim ](subc))));\n else\n print(linalg[augment](linalg[col](su bc,i..i+25-1)));\n fi: \n print(\" \");\n od:\n RETURN(e valm(subc)):\nend:\nsubabet := proc(fromletter, toletter, abetm)\n l ocal suba, j, i;\n suba :=abetm;\n if toletter <> \" \" then\n \+ for j from 1 to linalg[coldim](suba) do\n if convert(suba[2, j], string) = toletter then\n suba[1,j] := convert(fromlett er, symbol):\n fi: \n od:\n elif toletter = \" \" the n\n for j from 1 to linalg[coldim](suba) do\n if convert( suba[1,j], string) = fromletter then\n suba[1,j] := convert (\" \", symbol):\n fi: \n od:\n fi:\n RETURN(evalm( suba));\nend:\ntonumber := proc(mess)\n local sl, cn, sn, ii:\n sl := length(mess);\n cn := 0;\n for ii from 1 to sl do\n sn := StringTools[Ord](substring(mess, ii..ii)):\n if sn >= 100 then\n cn := 1000*cn + sn:\n else\n cn := 100*cn + sn: \n fi:\n od:\n RETURN(cn): \nend:\ntoletter := proc(num) \n local cs, cn, sl, ans, i, tst; \n cn := num;\n sl := floor(tr unc(evalf(log10(cn)))/2) + 1:\n ans := \"\";\n for i from 1 to sl \+ do\n tst := cn/1000:\n if (frac(tst)*1000 >= 100) and (frac( tst)*1000 <= 127) then\n cn := cn/1000;\n cs := String Tools[Char](frac(cn)*1000);\n ans := cat(cs, ans);\n c n := trunc(cn);\n else\n cn := cn/100;\n cs := St ringTools[Char](frac(cn)*100);\n ans := cat(cs, ans);\n \+ cn := trunc(cn);\n fi:\n od:\n RETURN(ans)\nend:\nmblocks : = proc(message, bl)\n local messblocks;\n messblocks := [seq(subst ring(message,(i-1)*bl+1..i*bl),i=1..iquo(length(message),bl)+1)];\nend :\nrsa := proc(messnum, exponent, modulus)\n local z;\n z := map(m essnum -> messnum &^ exponent mod modulus, messnum);\nend:\nlnum := pr oc(num)\n length(convert(num, string));\nend:\ncaptomod26:= proc(cap )\nlocal num;\nnum:=modp(tonumber(cap)-65,26);\nRETURN(num)\nend:\nmod 26tocap:= proc(num)\nlocal cap;\ncap:=toletter(num + 65);\nRETURN(cap) \nend:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}}{SECT 1 {PARA 3 "" 0 "" {TEXT -1 33 "AffineCiphers: Brute Force Attack" }} {EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }{TEXT 256 48 "INPUT MODE 1: Rea d your input text from a file." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 118 " inputtext:='inputtext':\nreadfile:=readdata(\"readtext.txt\",string,1) :\ninputtext:=op(1,readfile):\n'inputtext'=inputtext;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 260 48 "INPUT MODE 2: Enter/paste your input text here." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 59 "inputtext:=\"ENTER OR PASTE IT HERE\":\n'inpu ttext'=inputtext;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}} {EXCHG {PARA 0 "" 0 "" {TEXT 261 56 "CIPHERTEXT OPTION 1: Set ciphert ext to input text here." }{TEXT -1 0 "" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 47 "ciphertext:=inputtext:\n'ciphertext'=ciphertext;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 258 47 "CIPHERTEXT OPTION 2: Encipher input text here." }{TEXT -1 1 " \n" }{TEXT 275 11 "ENTER a, b." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 120 " a:=19:\nb:=17:\nplaintext:=inputtext:\nciphertext:=affinecipher(nospac e(plaintext),a,b,encipher):\n'ciphertext'=ciphertext;\n" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG }{EXCHG {PARA 0 "" 0 "" {TEXT 259 163 "BRUTE FORCE ATTACK ON AFFINE CIPHER: Decipher cipherte xt here.\nNote that when you specify 'decipher' the program automatica lly creates the inverse transformation." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 151 "for i from 1 to 25 do\nif gcd(i,26)=1 then\nfor j from 0 to 2 5 do\nprint(affinecipher(ciphertext,i,j,decipher),`a = `,i,`b = `,j); \nod;\nprint(` `);\nfi;\nod;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 277 68 "OUTPUT MODE: Enter/pas te your output text here and write to a file." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 137 "outputtext:=\"ENTERORPASTEITHERE\":\nwritedata(\"wri tetext.txt\",[outputtext],string);\n`outputtext has been written to fi le: writetext.txt`; " }}}{EXCHG }{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}}{SECT 1 {PARA 3 "" 0 "" {TEXT -1 31 "AffineCiphers: Frequen cy Attack" }}{EXCHG {PARA 0 "" 0 "" {TEXT -1 0 "" }{TEXT 263 48 "INPUT MODE 1: Read your input text from a file." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 118 "inputtext:='inputtext':\nreadfile:=readdata(\"readte xt.txt\",string,1):\ninputtext:=op(1,readfile):\n'inputtext'=inputtext ;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 265 48 "INPUT MODE 2: Enter/paste your input text here." } }{PARA 0 "> " 0 "" {MPLTEXT 1 0 55 "inputtext:=\"ENTERORPASTEITHERE\": \n'inputtext'=inputtext;" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 " " }}}{EXCHG {PARA 0 "" 0 "" {TEXT 266 56 "CIPHERTEXT OPTION 1: Set ci phertext to input text here." }{TEXT -1 0 "" }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 47 "ciphertext:=inputtext:\n'ciphertext'=ciphertext;" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 264 47 "CIPHERTEXT OPTION 2: Encipher input text here." }{TEXT -1 1 "\n" }{TEXT 276 11 "ENTER a, b." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 120 "a:=19:\nb:=17:\nplaintext:=inputtext:\nciphertext:=affinecipher (nospace(plaintext),a,b,encipher):\n'ciphertext'=ciphertext;\n" }}} {EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 268 50 "FREQUENCY ANALYSIS: List k-graphs for k = 1 to n." } {TEXT -1 2 " \n" }{TEXT 269 22 "ENTER your value of n." }}{PARA 0 "> \+ " 0 "" {MPLTEXT 1 0 203 "n:=3:\nfor k from 1 to n do\nif k = 1 then\nl print(`E, T, A, O, I, N, R are the most frequently occuring English le tters, in order.`);\nlprint('ciphertext'=ciphertext);\nfi:\nstrgraph(c iphertext,k,false); \nod:" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 "" 0 "" {TEXT 270 61 "FREQUENCY ATTACK: Try mapp ing letters L1 to M1 and L2 to M2." }{TEXT -1 1 "\n" }{TEXT 271 21 "EN TER L1, L2, M1, M2." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 403 "L1:=\"E\": \nL2:=\"T\":\nM1:=\"P\":\nM2:=\"C\":\nx1:=captomod26(L1):\nx2:=captomo d26(L2):\ny1:=captomod26(M1):\ny2:=captomod26(M2):\na:='a':b:='b':\n'L 1'=L1,'M1'=M1,L1->M1;\n'x1'=x1,'y1'=y1,x1->y1;\na*x1+b=y1;``;\n'L2'=L2 ,'M2'=M2,L2->M2;\n'x2'=x2,'y2'=y2,x2->y2;\na*x2+b=y2;``;\n`Solve`,a*x1 +b=y1,a*x2+b=y2,`mod 26`;\nop(1,map(m -> m mod 26,solve(\{a*x1+b=y1,a* x2+b=y2\}))),\nop(2,map(m -> m mod 26,solve(\{a*x1+b=y1,a*x2+b=y2\}))) ;\n" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}}{EXCHG {PARA 0 " " 0 "" {TEXT 272 76 "CHECK YOUR LETTER MAPPING: Is there a plaintext \+ message using this a and b?" }}{PARA 0 "" 0 "" {TEXT 274 100 "Note tha t when you specify 'decipher' the program automatically creates the in verse transformation. " }{TEXT -1 1 "\n" }{TEXT 273 12 "ENTER a, b. " }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 52 "a:=13:\nb:=15:\naffinecipher(ciph ertext,a,b,decipher);" }}}{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" } }}{EXCHG {PARA 0 "" 0 "" {TEXT 278 68 "OUTPUT MODE: Enter/paste your \+ output text here and write to a file." }}{PARA 0 "> " 0 "" {MPLTEXT 1 0 137 "outputtext:=\"ENTERORPASTEITHERE\":\nwritedata(\"writetext.txt \",[outputtext],string);\n`outputtext has been written to file: write text.txt`; " }}}{EXCHG }{EXCHG {PARA 0 "> " 0 "" {MPLTEXT 1 0 0 "" }}} }{PARA 0 "" 0 "" {TEXT -1 0 "" }}}{MARK "3" 0 }{VIEWOPTS 1 1 0 1 1 1803 1 1 1 1 }{PAGENUMBERS 0 1 2 33 1 1 }