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