Feistel Cipher в С#

63
8

Я пытаюсь реализовать шифр Feistel, у меня есть следующий код:

public static byte[] Encode(byte[] bytes) {
byte[] s = (byte[])bytes.Clone();
int half = s.Length / 2;
if (s.Length % 2 != 0)
throw new Exception("Unbalanced code");
byte[] left = new byte[half];
byte[] right = new byte[half];
Array.Copy(s, left, half);
Array.Copy(s, half, right, 0, half);

for (var k = 0; k < ROUNDS; k++) {
left = XOR(left,f(right));
var temp = left; left = right; right = temp;
}

byte[] toReturn = new byte[s.Length];
Array.Copy(left, 0, toReturn, half, half);
Array.Copy(right, 0, toReturn, 0, half);

return toReturn;
}

В этом примере ROUNDS равен 21, а f - функция, которая перестраивает байты в массиве байтов.

К сожалению, в то время как байты должны быть равны Encode (Encode (байты)), это не так. И я понятия не имею, что я делаю неправильно.

Любой совет?

Изменение: код для f()

public static byte[] f(byte[] s) {
byte[] toReturn = (byte[])s.Clone();
byte temp = s[0];
for (var k = 1; k < s.Length; k++) {
s[k-1] = s[k];
s[k - 1] = (byte)(s[k - 1] ^ 45);
}
s[s.Length - 1] = temp;
s[s.Length - 1] = (byte)(s[s.Length - 1] ^ 45);
return toReturn;
}

спросил(а) 2021-01-25T17:48:34+03:00 4 месяца, 4 недели назад
1
Решение
89

CodesInChaos является правильным, проблема в том, что переменная мутировалась.

ответил(а) 2021-01-25T17:48:34+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема