tehadm
Администратор
- Сообщения
- 1 160
- Реакции
- 293
Шифр Виженера (фр. Chiffre de Vigenère) — метод полиалфавитного шифрования буквенного текста с использованием ключевого слова.
Этот метод является простой формой многоалфавитной замены. Шифр Виженера изобретался многократно. Впервые этот метод описал Джовани Баттиста Белласо (итал. Giovan Battista Bellaso) в книге La cifra del. Sig. Giovan Battista Bellasо в 1553 году, однако в XIX веке получил имя Блеза Виженера, французского дипломата. Метод прост для понимания и реализации, он является недоступным для простых методов криптоанализа.
Хотя шифр легко понять и реализовать, на протяжении трех столетий он противостоял всем попыткам его сломать; чем и заработал название le chiffre indéchiffrable (с французского 'неразгаданный шифр'). Многие люди пытались реализовать схемы шифрования, которые по сути являлись шифрами Виженера.

Квадрат Виженера, или таблица Виженера, также известная как tabula recta, может быть использована для шифрования и расшифровывания.
Этот метод является простой формой многоалфавитной замены. Шифр Виженера изобретался многократно. Впервые этот метод описал Джовани Баттиста Белласо (итал. Giovan Battista Bellaso) в книге La cifra del. Sig. Giovan Battista Bellasо в 1553 году, однако в XIX веке получил имя Блеза Виженера, французского дипломата. Метод прост для понимания и реализации, он является недоступным для простых методов криптоанализа.
Хотя шифр легко понять и реализовать, на протяжении трех столетий он противостоял всем попыткам его сломать; чем и заработал название le chiffre indéchiffrable (с французского 'неразгаданный шифр'). Многие люди пытались реализовать схемы шифрования, которые по сути являлись шифрами Виженера.

Квадрат Виженера, или таблица Виженера, также известная как tabula recta, может быть использована для шифрования и расшифровывания.
C#:
using System;
public class VigenereCipher
{
const string defaultAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
readonly string letters;
public VigenereCipher(string alphabet = null)
{
letters = string.IsNullOrEmpty(alphabet) ? defaultAlphabet : alphabet;
}
//генерация повторяющегося пароля
private string GetRepeatKey(string s, int n)
{
var p = s;
while (p.Length < n)
{
p += p;
}
return p.Substring(0, n);
}
private string Vigenere(string text, string password, bool encrypting = true)
{
var gamma = GetRepeatKey(password, text.Length);
var retValue = "";
var q = letters.Length;
for (int i = 0; i < text.Length; i++)
{
var letterIndex = letters.IndexOf(text[i]);
var codeIndex = letters.IndexOf(gamma[i]);
if (letterIndex < 0)
{
//если буква не найдена, добавляем её в исходном виде
retValue += text[i].ToString();
}
else
{
retValue += letters[(q + letterIndex + ((encrypting ? 1 : -1) * codeIndex)) % q].ToString();
}
}
return retValue;
}
//шифрование текста
public string Encrypt(string plainMessage, string password)
=> Vigenere(plainMessage, password);
//дешифрование текста
public string Decrypt(string encryptedMessage, string password)
=> Vigenere(encryptedMessage, password, false);
}
class Program
{
static void Main(string[] args)
{
//передаем в конструктор класса буквы русского алфавита
var cipher = new VigenereCipher("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ");
Console.Write("Введите текст: ");
var inputText = Console.ReadLine().ToUpper();
Console.Write("Введите ключ: ");
var password = Console.ReadLine().ToUpper();
var encryptedText = cipher.Encrypt(inputText, password);
Console.WriteLine("Зашифрованное сообщение: {0}", encryptedText);
Console.WriteLine("Расшифрованное сообщение: {0}", cipher.Decrypt(encryptedText, password));
Console.ReadLine();
}
}
programm.top
Последнее редактирование: