ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode


Шифр Виженера


В данной статье рассмотрим шифр Виженера. Будет описан алгоритм и написана программа на языке C#, реализующая классический шифр Виженера и шифрование гаммированием.

Шифр Виженера. Описание алгоритма

Шифрование методом Виженера производится по формуле:

Шифрование методом Виженера

где ci – символ закодированного сообщения, pi – символ исходного сообщения, ki – символ ключа, N – мощность алфавита (количество символов в алфавите).

Символы ключа накладываются на шифруемое сообщение циклически. Например, пусть исходное сообщение: программирование на c#, а ключ = vscode, тогда на данное сообщение ключ наложиться следующим образом:

Шифр Виженера. Пример наложения ключа

Расшифровка методом Виженера производится по формуле:

Расшифровка сообщения методом Виженера

При шифровании гаммированием в качестве ключа используется последовательность символов сгенерированная с помощью генератора псевдослучайных чисел и по длине равная исходному сообщению. Псевдослучайные числа генерируются на основе заданного (всегда одинакового) начального параметра, поэтому последовательность во всех случаях получается идентичной.


Шифр Виженера. Реализация

Пусть алфавит задан в виде массива символов:

Тогда мощность алфавита будет равна:

Приведем реализацию метода на языке C#, шифрующего строку методом Виженера.

На вход поступает строка, которую нужно зашифровать (input) и ключ (keyword).

Теперь приведем реализацию метода, расшифровывающего строку.

Кроме того, для гаммирования понадобится генерирование псевдослучайного ключа. Вот метод, который делает это:

length — нужная длина ключа. startSeed — число, которым инициализируется генератор случайных чисел. Это число должно быть всегда одинаковым, таким образом и ключ будет всегда один и тот же.

Программа имеет следующий интерфейс:

Окно программы шифр Виженера

Код кнопки «Зашифровать» приведен ниже.

Происходит чтение данных из файла in.txt, выполняется шифрование (в зависимости от выбранного radioButton) и запись результата в файл out.txt.

Код кнопки «Расшифровать» приводится далее.

Демонстрация работы программы (шифрование и расшифровка данных методом Виженера) приведена на скриншоте ниже.

Демонстрация шифрования методом Виженера

Скачать исходник программы, рассмотренной в данной статье, можно, нажав на кнопку.

Скачать исходник

 

 

4.6/5 - (30 голосов)



Поделиться в соц. сетях:

10 комментария(ев) к статье “Шифр Виженера

  1. v40

    без кодировки вместо букв — нули

    //зашифровать
    private void buttonEncrypt_Click(object sender, EventArgs e)
    {
    if (radioButtonGamma.Checked)
    {
    string s;

    StreamReader sr = new StreamReader(«in.txt»,Encoding.GetEncoding(1251));
    StreamWriter sw = new StreamWriter («out.txt»);

    далее по тексту.

    1. admin Автор статьи

      Так происходит, когда входной файл «in.txt» создается в Блокноте. По умолчанию Блокнот записывает файл в кодировке ANSI, поэтому, при чтении файла, в StreamReader нужно её указать явно.
      Если создать входной файл в кодировке UTF-8 без BOM (например, с помощью программы Notepad++), то указывать ничего не потребуется.

  2. Marina

    Объясните пожалуйста как происходит действие шифрования. В строку ключа я ввожу слово, но ничего не происходит.

    1. admin Автор статьи

      Исходный текст для шифрования должен быть в текстовом файле. Результат также заносится в текстовый файл.

  3. Ann

    При шифровании с ключом алфавит в процессе шифрования сдвигается, как я понимаю, на 1 символ. А как сделать сдвиг на сколько я хочу?

    1. admin Автор статьи

      Не на один, а на число равное номеру символа в алфавите из ключа, накладываемого на шифруемый символ.

  4. Vesel0500

    а как можно сделать чтобы можно было выбирать файл для записи и считывания? т.е. вместо in и out выбрать свои файлы?

Добавить комментарий для Vesel0500 Отменить ответ

Ваш адрес email не будет опубликован.