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

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

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

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

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

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

  • Alrik

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

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

  • a gde main.java? kak skompilirovat’ kod?

  • 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++