Шифр Скитала – це шифрування тексту за допомогою дерев’яного циліндру та пергаменту, також відомий як шифр Давньої Спарти. Цей метод шифрування використовувався античними спартанцями та греками, для обміну повідомленнями під час війни.
Опис алгоритму
Для шифрування тексту використовується циліндр фіксованого діаметру, на який намотується вузька полоска пергаменту. Повідомлення записують вздовж циліндру, а потім розмотують, після чого отримуємо зашифроване повідомлення, яке можна розшифрувати використавши циліндр такого ж діаметру. При цьому діаметр циліндра виступає в якості ключа шифрування.
Шифрування повідомлення з ключем 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();
}
}
Результат роботи програми: