Playfair cipher: Difference between revisions
Content added Content deleted
(Updated D entry) |
(Added zkl) |
||
Line 997: | Line 997: | ||
Encoded: BM OD ZB XD NA BE KU DM UI XM KZ ZR FT |
Encoded: BM OD ZB XD NA BE KU DM UI XM KZ ZR FT |
||
Decoded: HI DE TH EG OL DI NT HE TR EX ST UM PZ |
Decoded: HI DE TH EG OL DI NT HE TR EX ST UM PZ |
||
</pre> |
|||
=={{header|zkl}}== |
|||
Punting Q out of the alphabet. |
|||
<lang zkl>fcn genKeyTable(key){ |
|||
key=(key-" qQ").toUpper().unique(); |
|||
key + (["A".."Z"].aggregate(String).walk()-"Q"-key); |
|||
}</lang> |
|||
<lang zkl>fcn playfair(text,keyTable){ // text is a-z only |
|||
text=text.toUpper(); |
|||
text=text-(text-keyTable); // remove unencodable characters |
|||
if(text.len().isOdd) text+="Z"; |
|||
row:='wrap(c){ keyTable.index(c)/5 }; |
|||
col:='wrap(c){ keyTable.index(c)%5 }; |
|||
ltrRight:='wrap(c){ keyTable[(keyTable.index(c)+1)%25] }; |
|||
ltrBelow:='wrap(c){ keyTable[(keyTable.index(c)+5)%25] }; |
|||
ltrAt:='wrap(r,c){ keyTable[r*5+c] }; |
|||
(text.toUpper()-"Q").pump(String,T(T,Void.Read,1), //-->digraph |
|||
'wrap(a,b){ |
|||
if(a==b) b="X"; |
|||
if((ra:=row(a)) == (rb:=row(b))) return(ltrRight(a)+ltrRight(b)); |
|||
if((ca:=col(a)) == (cb:=col(b))) return(ltrBelow(a)+ltrBelow(b)); |
|||
return(ltrAt(ra,cb)+ltrAt(rb,ca)); |
|||
}); |
|||
}</lang> |
|||
<lang zkl>fcn decodePF(text,keyTable){ |
|||
row:='wrap(c){ keyTable.index(c)/5 }; |
|||
col:='wrap(c){ keyTable.index(c)%5 }; |
|||
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] }; |
|||
ltrAt:='wrap(r,c){ keyTable[r*5+c] }; |
|||
text.pump(String,T(T,Void.Read,1), //-->digraph |
|||
'wrap(a,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)); |
|||
return(ltrAt(ra,cb)+ltrAt(rb,ca)); |
|||
}); |
|||
}</lang> |
|||
<lang zkl>msg:="Hide the gold in the tree stump!!!"; |
|||
keyTable:=genKeyTable("playfair example"); |
|||
msg.println(); |
|||
e:=playfair(msg,keyTable); e.println(); |
|||
decodePF(e,keyTable).println();</lang> |
|||
{{out}} |
|||
<pre> |
|||
Hide the gold in the tree stump!!! |
|||
BMNDZBXDKYBEJVDMUIXMJZZRFT |
|||
HIDETHEGOLDINTHETREXSTUMPZ |
|||
</pre> |
</pre> |