Error in pascalabc.net: Runtime error: The index was outside the bounds of the array
The error lies in these two lines(the full code is shown below)
exptab[i]:= (45 * exptab[i-1]) mod 257;
logtab[exptab[i]]:= i;
I understand that pascalabc represents how exptab[i] will be equal to 256 and throws an error beforehand.Online compilers do not see the error and the program works correctly. I can't change the conditions themselves, because the program encodes a certain cipher with certain conditions. Explain what might be wrong, because I won't be able to show the program running without running pascalabc(if it turns out to be the problem of the compiler, then I will try to negotiate with the teacher).
program SAFERK64;
VAR a1, a2, a3, a4, a5, a6, a7, a8, b1, b2, b3, b4, b5, b6, b7, b8, r: byte;
k: ARRAY[1..21,1..8] OF byte; k1: ARRAY[1..8] OF byte;
logtab, exptab: ARRAY[0..255] OF integer; i, j, flag: integer;
PROCEDURE mat1(VAR a1, a2, b1, b2: byte);
BEGIN b2:= a1 + a2; b1:= b2 + a1; END;
PROCEDURE invmat1(VAR a1, a2, b1, b2: byte);
BEGIN b1:= a1 - a2; b2:= -b1 + a2; END;
BEGIN
logtab[1]:= 0; exptab[0]:= 1;
FOR i:= 1 TO 255 DO
BEGIN
exptab[i]:= (45 * exptab[i-1]) mod 257;
logtab[exptab[i]]:= i;
END;
exptab[128]:= 0; logtab[0]:= 128; exptab[0]:= 1;
flag:= 0; writeln;
writeln('Введите число раундов r (max 10)'); readln(r);
writeln; writeln('Введите исходный текст из 8 байт с пробелами между ними');
REPEAT
BEGIN
writeln('(Значение байта от 0 до 255)');
readln(a1, a2, a3, a4, a5, a6, a7, a8);
writeln('Введите ключ из 8 байт');
readln(k[1,1],k[1,2],k[1,3],k[1,4],k[1,5],k[1,6],k[1,7],k[1,8]);
k1 [1]:= k[1,1]; k1[2]:= k[1,2]; k1[3]:= k[1,3]; k1[4]:= k[1,4];
k1 [5]:= k[1,5]; k1[6]:= k[1,6]; k1[7]:= k[1,7]; k1[8]:= k[1,8];
writeln('ИСХОДНЫЙ ТЕКСТ ', a1:8,a2:4,a3:4,a4:4,a5:4,a6:4,a7:4,a8:4);
writeln('КЛЮЧ ', k[1,1]:8,k[1,2]:4,k[1,3]:4,k[1,4]:4,
k[ 1,5]:4,k[ 1,6]:4,k[ 1,7] :4,k[ 1,8] :4);
FOR i:= 2 TO 2*r + 1 DO
FOR j:= 1 TO 8 DO
BEGIN
k1[j]:= (k1[j] shl 3) + (k1[j] shr 5);
k[i,j]:= k1[j] + exptab[exptab[9*i+j]];
END;
FOR i:= 1 TO r DO
BEGIN
a1:= a1 xor k[2*i-1,1]; a2:= a2 + k[2*i-1,2];
a3:= a3 + k[2*i-1,3]; a4:= a4 xor k[2*i-1,4];
a5:= a5 xor k[2*i-1,5]; a6:= a6 + k[2*i-1,6];
a7:= a7 + k[2*i-1,7]; a8:= a8 xor k[2*i-1,8];
b1:= exptab[a1]; b2:= logtab[a2]; b3:= logtab[a3]; b4:= exptab[a4];
b5:=exptab[a5]; b6:= logtab[a6]; b7:= logtab[a7]; b8:= exptab[a8];
b1:= b1 + k[2*i,1]; b2:= b2 xor k[2*i,2];
b3:= b3 xor k[2*i,3]; b4:= b4 + k[2*i,4];
b5:= b5 + k[2*i,5]; b6:= b6 xor k[2*i,6];
b7:= b7 xor k[2*i,7]; b8:= b8 + k[2*i,8];
mat1(b1, b2, a1, a2); mat1(b3, b4, a3, a4);
mat1(b5, b6, a5, a6); mat1(b7, b8, a7, a8);
mat1(a1, a3, b1, b2); mat1(a5, a7, b3, b4);
mat1(a2, a4, b5, b6); mat1(a6, a8, b7, b8);
mat1(b1, b3, a1, a2); mat1(b5, b7, a3, a4);
mat1(b2, b4, a5, a6); mat1(b6, b8, a7, a8);
writeln('После раунда',i:2,a1:8,a2:4,a3:4,a4:4,a5:4,a6:4,a7:4,a8:4);
END;
a1:= a1 xor k[2*r+1,1]; a2:= a2 + k[2*r+1,2];
a3:= a3 + k[2*r+1,3]; a4:= a4 xor k[2*r+1,4];
a5:= a5 xor k[2*r+1,5]; a6:= a6 + k[2*r+1,6];
a7:= a7 + k[2*r+1,7]; a8:= a8 xor k[2*r+1,8];
writeln('КРИПТОГРАММА',a1:8,a2:4,a3:4,a4:4,a5:4,a6:4,a7:4,a8:4); writeln;
writeln('Напечатайте 0 чтобы продолжить и -1 чтобы завершить'); read(flag);
END
UNTIL flag < 0;
END.
2
1 answers
You still climb over the border of the array.
exptab[i] := (45 * exptab[i - 1]) mod 256;
Or
logtab, exptab: ARRAY[0..256] OF integer;
1
Author: Igor, 2019-12-01 22:05:14