Шифр Виженера (Реализация на Java)

Java   8 Июнь 2012  Автор статьи:  

Для реализации шифра Виженера был создан класс Viziner, который имеет два метода: encrypt и decrypt, которые соответственно шифруют и дешифруют текст. Для реализации таблицы сдвигов будем использовать обычное смещение, таким образом нам не придется хранить и генерировать лишнюю матрицу. В зависимости от того какую букву «а» поместить в переменную smesh можно будет шифровать либо английский, либо текст на другом языке. Также необходимо изменить константу 26 на количество букв в алфавите этого языка.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Vizener {
    private int smesh = (int)'a';//смещение алфавита относительно таблицы юникодов
    public String encrypt(String text, String keyWord)
    {
        StringBuilder ans = new StringBuilder();
        for(int i = 0; i < text.length();i++)
        {
            int num = ((text.charAt(i) + keyWord.charAt(i % keyWord.length()) - 2 * smesh) % 26);
            //в num лежит номер буквы в алфавите
            char c = (char)(num + smesh);//получаем нужный символ
            ans.append(c);
        }
        return ans.toString();
    }
    public String decrypt(String shifr, String keyWord)
    {
        StringBuilder ans = new StringBuilder();
        for(int i = 0; i < shifr.length();i++)
        {
            int num = ((shifr.charAt(i)  - keyWord.charAt(i % keyWord.length()) + 26) % 26);
            //обратные преобразования с номером буквы в алфавите
            char c = (char)(num + smesh);
            ans.append(c);
        }
        return ans.toString();
    }
}

  • Illia

    сколько у вас ушло времени на разработку этой формулы?

    • http://cybern.ru/ lordrp

      Я думаю минуты 2, потому что когда я читал этот шифр в оригинале, то сразу понял, что это можно сделать без таблицы сдвигами.

  • Alrik

    Формула не верна

    • http://cybern.ru/ lordrp

      Как Вы это поняли? На каком тесте она не работает?

  • http://erigip.kz/ Kairat Batyrbayev

    a gde main.java? kak skompilirovat’ kod?

  • http://erigip.kz/ Kairat Batyrbayev

    a 4to sdelat’ 4toby probel ne videl?

  • Александр

    С заглавными буквами и не буквенными символами есть ошибка в дешифровке (в кодируемом слове, ключ работает любой), в остальном все работает. Хотя классический шифр не имеет такой возможности, но это интересно было бы реализовать. Например можно добавить условие: if (text.charAt(i)==’ ‘) в шифратор и дешифратор, тогда можно писать с пробелом.

  • Інна

    Зачем в єтой строке int num = ((text.charAt(i) + keyWord.charAt(i % keyWord.length()) — 2 * smesh) % 26);
    такой код — 2 * smesh. как он работает объясните пожалуйста.

  • Vitaliy Kalancha

    C цифрами не работает. Вот условие для обхода цифр:
    for(int i = 0; i = ‘0’ && text.charAt(i) <= '9')){
    num = ((text.charAt(i) + keyWord.charAt(i % keyWord.length()) — 2 * smesh) % 26);
    c = (char)(num + smesh);
    ans.append(c);
    }
    else {
    c=text.charAt(i);
    ans.append(c);}
    }

Научиться программировать

  • на Delphi

  • на Java

  • на C++