Chaocipher: Difference between revisions
Added Delphi example
(simplified conditional test for permutation) |
MaiconSoft (talk | contribs) (Added Delphi example) |
||
Line 662:
The recovered plaintext is : WELLDONEISBETTERTHANWELLSAID</pre>
=={{header|Delphi}}==
{{libheader| System.SysUtils}}
{{Trans|Kotlin}}
<lang Delphi>
program Chaocipher;
{$APPTYPE CONSOLE}
uses
System.SysUtils;
type
TMode = (mcEncrypt, mcDecrypt);
const
lAlphabet = 'HXUCZVAMDSLKPEFJRIGTWOBNYQ';
rAlphabet = 'PTLNBQDEOYSFAVZKGJRIHWXUMC';
function Chao(text: AnsiString; Mode: TMode; showSteps: boolean): AnsiString;
begin
var len := Length(text);
var left: AnsiString := lAlphabet;
var right: AnsiString := rAlphabet;
var eText: AnsiString;
SetLength(eText, len);
var temp: AnsiString;
SetLength(temp, 26);
for var i := 0 to len - 1 do
begin
if showSteps then
writeln(left, ' ', right);
var index := 0;
if Mode = mcEncrypt then
begin
index := pos(text[i + 1], right) - 1;
eText[i + 1] := left[index + 1];
end
else
begin
index := pos(text[i + 1], left) - 1;
eText[i + 1] := right[index + 1];
end;
if i = len - 1 then
Break;
// premute left
for var j := index to 25 do
temp[j - index + 1] := left[j + 1];
for var j := 0 to index - 1 do
temp[27 - index + j] := left[j + 1];
var store := temp[2];
for var j := 2 to 13 do
temp[j] := temp[j + 1];
temp[14] := store;
left := temp;
// permute right
for var j := index to 25 do
temp[j - index + 1] := right[j + 1];
for var j := 0 to index - 1 do
temp[27 - index + j] := right[j + 1];
store := temp[0 + 1];
for var j := 1 to 25 do
temp[j] := temp[j + 1];
temp[26] := store;
store := temp[3];
for var j := 3 to 13 do
temp[j] := temp[j + 1];
temp[14] := store;
right := temp;
end;
Result := eText;
end;
begin
var plainText := 'WELLDONEISBETTERTHANWELLSAID';
writeln('The original plaintext is :', plainText);
write(#10'The left and right alphabets after each permutation ');
writeln('during encryption are :'#10);
var cipherText := Chao(plainText, mcEncrypt, true);
writeln(#10'The ciphertext is :', cipherText);
var plainText2 := Chao(cipherText, mcDecrypt, false);
writeln(#10'The recovered plaintext is : ', plainText2);
readln;
end.</lang>
=={{header|F_Sharp|F#}}==
|