restart; with(Maplets[Elements]): rrep := proc(key) local i, nkey, skey; nkey := ""; skey := convert(convert(key,list), set); for i from 1 to length(key) do if member(key[i],skey) then nkey := cat(nkey, key[i]): skey := skey minus {key[i]}; fi: od: nkey := StringTools[Select](StringTools[IsUpper], StringTools[UpperCase](nkey)); end: playmat := proc(key) local rkey, abet, cabet, nr, nc, S, i, k, j; abet := "ABCDEFGHIKLMNOPQRSTUVWXYZ"; rkey := rrep(key); cabet := cat(rkey, (StringTools[Remove](rcurry( member, {op(convert(rkey, list))} ), StringTools[UpperCase](convert(abet, string))))); S := Matrix(5,5); ArrayTools[Fill]("", S); k := 0; for i from 1 to 5 do for j from 1 to 5 do k := k + 1: S[i,j] := substring(cabet, k); od: od: S; end: sblock2 := proc(s) local i, pt, b; i := 1; pt := []; while i <= length(s) do b := substring(s, i..i+1); if length(b) = 1 then pt := [op(pt), cat(b[1], "X")]; i := i + 1; else if b[1] <> b[2] then pt := [op(pt), cat(b[1], b[2])]; i := i + 2; else pt := [op(pt), cat(b[1], "X")]; i := i + 1; fi: fi: od: pt; end: fmatrc := proc(let, pmat) local i, j, res; for i from 1 to 5 do for j from 1 to 5 do if pmat[i, j] = let then res := [i, j]; break: fi: od: od: res; end: gnewc := proc(oldc) local ctires; if oldc[2] < 5 then ctires := [oldc[1], oldc[2] + 1] else ctires := [oldc[1], (oldc[2] + 1) mod 5] fi: ctires; end: gnewr := proc(oldr) local ctires; if oldr[1] < 5 then ctires := [oldr[1] + 1, oldr[2]]; else ctires := [(oldr[1] + 1) mod 5, oldr[2]]; fi: ctires; end: fcti := proc(f, g) local i, ct1, ct2; if f[1] = g[1] then ct1 := gnewc(f); ct2 := gnewc(g); elif f[2] = g[2] then ct1 := gnewr(f); ct2 := gnewr(g); else ct1 := [ f[1], g[2] ]; ct2 := [ g[1], f[2] ]; fi: [ct1, ct2]; end: gnewcd := proc(oldc) local ptires; if oldc[2] > 1 then ptires := [oldc[1], oldc[2] - 1] else ptires := [oldc[1], 5] fi: ptires; end: gnewrd := proc(oldr) local ptires; if oldr[1] > 1 then ptires := [oldr[1] - 1, oldr[2]]; else ptires := [5, oldr[2]]; fi: ptires; end: fpti := proc(f, g) local i, pt1, pt2; if f[1] = g[1] then pt1 := gnewcd(f); pt2 := gnewcd(g); elif f[2] = g[2] then pt1 := gnewrd(f); pt2 := gnewrd(g); else pt1 := [ f[1], g[2] ]; pt2 := [ g[1], f[2] ]; fi: [pt1, pt2]; end: playfair := proc(text, keyw, type) local rrkeyw, pmat, textb2, i, let1, let2, p, q, s, tb, t; rrkeyw := rrep(StringTools:-SubstituteAll(keyw, "’", "'")); pmat := playmat(rrkeyw); textb2:= StringTools:-SubstituteAll(StringTools[Select](StringTools[IsUpper], StringTools[UpperCase](StringTools:-SubstituteAll(text, "’", "'"))), "J", "I"); textb2 := sblock2(textb2); t := []; for i from 1 to nops(textb2) do let1 := textb2[i][1]; let2 := textb2[i][2]; p := fmatrc(let1, pmat); q := fmatrc(let2, pmat); if type = "encipher" then s := fcti(p, q); else s := fpti(p, q); fi: tb := cat( pmat[ op(s[1]) ], pmat[ op(s[2]) ] ); t := [ op(t), tb]; od: convert(cat(op(t)), symbol); end: wsetup := proc(type) if type = "encipher" then Maplets:-Tools:-Set('TB1'('editable') = 'true', 'TB1'('foreground') = 'blue', 'TF1'('editable') = 'true', 'TB2'('foreground') = 'red', 'B1'('visible') = 'true', 'B1'('enabled') = 'true', 'B1'('caption') = "Encipher Message"); elif type = "decipher" then Maplets:-Tools:-Set('TB1'('editable') = 'true', 'TB1'('foreground') = 'red', 'TF1'('editable') = 'true', 'TB2'('foreground') = 'blue','B1'('visible') = 'true', 'B1'('enabled') = 'true', 'B1'('caption') = "Decipher Message"); fi: end: playfairmaplet := Maplet( Window( 'title'="Playfair Cipher", BoxColumn('background' = 'navy', BoxRow('background' = 'navy', BoxColumn('halign' = 'none', 'background' = 'navy', BoxRow('halign' = 'none', Label("Encipher or Decipher a message?",'font' = Font("arial", 17)), DropDownBox['DDB1']( 'value' = "?", ["?", "encipher", "decipher"], 'font' = Font("times", 15), 'width' = 80, onchange = Action(Evaluate('function' = "wsetup", Argument('DDB1', 'quotedtext' = 'true'))) ), seq(HorizontalGlue(), i = 1..30)), BoxRow('halign' = 'none', Label("Input Message:", 'font' = Font("arial", 17)), TextBox['TB1']('editable' = 'false', 'font' = Font("arial", bold, 16), 7..50), HorizontalGlue()), BoxRow('halign' = 'none', Label("Keyword: ", 'font' = Font("arial", 17)), TextBox['TF1']('editable' = 'false', 'background' = 'white', 1..20, 'font' = Font("arial", bold, 16)), seq(HorizontalGlue(), i = 1..30)), BoxRow('halign' = 'none', Button['B1']('caption' = " ", 'font' = Font("arial", bold, 15), 'enabled' = 'false', Evaluate('TB2' = "playfair", Argument('TB1', 'quotedtext' = 'true'), Argument('TF1', 'quotedtext' = 'true'), Argument('DDB1', 'quotedtext' = 'true') ) ), TextBox['TB2']( 'editable' = 'false', 'font' = Font("arial", bold, 16), 7..47 ), HorizontalGlue()) ), BoxColumn( seq(VerticalGlue(), i = 1..7), Label(Image("Playfair.jpg")), Label("Baron Lyon Playfair",'font' = Font("arial", 17)), seq(VerticalGlue(), i = 1..10)), BoxColumn('background' = 'navy')), BoxRow('halign' = 'center', 'background' = 'navy', Button( "Clear All", 'font' = Font("arial", bold, 15), Action(SetOption('TB1' = "" ), SetOption('TB1'('editable') = 'false'), SetOption('TF1' = "" ), SetOption('TF1'('editable') = 'false'), SetOption('TB2' = "" ), SetOption('B1'('caption') = " "), SetOption('DDB1'('value') = "?")) ), " ", Button( "Quit", 'font' = Font("arial", bold, 15), Shutdown() ), " "))) ): Maplets[Display]( playfairmaplet ): # # # # # # # # # # # # # # # #