SHaight Ответов: 3

Как мне обратить это или


Я выделил строку следующим образом. Как мне отменить его и вернуть значение "с" обратно?
foreach (char c in tempStr)
{
  ...
  char newC =   Convert.ToChar(c ^ K1 ^ y2);  <=== ORing here
  tmp  += newC.ToString();
}


Что я уже пробовал:

Я понятия не имею, с чего начать.
char char1 = Convert.ToChar(c ^  K1);
char char2 = Convert.ToChar(charOne ^ y2);
char char3 = Convert.ToChar( K1 ^ y2);
char char4 = Convert.ToChar(c ^ y2);

3 Ответов

Рейтинг:
2

OriginalGriff

Оператор ^ - это не OR: это XOR, и есть очень большая разница.
И хотя вы можете "перевернуть" XOR между a и b довольно просто:

c = a ^ b;
a = c ^ b;
b = c ^ a;
Вы не можете сделать это с тремя значениями, если не знаете два других:
d = a ^ b ^ c;
a = d ^ b ^ c;
b = d ^ a ^ c;
c = d ^ a ^ b;
Оператор OR является | и он не может быть отменен, поскольку он отбрасывает информацию.


Рейтинг:
13

phil.o

Первый, ^ это не оператор OR, это оператор XOR.

Поскольку у вас есть исключающее ИЛИ объед c с K1 затем y2, вы просто должны xor результат снова с помощью K1 затем y2 чтобы вернуться к оригиналу c ценность.

char newC = c ^ K1 ^ y2;
char original = newC ^ K1 ^ y2; // original == c


Рейтинг:
0

Patrice T

Цитата:
Как мне обратить это или

Как уже говорилось в других решениях, оринг не может быть обращен вспять. К счастью, вы применили XOR, который можно обратить вспять.
Обращая исключающее ИЛИ осуществляется путем применения той же операции XOR с результатом первого. Это очень простая система шифрования.
Code = Text ^ Key;
Text = Code ^ Key;

Шифр гаммирования - Википедия[^]