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