Есть хорошие новости. Вам не нужен массив hexCipher вообще. Просто сделай:
cipherString := '';
for I := 0 to High(cipher) do
cipherString := cipherString + IntToHex(cipher[I], 2);
Но в вашей программе много разовых ошибок. Посмотрите на KSA. Я переписал это немного:
function KSA(const key: AnsiString): myArray;
var
i, j, key_length, temp: integer;
begin
key_length := length(key);
j := 0;
for i := Low(S) to High(S) do
S[i] := i;
for i := Low(S) to High(S) do
begin
j := ((j + S[i] + ord(key[i mod key_length + 1])) mod 256);
temp := S[i];
S[i] := S[j];
S[j] := temp;
end;
KSA := S;
end;
Ключ - строка, основанная на единицах, поэтому вам нужно просто добавить единицу, чтобы проиндексировать ее. Нет необходимости в interJ
. Вся эта вещь 1 to 256
не имеет смысла. Вы хотите изменить массив S
, поэтому используйте Low()
и High()
(возможно, вы должны включить «mode delphi», чтобы использовать их, я не знаю). Используемый mod 256
гарантирует, что индекс j
остается в диапазоне 0..255
.
Кроме того, key[i mod key_length]
будет хорошо для строк, начинающихся с нуля, но это Паскаль, а не Python (ссылается на ваш предыдущий вопрос под другим именем ), поэтому вы должны просто добавить 1
в индекс для получения действительного AnsiString
индекса: key[i mod key_length + 1]
. Все остальное изменило бы логику оригинальной программы.
Пример: скажем, ваш ключ 'Secret'
, как в оригинальном примере Python. Тогда key_length
равно 6
, поэтому i mod key_length
находится в диапазоне 0..5
. Но ваша строка имеет индексы 1..6
, поэтому просто добавьте 1
для индексации строки.
И нет никаких веских причин использовать interJ := 3
где-либо. Это абсолютно бессмысленно.
В остальной части вашего кода есть другие похожие проблемы (одноразовые неверные индексы). Я думаю, вы можете решить их самостоятельно.