Playfair cipher: Difference between revisions
Content deleted Content added
m →{{header|zkl}}: update |
→{{header|zkl}}: bug fixes |
||
Line 1,478: | Line 1,478: | ||
=={{header|zkl}}== |
=={{header|zkl}}== |
||
⚫ | |||
Punting Q out of the alphabet. |
|||
deadChr=deadChr.toUpper(); |
|||
⚫ | |||
key= |
key=key.toUpper().unique() - " " - deadChr; |
||
key + (["A".."Z"]. |
return(key + (["A".."Z"].pump(String) - deadChr - key), deadChr); |
||
}</lang> |
}</lang> |
||
<lang zkl>fcn playfair(text, |
<lang zkl>fcn playfair(text,keytable){ // text is a-z only |
||
keyTable,deadChr:=keytable; |
|||
text=text.toUpper(); |
text=text.toUpper(); |
||
text-=text - keyTable; // remove unencodable characters |
text-=text - keyTable; // remove unencodable characters |
||
if( |
if(deadChr=="Q") text-=deadChr; else text=text.replace("J","I"); |
||
row:='wrap(c){ keyTable.index(c)/5 }; |
row:='wrap(c){ keyTable.index(c)/5 }; |
||
col:='wrap(c){ keyTable.index(c)%5 }; |
col:='wrap(c){ keyTable.index(c)%5 }; |
||
ltrRight:='wrap(c){ keyTable[(keyTable.index(c)+1)%25] }; |
ltrRight:='wrap(c){ keyTable[(keyTable.index(c) + 1)%25] }; |
||
ltrBelow:='wrap(c){ keyTable[(keyTable.index(c)+5)%25] }; |
ltrBelow:='wrap(c){ keyTable[(keyTable.index(c) + 5)%25] }; |
||
ltrAt:='wrap(r,c){ keyTable[r*5+c] }; |
ltrAt:='wrap(r,c) { keyTable[r*5 + c] }; |
||
(text.toUpper()-"Q").pump(String,Void.Read, //-->digraph |
|||
sink:=Sink(String); |
|||
foreach a in (text){ |
|||
⚫ | |||
b:=__aWalker._next() and __aWalker.value or "X"; |
|||
⚫ | |||
if(a==b){ |
|||
⚫ | |||
if(b=="X"){ // "XX" is pathological |
|||
⚫ | |||
if(not __aWalker.atEnd) __aWalker.push(b); |
|||
⚫ | |||
⚫ | |||
} |
|||
else { __aWalker.push(b); b="X"; } |
|||
} |
|||
sink.write( |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} |
|||
sink.close() |
|||
.pump(String,Void.Read,"".create.fp(" ")).strip(); // insert blanks |
|||
}</lang> |
}</lang> |
||
<lang zkl>fcn decodePF(text,keyTable){ |
<lang zkl>fcn decodePF(text,keyTable){ |
||
keyTable,_=keyTable; |
|||
text-=" "; |
|||
row:='wrap(c){ keyTable.index(c)/5 }; |
row:='wrap(c){ keyTable.index(c)/5 }; |
||
col:='wrap(c){ keyTable.index(c)%5 }; |
col:='wrap(c){ keyTable.index(c)%5 }; |
||
ltrLeft:='wrap(c){ keyTable[(keyTable.index(c)-1)%25] }; |
ltrLeft:='wrap(c){ keyTable[(keyTable.index(c) - 1)%25] }; |
||
ltrUp:='wrap(c){ n:=keyTable.index(c)-5; if(n<0)n+=25; keyTable[n%25] }; |
ltrUp:='wrap(c){ n:=keyTable.index(c) - 5; if(n<0)n+=25; keyTable[n%25] }; |
||
ltrAt:='wrap(r,c){ keyTable[r*5+c] }; |
ltrAt:='wrap(r,c){ keyTable[r*5 + c] }; |
||
text.pump(String,Void.Read, //-->digraph |
text.pump(String,Void.Read, //-->digraph |
||
'wrap(a,b){ |
'wrap(a,b){ |
||
if((ra:=row(a))==(rb:=row(b))) return(ltrLeft(a)+ltrLeft(b)); |
if((ra:=row(a))==(rb:=row(b))) return(ltrLeft(a) + ltrLeft(b)); |
||
if((ca:=col(a))==(cb:=col(b))) return(ltrUp(a)+ltrUp(b)); |
if((ca:=col(a))==(cb:=col(b))) return(ltrUp(a) + ltrUp(b)); |
||
return(ltrAt(ra,cb)+ltrAt(rb,ca)); |
return(ltrAt(ra,cb) + ltrAt(rb,ca)); |
||
}) |
}) |
||
.pump(String,Void.Read,"".create.fp(" ")).strip(); // insert blanks |
|||
⚫ | |||
} |
|||
⚫ | |||
<lang zkl>msg:="Hide the gold in the tree stump!!!"; |
<lang zkl>msg:="Hide the gold in the tree stump!!!"; |
||
keyTable:=genKeyTable("playfair example"); |
keyTable:=genKeyTable("playfair example"); |
||
msg.println(); |
msg.println(); |
||
e:=playfair(msg,keyTable); e.println(); |
e:=playfair(msg,keyTable); e.println(); |
||
decodePF(e,keyTable).println(); |
decodePF(e,keyTable).println(); |
||
decodePF(playfair("X",keyTable).println(),keyTable).println(); |
|||
decodePF(playfair("XX",keyTable).println(),keyTable).println();</lang> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
Hide the gold in the tree stump!!! |
Hide the gold in the tree stump!!! |
||
BM OD ZB XD NA BE KU DM UI XM MO UV IF |
|||
BMNDZBXDKYBEJVDMUIXMJZZRFT |
|||
HI DE TH EG OL DI NT HE TR EX ES TU MP |
|||
HIDETHEGOLDINTHETREXSTUMPZ |
|||
MW |
|||
XZ |
|||
MW MW |
|||
XZ XZ |
|||
</pre> |
</pre> |