xor над строками

291
07 октября 2017, 18:01

Я реализую шифр Вернама. Вот метод, который отвечает за процесс шифрования:

static string[] VernamCipher(char[] _message, char[] _key)
    {
        string[] message = GetBinaryArray(_message);
        string[] key = GetBinaryArray(_key);

       // return ...
    }

В качестве параметра передается строка, буквы которого записаны в массив char, и сам ключ, который тоже в виде массива char. Длинна ключа и сообщения совпадают.

Потом я создал метод GetBinaryArray:

static string[] GetBinaryArray(char[] array)
    {
        var ASCIIBytes = Encoding.ASCII.GetBytes(array);
        var BinaryArray = new string[array.Length];
        for (int i = 0; i < array.Length; i++)
        {
            BinaryArray[i] = (Convert.ToString(ASCIIBytes[i], 2)).PadLeft(8, '0');
        }
        return BinaryArray;
    }

Он берёт номер значения символа в массиве по таблице ASCII и преобразует его в двоичный код. Этот код записывается в строковый массив и возвращается методом.

Теперь, я хочу выполнить операцию XOR с элементами массивов message и key.Потом перевести каждый элемент массива в десятичный код ACSII и преобразовать его в соответствующий знак.
И в конце вернуть методом этих знаков массив. То бишь, сделать эдакую инверсию того, что мы делали в методе GetBinaryArray.

Я не имею даже представления, как это можно сделать, да и вообще, можно ли операцию XOR применять со строками.

Answer 1

Двоичные операции реализованы над байтами, не над строками. Поэтому я бы перевёл строку в массив байт (Encoding.GetBytes), про-xor-ил с ключом (который тоже должен быть набором байт, а не символов), и полученный массив байт был бы результатом.

Теперь, что у вас категорически неправильно. GetBinaryArray должен возвращать массив байт, а не каких-то строк. Convert.ToString не нужно.

Затем, Encoding.ASCII — катастрофически неправильно. Ваша строка имеет право содержать символы не только английского алфавита.

Итого:

Encoding.UTF8.GetBytes(message).Zip(key, (a, b) => (byte)(a ^ b)).ToArray()

при условии, что размера ключа хватает.

READ ALSO
DataGrid кастомная сортировка

DataGrid кастомная сортировка

Необходимо решение данного вопроса :

265
Как открыть в visual studio решение для UWP?

Как открыть в visual studio решение для UWP?

Когда я открываю решение для UWP в visual studia то у меня выскакивает такой вот диалог:

223
&ldquo;Съедание&rdquo; части элементов формы

“Съедание” части элементов формы

Пишу программу с интерфейсом, сделал что-то подобноеВид из редактора Студии:

182
Как работает объявление let в for

Как работает объявление let в for

Все знают что объявление:

163