Шифр Скитала – шифрование текста при помощи деревянного цилиндра и пергамента, также известен как шифр Древней Спарты. Этот метод шифрования использовался античными спартанцами и греками, для обмена сообщениями во время войны.
Описание алгоритма
Для шифрования текста используется цилиндр фиксированного диаметра, на который наматывается узкая полоска пергамента. Сообщение записывают вдоль цилиндра, а затем разматывают, в итоге получается зашифрованное сообщение, которое можно расшифровать применяя цилиндр того же диаметра. При этом диаметр цилиндра выступает в роле ключа шифрования.
Шифрование сообщения с ключем 4, можно представить в виде таблицы, где открытый текст записывается в строки, а разматывание полоски – это склейка всех столбцов в один:
Ш | И | Ф | Р | _ |
Д | Р | Е | В | Н |
Е | Й | _ | С | П |
А | Р | Т | Ы | _ |
Получается словосочетание “ШИФР ДРЕВНЕЙ СПАРТЫ” преобразуется в “ШДЕАИРЙРФЕ_ТРВСЫ_НП_”.
Реализация шифра Скитала
using System;
public class ScytaleCipher
{
public string Encrypt(string text, int d)
{
var k = text.Length % d;
if (k > 0)
{
//дополняем строку пробелами
text += new string(' ', d - k);
}
var column = text.Length / d;
var result = "";
for (int i = 0; i < column; i++)
{
for (int j = 0; j < d; j++)
{
result += text[i + column * j].ToString();
}
}
return result;
}
public string Decrypt(string text, int d)
{
var column = text.Length / d;
var symbols = new char[text.Length];
int index = 0;
for (int i = 0; i < column; i++)
{
for (int j = 0; j < d; j++)
{
symbols[i + column * j] = text[index];
index++;
}
}
return string.Join("", symbols);
}
}
class Program
{
static void Main(string[] args)
{
var scytale = new ScytaleCipher();
Console.Write("Введите текст сообщения: ");
var message = Console.ReadLine();
Console.Write("Введите диаметр цилиндра: ");
var diameter = Convert.ToInt32(Console.ReadLine());
var encText = scytale.Encrypt(message, diameter);
Console.WriteLine("Зашифрованный текст: {0}", encText);
Console.WriteLine("Расшифрованный текст: {0}", scytale.Decrypt(encText, diameter));
Console.ReadLine();
}
}
Результат работы программы: