шифратор и дешифратор шифра Виженера [требует правки]

319
02 мая 2018, 06:12

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

Answer 1

Люблю этим заниматься, по этому, так уж и быть, написал примерчик:

final class Vigenener {
    private final int bias,
            letters;
    public Vigenener(final int bias, final int letters) {
        this.bias = bias;
        this.letters = letters;
    }
    public String encrypt(final String text, final String key) {
        String encrypt = "";
        final int keyLen = key.length();
        for (int i = 0, len = text.length(); i < len; i++) {
            encrypt += (char) (((text.charAt(i) + key.charAt(i % keyLen) - 2 * this.bias) % this.letters) + this.bias);
        }
        return encrypt;
    }
    public String decrypt(final String cipher, final String key) {
        String decrypt = "";
        final int keyLen = key.length();
        for (int i = 0, len = cipher.length(); i < len; i++) {
            decrypt += (char) (((cipher.charAt(i) - key.charAt(i % keyLen) + this.letters) % this.letters) + this.bias);
        }
        return decrypt;
    }
}

А теперь разберемся, что происходит:
Все конечно же зависит от алфавита, которым будем использовать и какой текст будем шифровать - ключ которым будем шифровать также зависит от алфавита, за исключением некоторых (мы не можем использовать русские ключи, при шифре английского алфавита, но зато можем использовать английские ключи при шифровании русской строки).

Каждая первая буква алфавита, есть смещение.
Я приведу примеры только 2х-алфавитов русский и английский.

Русский:

final String key = "ру";
final Vigenener v = new Vigenener(1072, 33);
String enc = v.encrypt("русский", key);
System.out.println(enc); // ѐеагъыщ
String dec = v.decrypt(enc, key);
System.out.println(dec); // русский

В конструкторе класса Vigenener первым аргументом 1072 - это смещение по первому символу алфавита, вторым аргументом 33 передается количество букв алфавита.
Дальше следует метод шифрования encrypt - первым аргументом передается текст который будем шифровать, а вторым аргументом, передается ключ, которым будем шифровать - этот ключ понадобится для расшифровки ранее зашифрованного текста.

Английский:

final String key = "en";
Vigenener v = new Vigenener(97, 26);
final String enc = v.encrypt("english", key);
System.out.println(enc); // iakymfl
String dec = v.decrypt(enc, key);
System.out.println(dec); // english

Также все аналогично, что описано выше.

Как узнать нужное смещение, просто приведите первую букву алфавита к целочисленному типу в одинарных кавычках ' - так-как в Java двойные " кавычки = строка, а строку нельзя приводить к целочисленному типу, а символьный тип можно:

Английский (количество букв = 26):

System.out.println((int)'a'); // 97

Русский (количество букв = 33):

System.out.println((int)'а'); // 1072
READ ALSO
Преобразование произвольной картинки в трассу Box2d

Преобразование произвольной картинки в трассу Box2d

Идея: пользователь рисует произвольную черную линию на белом холсте bitmap, а после нажимает кнопку Start и происходит следующее - нарисованная...

209
Ошибка Unreachable statement в DialogFragment

Ошибка Unreachable statement в DialogFragment

Создаю фрагмент диалог, ввожу в onCreateView данные из View, но данные не принимаются, а подчёркиваются красным цветомВот код:

203
Как запустить Scene Builder напрямую из Eclipse?

Как запустить Scene Builder напрямую из Eclipse?

У меня проблема: не получается запуститьfxml-файл через "Open with SceneBuilder" в Eclipse, чтобы отобразить в Scene Builder

297