Я думаю, что вы допустили немало ошибок: rc4 - это симметричный c шифр, поэтому ваша функция rc4 должна принимать сообщение и ключ (не длину ключа) и возвращать поток байтов.
Полагаю, вы пытались перевести эту функцию с языка с нулевым индексом нижнего уровня на R. Например, вы создали вектор состояния s
(который в rc4 должен начинаться с 0 до 255) должно быть просто s <- 0:255
, а не написано с помощью al oop.
. Ранее я уже писал реализацию rc4 на C ++, поэтому я перевел ее здесь на R для вас.
Эта функция вернет необработанный вектор, если в результате есть не-Ascii элементы, и символьная строка в противном случае, поэтому большинство времени, когда ваше зашифрованное сообщение будет в необработанном формате, а незашифрованное сообщение будет символьной строкой , Было бы достаточно легко изменить его так, чтобы он принимал и возвращал только необработанные векторы.
rc4 <- function(message, key)
{
if(is.raw(message)) message <- as.integer(message)
if(is.character(message)) message <- utf8ToInt(message)
key <- utf8ToInt(key)
key_length <- length(key)
message_length <- length(message)
s <- 0:255
a <- b <- x <- y <- 0
if(key_length == 0) stop("No key given")
if(message_length == 0) return("")
for (i in seq_along(s))
{
b <- (key[a + 1] + s[i] + b) %% 256
tmp <- s[i]
s[i] <- s[b + 1]
s[b + 1] <- tmp
a <- (a + 1) %% key_length;
}
for (k in seq(message_length))
{
x1 <- x <- (x + 1) %% 256
y1 <- y <- (s[x + 1] + y) %% 256
tmp <- s[x1]
s[x1] <- s[y1]
tmp <- s[y1]
message[k] = bitwXor(message[k], s[(s[x1 + 1] + s[y1 + 1]) %% 256]);
}
if(any(message < 9 | message > 127)) return(as.raw(message))
return(intToUtf8(message))
}
Итак, давайте посмотрим, работает ли он:
encrypted_message <- rc4("hello", "world")
encrypted_message
#> [1] b7 31 74 99 98
Он должен быть обратимым с тем же ключом :
rc4(encrypted_message, "world")
#> [1] "hello"