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

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

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

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java.util.ArrayList;
import java.util.List;
public class RusssianCesar {
    List<Character> alphabet = new ArrayList<Character>();
    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;
    }
}

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

1
2
3
4
5
6
7
8
9
10
11
    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);
        }
    }

  • Анико

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

    • http://cybern.ru/ lordrp

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

  • Раиль

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

    • http://cybern.ru/ lordrp

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

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

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

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

  • на Delphi

  • на Java

  • на C++