Anonymous user
Playfair cipher: Difference between revisions
→{{header|zkl}}: bug fixes
m (→{{header|zkl}}: update) |
(→{{header|zkl}}: bug fixes) |
||
Line 1,478:
=={{header|zkl}}==
<lang zkl>fcn genKeyTable(key,deadChr){ // deadChr=="Q" or "J"▼
deadChr=deadChr.toUpper();
▲<lang zkl>fcn genKeyTable(key){
key=
return(key + (["A".."Z"].
}</lang>
<lang zkl>fcn playfair(text,
keyTable,deadChr:=keytable;
text=text.toUpper();
text-=text - keyTable; // remove unencodable characters
if(
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] };
foreach a in (text){
if(a==b) b="X";▼
b:=__aWalker._next() and __aWalker.value or "X";
if((ra:=row(a))==(rb:=row(b))) return(ltrRight(a)+ltrRight(b));▼
if(a==b){
if((ca:=col(a))==(cb:=col(b))) return(ltrBelow(a)+ltrBelow(b));▼
if(b=="X"){ // "XX" is pathological
return(ltrAt(ra,cb)+ltrAt(rb,ca));▼
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 zkl>fcn decodePF(text,keyTable){
keyTable,_=keyTable;
text-=" ";
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,Void.Read, //-->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));
})
.pump(String,Void.Read,"".create.fp(" ")).strip(); // insert blanks
}</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();
decodePF(playfair("X",keyTable).println(),keyTable).println();
decodePF(playfair("XX",keyTable).println(),keyTable).println();</lang>
{{out}}
<pre>
Hide the gold in the tree stump!!!
BM OD ZB XD NA BE KU DM UI XM MO UV IF
HI DE TH EG OL DI NT HE TR EX ES TU MP
MW
XZ
MW MW
XZ XZ
</pre>
|