39 lines
1.4 KiB
Text
39 lines
1.4 KiB
Text
with javascript_semantics
|
|
enum encrypt,decrypt
|
|
function bifid(string msg, polybius, sequence p, integer n, ed)
|
|
string res = ""
|
|
sequence dx = {}, dy = {}, dxy
|
|
for i=1 to length(msg) do
|
|
integer k = find(msg[i],polybius)-1
|
|
dx &= floor(k/n)+1
|
|
dy &= remainder(k,n)+1
|
|
end for
|
|
if ed=encrypt then
|
|
dxy = split_by(dx&dy,2)
|
|
else
|
|
-- "simply reversing these steps" - yeah, right...
|
|
dxy = columnize(split_by(flatten(columnize({dx,dy})),length(dx)))
|
|
end if
|
|
for i=1 to length(dxy) do
|
|
integer {x,y} = dxy[i]
|
|
res &= p[x][y]
|
|
end for
|
|
return res
|
|
end function
|
|
|
|
procedure test(string msg, polybius)
|
|
integer n = sqrt(length(polybius))
|
|
if n=5 then msg = substitute(upper(msg),"J","I") end if
|
|
sequence p = split_by(polybius,n)
|
|
string enc = bifid(msg,polybius,p,n,encrypt),
|
|
dec = bifid(enc,polybius,p,n,decrypt)
|
|
printf(1,"For %dx%d polybius %s\n\n",{n,n,join(p,"\n ")})
|
|
printf(1,"Message : %s\nEncrypted: %s\nDecrypted: %s\n\n",{msg,enc,dec})
|
|
end procedure
|
|
|
|
constant polybii = {tagstart('A','J'-'A')&tagstart('K','Z'-'J'),
|
|
"BGWKZQPNDSIOAXEFCLUMTHYVR",
|
|
" ."&tagstart('A',26)&tagstart('a',26)&tagstart('0',10)},
|
|
messages = {"ATTACKATDAWN","FLEEATONCE",
|
|
"The invasion will start on the first of January 2023."}
|
|
for t=1 to 3 do test(messages[t],polybii[t]) end for
|