Шифр XOR – это алгоритм шифрования данных с использованием исключительной дизъюнкции.

Описание алгоритма

Алгоритм XOR шифрования заключается в “наложении” последовательности случайных чисел на текст, который необходимо зашифровать. Последовательность случайных чисел называется гамма-последовательность, и используется для шифрований и расшифровки данных.

Формула для получения закодированного текста: Cn = Mn xor Kn.

Ключ шифрования можно получить двумя способами:

  • Повторять ключевое слово пока длина гаммы не будет равна длине сообщения;
  • Сгенерировать последовательность псевдослучайных чисел, равную по длине тексту сообщения.

Реализация XOR шифрования

using System;

public class XORCipher
{
    //генератор повторений пароля
    private string GetRepeatKey(string s, int n)
    {
        var r = s;
        while (r.Length < n)
        {
            r += r;
        }

        return r.Substring(0, n);
    }

    //метод шифрования/дешифровки
    private string Cipher(string text, string secretKey)
    {
        var currentKey = GetRepeatKey(secretKey, text.Length);
        var res = string.Empty;
        for (var i = 0; i < text.Length; i++)
        {
            res += ((char)(text[i] ^ currentKey[i])).ToString();
        }

        return res;
    }

    //шифрование текста
    public string Encrypt(string plainText, string password)
        => Cipher(plainText, password);

    //расшифровка текста
    public string Decrypt(string encryptedText, string password)
        => Cipher(encryptedText, password);
}

class Program
{
    static void Main(string[] args)
    {
        var x = new XORCipher();
        Console.Write("Введите текст сообщения: ");
        var message = Console.ReadLine();
        Console.Write("Введите пароль: ");
        var pass = Console.ReadLine();
        var encryptedMessageByPass = x.Encrypt(message, pass);
        Console.WriteLine("Зашифрованное сообщение {0}", encryptedMessageByPass);
        Console.WriteLine("Расшифрованное сообщение {0}", x.Decrypt(encryptedMessageByPass, pass));        
        Console.ReadLine();
    }
}

Результат работы программы:

Для большей криптостойкости, можно генерировать гамма-последовательность с использованием псевдослучайных чисел, используя целочисленный ключ, как параметр конструктора класса Random(это обеспечивает повторяемость последовательности случайных чисел):

private string GetRandomKey(int k, int len)
{
    var gamma = string.Empty;
    var rnd = new Random(k);
    for (var i = 0; i < len; i++)
    {
        gamma += ((char)rnd.Next(35, 126)).ToString();
    }

    return gamma;
}

Смотрите также: