Шифрування XOR

Шифр 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;
}

Дивіться також: