Chaocipher: Difference between revisions

no edit summary
No edit summary
Line 10:
Code the algorithm in your language and to test that it works with the plaintext 'WELLDONEISBETTERTHANWELLSAID' used in the paper itself.
<br><br>
 
=={{header|Ada}}==
Ada strings are indexed starting at 1. This fact resulted in some adjustments in loop control values compared with the C# reference solution.
<lang Ada>
with Ada.Text_IO; use Ada.Text_IO;
 
procedure Main is
type iMode is (Encrypt, Decrypt);
 
L_Alphabet : String := "HXUCZVAMDSLKPEFJRIGTWOBNYQ";
R_Alphabet : String := "PTLNBQDEOYSFAVZKGJRIHWXUMC";
plaintext : String := "WELLDONEISBETTERTHANWELLSAID";
ciphertext : String (1 .. plaintext'length);
plaintext2 : String (1 .. plaintext'length);
 
function IndexOf (Source : String; Value : Character) return Positive is
Result : Positive;
 
begin
for I in Source'Range loop
if Source (I) = Value then
Result := I;
exit;
end if;
end loop;
return Result;
end IndexOf;
 
function Exec
(Text : String; mode : iMode; showsteps : Boolean := False) return String
is
etext : String (Text'First .. Text'Last);
temp : String (1 .. 26);
index : Positive;
store : Character;
left : String := L_Alphabet;
right : String := R_Alphabet;
begin
for I in Text'Range loop
if showsteps then
Put_Line (left & " " & right);
end if;
 
if mode = Encrypt then
index := IndexOf (Source => right, Value => Text (I));
etext (I) := left (index);
else
index := IndexOf (Source => left, Value => Text (I));
etext (I) := right (index);
end if;
 
exit when I = Text'Last;
 
-- permute left
 
for j in index .. 26 loop
temp (j - index + 1) := left (j);
end loop;
for j in 1 .. index loop
temp (26 - index + j) := left (j);
end loop;
store := temp (2);
for j in 3 .. 14 loop
temp (j - 1) := temp (j);
end loop;
temp (14) := store;
left := temp;
 
-- permute right
 
for j in index .. 26 loop
temp (j - index + 1) := right (j);
end loop;
for j in 1 .. index loop
temp (26 - index + j) := right (j);
end loop;
store := temp (1);
for j in 2 .. 26 loop
temp (j - 1) := temp (j);
end loop;
temp (26) := store;
store := temp (3);
for j in 4 .. 14 loop
temp (j - 1) := temp (j);
end loop;
temp (14) := store;
right := temp;
end loop;
 
return etext;
 
end Exec;
 
begin
Put_Line ("The original text is : " & plaintext);
New_Line;
Put_Line
("The left and right alphabets after each permutation during encryption are:");
New_Line;
ciphertext := Exec (plaintext, Encrypt, True);
New_Line;
Put_Line ("The ciphertext is : " & ciphertext);
plaintext2 := Exec (ciphertext, Decrypt);
New_Line;
Put_Line ("The recovered plaintext is : " & plaintext2);
end Main;
</lang>
{{output}}
<lang Ada>
The original text is : WELLDONEISBETTERTHANWELLSAID
 
The left and right alphabets after each permutation during encryption are:
 
HXUCZVAMDSLKPEFJRIGTWOBNYQ PTLNBQDEOYSFAVZKGJRIHWXUMC
ONYHXUCZVAMDSBLKPEFJRIGTWO XUPTLNBQDEOYSMFAVZKGJRIHWW
ADSBLKPEFJRIGMTWONYHXUCZVA OYMFAVZKGJRIHSWXUPTLNBQDEE
HUCZVADSBLKPEXFJRIGMTWONYH NBDEOYMFAVZKGQJRIHSWXUPTLL
YUCZVADSBLKPEHXFJRIGMTWONY NBEOYMFAVZKGQDJRIHSWXUPTLL
HFJRIGMTWONYUXCZVADSBLKPEH JRHSWXUPTLNBEIOYMFAVZKGQDD
CVADSBLKPEHFJZRIGMTWONYUXC YMAVZKGQDJRHSFWXUPTLNBEIOO
OYUXCVADSBLKPNEHFJZRIGMTWO BEOYMAVZKGQDJIRHSFWXUPTLNN
YXCVADSBLKPNEUHFJZRIGMTWOY OYAVZKGQDJIRHMSFWXUPTLNBEE
PEUHFJZRIGMTWNOYXCVADSBLKP RHSFWXUPTLNBEMOYAVZKGQDJII
UFJZRIGMTWNOYHXCVADSBLKPEU FWUPTLNBEMOYAXVZKGQDJIRHSS
MWNOYHXCVADSBTLKPEUFJZRIGM EMYAXVZKGQDJIORHSFWUPTLNBB
MNOYHXCVADSBTWLKPEUFJZRIGM MYXVZKGQDJIORAHSFWUPTLNBEE
JRIGMNOYHXCVAZDSBTWLKPEUFJ LNEMYXVZKGQDJBIORAHSFWUPTT
FRIGMNOYHXCVAJZDSBTWLKPEUF LNMYXVZKGQDJBEIORAHSFWUPTT
JDSBTWLKPEUFRZIGMNOYHXCVAJ IOAHSFWUPTLNMRYXVZKGQDJBEE
ZGMNOYHXCVAJDISBTWLKPEUFRZ YXZKGQDJBEIOAVHSFWUPTLNMRR
PUFRZGMNOYHXCEVAJDISBTWLKP LNRYXZKGQDJBEMIOAVHSFWUPTT
IBTWLKPUFRZGMSNOYHXCEVAJDI SFUPTLNRYXZKGWQDJBEMIOAVHH
ADIBTWLKPUFRZJGMSNOYHXCEVA VHFUPTLNRYXZKSGWQDJBEMIOAA
KUFRZJGMSNOYHPXCEVADIBTWLK RYZKSGWQDJBEMXIOAVHFUPTLNN
GSNOYHPXCEVADMIBTWLKUFRZJG QDBEMXIOAVHFUJPTLNRYZKSGWW
OHPXCEVADMIBTYWLKUFRZJGSNO MXOAVHFUJPTLNIRYZKSGWQDBEE
BYWLKUFRZJGSNTOHPXCEVADMIB NIYZKSGWQDBEMRXOAVHFUJPTLL
IYWLKUFRZJGSNBTOHPXCEVADMI NIZKSGWQDBEMRYXOAVHFUJPTLL
KFRZJGSNBTOHPUXCEVADMIYWLK GWDBEMRYXOAVHQFUJPTLNIZKSS
OPUXCEVADMIYWHLKFRZJGSNBTO VHFUJPTLNIZKSQGWDBEMRYXOAA
MYWHLKFRZJGSNIBTOPUXCEVADM ZKQGWDBEMRYXOSAVHFUJPTLNII
 
The ciphertext is : OAHYHCOYPUMMJFJZPIAKGOBIKOMK
 
The recovered plaintext is : WELLDONEISBETTERTHANWELLSAID
</lang>
 
=={{header|Arc}}==
82

edits