The ISAAC cipher: Difference between revisions

Content added Content deleted
(Dialects of BASIC moved to the BASIC section.)
m (→‎{{header|Modula-2}}: Some corrections i optimizations based on the C version.)
Line 3,272: Line 3,272:
TMode = (iEncrypt, iDecrypt);
TMode = (iEncrypt, iDecrypt);
TString = ARRAY [0 .. MaxStrLength - 1] OF CHAR;
TString = ARRAY [0 .. MaxStrLength - 1] OF CHAR;
THexString = ARRAY [0 .. 2 * MaxStrLength - 1] OF CHAR;
TCardIndexedFrom0To7 = ARRAY [0 .. 7] OF CARDINAL;
TCardIndexedFrom0To7 = ARRAY [0 .. 7] OF CARDINAL;


Line 3,282: Line 3,283:
XorPlainText: TString = '';
XorPlainText: TString = '';
ModPlainText: TString = '';
ModPlainText: TString = '';
HexText: THexString;
Mode: TMode = iEncrypt;
HexText: TString;


(* ISAAC globals *)
(* ISAAC globals *)
(* external results *)
(* external results *)
RandRsl: ARRAY [0 .. 256] OF CARDINAL;
RandRsl: ARRAY [0 .. 255] OF CARDINAL;
RandCnt: CARDINAL;
RandCnt: CARDINAL;


(* internal state *)
(* internal state *)
MM: ARRAY [0 .. 256] OF CARDINAL;
MM: ARRAY [0 .. 255] OF CARDINAL;
AA: CARDINAL = 0;
AA: CARDINAL = 0;
BB: CARDINAL = 0;
BB: CARDINAL = 0;
Line 3,378: Line 3,378:
PROCEDURE SeedIsaac(Seed: ARRAY OF CHAR; Flag: BOOLEAN);
PROCEDURE SeedIsaac(Seed: ARRAY OF CHAR; Flag: BOOLEAN);
VAR
VAR
I, M: CARDINAL;
I, SeedLength: CARDINAL;
BEGIN
BEGIN
FOR I := 0 TO 255 DO
FOR I := 0 TO 255 DO
MM[I] := 0;
MM[I] := 0;
END;
END;
M := Length(Seed);
SeedLength := Length(Seed);
FOR I := 0 TO 255 DO
FOR I := 0 TO 255 DO
(* In case seed has less than 256 elements *)
(* In case seed has less than 256 elements *)
IF I > M THEN
IF I > SeedLength THEN
RandRsl[I] := 0
RandRsl[I] := 0
ELSE
ELSE
Line 3,439: Line 3,439:
OrdMsgI: SHORTCARD;
OrdMsgI: SHORTCARD;
BEGIN
BEGIN
Assign('', Destination);
Assign(Msg, Destination);
FOR I := 0 TO Length(Msg) - 1 DO
FOR I := 0 TO Length(Msg) - 1 DO
OrdMsgI := ORD(Msg[I]);
OrdMsgI := ORD(Msg[I]);
Append(CHR(GetRandomChar() BXOR OrdMsgI), Destination);
Destination[I] := CHR(GetRandomChar() BXOR OrdMsgI);
END;
END;
END Vernam;
END Vernam;
Line 3,475: Line 3,475:
I: CARDINAL;
I: CARDINAL;
BEGIN
BEGIN
Assign('', Destination);
Assign(Msg, Destination);
FOR I := 0 TO Length(Msg) - 1 DO
FOR I := 0 TO Length(Msg) - 1 DO
Append(Caesar(M, Msg[I], GetRandomChar(), 95, ' '), Destination);
Destination[I] := Caesar(M, Msg[I], GetRandomChar(), 95, ' ');
END;
END;
END Vigenere;
END Vigenere;
Line 3,485: Line 3,485:
SeedIsaac(Key, TRUE);
SeedIsaac(Key, TRUE);
(* (2) Encryption *)
(* (2) Encryption *)
Mode := iEncrypt;
(* (a) XOR (Vernam) *)
(* (a) XOR (Vernam) *)
Vernam(Msg, XorCipherText);
Vernam(Msg, XorCipherText);
(* (b) MOD (Vigenere) *)
(* (b) MOD (Vigenere) *)
Vigenere(Msg, Mode, ModCipherText);
Vigenere(Msg, iEncrypt, ModCipherText);
(* (3) Decryption *)
(* (3) Decryption *)
Mode := iDecrypt;
SeedIsaac(Key, TRUE);
SeedIsaac(Key, TRUE);
(* (a) XOR (Vernam) *)
(* (a) XOR (Vernam) *)
Vernam(XorCipherText, XorPlainText);
Vernam(XorCipherText, XorPlainText);
(* (b) MOD (Vigenere) *)
(* (b) MOD (Vigenere) *)
Vigenere(ModCipherText, Mode, ModPlainText);
Vigenere(ModCipherText, iDecrypt, ModPlainText);
(* program output *)
(* program output *)
WriteString('Message: '); WriteString(Msg); WriteLn;
WriteString('Message: '); WriteString(Msg); WriteLn;