I'm getting an access error when assigning a dynamic array of type array of integer to a variable also of type array of integer. The function PRGA returns an array of integer.
The line in question is:
keystream := PRGA(S, length(plaintext));
This is the full code:
program rc4;
uses
sysutils, strutils;
type
myArray = array[0..255] of integer;
dynamicArray = array of integer;
dynamicArrayString = array of string;
var
S : myArray;
keystream, cipher : dynamicArray;
hexCipher : dynamicArrayString;
key, plaintext, cipherString : string;
i, sizeOfArray, sizeOfHexArray : integer;
function KSA(key : AnsiString) : myArray;
var
i, j, key_length, temp, interJ: integer;
begin
key_length := length(key);
key_length := key_length;
interJ := 0;
j := 0;
temp := 0;
for i := 0 to 256 do
S[i] := i;
for i := 1 to 256 do // allows access to first element of ansistring.
begin // key[0] cannot be accessed
interJ := i mod key_length;
if interJ = 0 then // if interJ is 0, key[0] cannot be accessed
interJ := 3; // 3 mod 3 = 0
j := ((j + S[i-1] + ord(key[interJ])) mod 256);
temp := S[i-1];
S[i-1] := S[j];
S[j] := temp;
end;
KSA := S;
end;
function PRGA(S : myArray; n : integer) : dynamicArray;
var
i, j, K, temp, sizeOfArray : integer;
key : dynamicArray;
begin
i := 0;
j := 0;
K := 0;
temp := 0;
sizeOfArray := n - 1;
SetLength(key, sizeOfArray);
while n > 0 do
begin
n := n - 1;
i := (i + 1) mod 256;
j := (j + S[i]) mod 256;
temp := S[i];
S[i] := S[j];
S[j] := temp;
K := S[(S[i] + S[j]) mod 256];
key[i-1] := K;
end;
PRGA := key;
end;
begin
sizeOfArray := 0;
key := 'Key';
plaintext := 'Plaintext';
S := KSA(key);
keystream := PRGA(S, length(plaintext));
for i := 0 to (length(plaintext) - 1) do
begin
sizeOfArray := sizeOfArray + 1;
SetLength(cipher, sizeOfArray);
cipher[i] := ((keystream[i]) xor (ord(plaintext[i+1])));
end;
sizeOfHexArray := 0;
for i := 0 to sizeOfArray - 1 do
begin
sizeOfHexArray := sizeOfHexArray + 1;
SetLength(hexCipher, sizeOfHexArray);
hexCipher[i] := IntToHex(cipher[i], 2);
end;
cipherString := '';
for i := 0 to sizeOfHexArray - 1 do
begin
cipherString := cipherString + hexCipher[i];
end;
writeln(cipherString);
end.
I assumed that it was because the size of the keystream variable did not have a size. However using SetLength(keystream,length(plaintext)) still leads to an access violation.
key_length := length(key); key_length := key_length;. What is that good for?for i := 0 to 256 dois most definitely wrong. Why don't you copy the Python program (from your previous question) a little closer? And, as David says, turn on range checking.