string 0; \use zero-terminated strings def MaxLen = 100; \more than length of longest message func StrLen(A); \Return number of characters in an ASCIIZ string char A; int I; for I:= 0 to MaxLen do if A(I) = 0 then return I; proc StrUpper(S); \In string S, convert lowercase characters to uppercase char S; int I; for I:= 0 to StrLen(S)-1 do if S(I)>=^a & S(I)<=^z then S(I):= S(I) & $DF; proc StrReplace(S, C1, C2); \In string S, convert character C1 to C2 char S, C1, C2; int I; for I:= 0 to StrLen(S)-1 do if S(I) = C1 then S(I):= C2; func IndexOf(S, C); \Return offset of character C in string S char S, C; int I; [for I:= 0 to StrLen(S)-1 do if S(I) = C then return I; return -1; ]; char Encrypted(MaxLen), Decrypted(MaxLen); proc Encrypt(Polybius, Message); \Copy encrypted Message into Encrypted char Polybius, Message; char Rows(MaxLen*2), Cols(MaxLen); int C, IX, I, J, Len; [Len:= StrLen(Message); for I:= 0 to Len do \copy Message into Encrypted Encrypted(I):= Message(I); StrUpper(Encrypted); StrReplace(Encrypted, ^J, ^I); I:= 0; J:= 0; loop [C:= Encrypted(I); I:= I+1; if C = 0 then quit; IX:= IndexOf(Polybius, C); if IX >= 0 then \ignores spaces, etc. [Rows(J):= IX/5; Cols(J):= rem(0); J:= J+1; ]; ]; Len:= J; \length of encrypted message for I:= 0 to Len-1 do \append Cols onto end of Rows Rows(I+Len):= Cols(I); for I:= 0 to Len-1 do [IX:= Rows(I*2)*5 + Rows(I*2+1); Encrypted(I):= Polybius(IX); ]; Encrypted(I):= 0; \terminate string ]; proc Decrypt(Polybius, Message); \Copy decrypted Message into Decrypted char Polybius, Message; char Rows(MaxLen*2), Cols(MaxLen); int C, IX, I, J, Len; [I:= 0; J:= 0; loop [C:= Message(I); if C = 0 then quit; I:= I+1; IX:= IndexOf(Polybius, C); Rows(J):= IX/5; Rows(J+1):= rem(0); J:= J+2; ]; Len:= I; Cols:= Rows + Len; for I:= 0 to Len-1 do [IX:= Rows(I)*5 + Cols(I); Decrypted(I):= Polybius(IX); ]; Decrypted(I):= 0; ]; int Polys, Msgs, I; [Polys:= ["ABCDEFGHIKLMNOPQRSTUVWXYZ", "BGWKZQPNDSIOAXEFCLUMTHYVR", "BGWKZQPNDSIOAXEFCLUMTHYVR", "PLAYFIREXMBCDGHKNOQSTUVWZ"]; Msgs:= ["ATTACKATDAWN", "FLEEATONCE", "ATTACKATDAWN", "The invasion will start on the first of January"]; for I:= 0 to 4-1 do [Encrypt(Polys(I), Msgs(I)); Decrypt(Polys(I), Encrypted); Text(0, "Message : "); Text(0, Msgs(I)); CrLf(0); Text(0, "Encrypted : "); Text(0, Encrypted); CrLf(0); Text(0, "Decrypted : "); Text(0, Decrypted); CrLf(0); if I < 4-1 then CrLf(0); ]; ]