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 = ''; |
||
⚫ | |||
Mode: TMode = iEncrypt; |
|||
⚫ | |||
(* ISAAC globals *) |
(* ISAAC globals *) |
||
(* external results *) |
(* external results *) |
||
RandRsl: ARRAY [0 .. |
RandRsl: ARRAY [0 .. 255] OF CARDINAL; |
||
RandCnt: CARDINAL; |
RandCnt: CARDINAL; |
||
(* internal state *) |
(* internal state *) |
||
MM: ARRAY [0 .. |
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, |
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; |
||
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 > |
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( |
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]); |
||
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( |
Assign(Msg, Destination); |
||
FOR I := 0 TO Length(Msg) - 1 DO |
FOR I := 0 TO Length(Msg) - 1 DO |
||
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, |
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, |
Vigenere(ModCipherText, iDecrypt, ModPlainText); |
||
(* program output *) |
(* program output *) |
||
WriteString('Message: '); WriteString(Msg); WriteLn; |
WriteString('Message: '); WriteString(Msg); WriteLn; |