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

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

Ниже приведены классы, которые реализуют алгоритм цезаря для русского и английского алфавита. Конструктор класса добавляет в List буквы выбранного алфавита. Метод encrypt шифрует сообщение, а метод decrypt дешифрует. Для того, чтобы алгоритм работал корректно необходимо передать такое m, чтобы оно было взаимно простым с количеством букв в алфавите.
Для русских букв:

import java.util.ArrayList;
import java.util.List;
public class RusssianCesar {
List alphabet = new ArrayList();
private final static char[] PUNCTUATION = {'.', ',', ';', ':', '!', '?', '-'};
RusssianCesar() {
for (char c = 'а'; c <= 'я'; c++) { alphabet.add(c); } for (char c = '0'; c <= '9'; c++) { alphabet.add(c); } for (char c : PUNCTUATION) { alphabet.add(c); } } String encrypt(String text, int m, int k) { int n = alphabet.size(); m = m % n; k = k % n; if (gcd(n, m) != 1) {//проверка простоты n относительно m return null; } StringBuilder cryptogram = new StringBuilder(); //блок шифрования данных for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); int index = alphabet.indexOf(c); index = (index * m + k) % n; cryptogram.append(alphabet.get(index)); } return cryptogram.toString(); } public String decrypt(String text, int m, int k){ int n = alphabet.size(); m = m % n; k = k % n; int reversedM = -1;//обратное к m //ищем обратное к m for (int i = 0; i < n; i++) { if ((i * m) % n == 1) { reversedM = i; break; } } StringBuilder newText = new StringBuilder(); //блок дешифрования данных for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); int index = alphabet.indexOf(c); index = (((index - k) * reversedM) % n + n) % n; newText.append(alphabet.get(index)); } return newText.toString(); } //алгоритм поиска наибольшего общего делителя private static int gcd(int a, int b) { while (a > 0 && b > 0) {
if (a > b) {
a %= b;
} else {
b %= a;
}
}
return a + b;
}
}


Для английского языка достаточно изменить конструктор:

EnglishCesar() {
for (char c = 'a'; c <= 'z'; c++) { alphabet.add(c); } for (char c = '0'; c <= '9'; c++) { alphabet.add(c); } for (char c : PUNCTUATION) { alphabet.add(c); } }

  • Анико

    А можно пример работы программы?

    • Это класс который имеет два метода, зашифровать и расшифровать. Требуется всего лишь создать класс в котором будет метод main и в нем вызвать необходимые методы.

  • Раиль

    Не пишите название класса с маленькой буквы, пожалуйста. В джаве так не делают. Спасибо!

    • Исправили. Спасибо за комментарий.

  • Иван Шалимов

    Немого понять для чего ввели m , кто-нибудь может объяснить? Википедию и гугл уже посмотрел.

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

  • на Delphi

  • на Java

  • на C++