@EgaNator
Учусь на программиста

Как исправить ошибки в программе «Побитовое шифрование»?

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

Даны только заглавные буквы русского алфавита. Двоичный код символов нужно брать по Windows 1251. Начинаем с буквы "А", то есть её десятеричное представление - это 192, а двоичное - 1100 0000 . Заканчиваем символом "Я", двоичное представление - 223, десятеричное - 1101 1111.

Пример шифрования:
Пример шифрования сообщения «ВОВА» с помощью ключа «ЮЛЯ». Так как длина ключа меньше длины открытого сообщения, то для генерации гаммы он циклически повторяется. Пример показан на картинке.
61f1121b8eef7066674835.png

У меня же символы начинаются с 1. Не могу переделать, чтобы они начинались с 192. Также программа отказывается работать без пробела, пришлось его в конце добавить, но он лишний, не могу он него избавиться.
Ещё нужно вывести двоичное представление исходного текста, гаммы (ключа) и зашифрованного сообщения.
Также у меня не получается в этой программе сделать ввод с клавиатуры.

Подскажите, пожалуйста, как можно исправить в программе все эти моменты?

package com.company;

import java.util.Scanner;

public class Main {
    static String alfa = "АБВГДЕЖЗИКЛМНОПРСТУФХЦЧШЩЪЫьЭЮЯ ";

    public static void main(String[] args) {
        String ret;
        Scanner scanner = new Scanner(System.in);
        //String str = scanner.toString();
        String str = "ВОВА"; //sc.nextLine();
        //String key = scanner.toString();
        String key = "ЮЛЯ"; //sc.nextLine();
        //System.out.println("");
        System.out.print("Введите текст: ");
        System.out.println(str);
        System.out.print("Введите гамму (ключ): ");
        System.out.println(key);
        ret = cryptStr(str, key);
        System.out.print("Зашифрованный текст: ");
        System.out.println(ret);
        ret = cryptStr(ret, key);
        System.out.print("Расшифрованный текст: ");
        System.out.println(ret);
    }

    private static String cryptStr(String str, String key) {
        StringBuilder res = new StringBuilder();
        char[] codeKey = key.toCharArray(); // разложили ключ в байты
        for (int i = 0; i < codeKey.length; i++) codeKey[i] = (char) alfa.indexOf(codeKey[i]); // привели символы к номерам символов в alfa
        char[] codeStr = str.toCharArray(); // разложили строку в байты
        for (int i = 0; i < codeStr.length; i++) {
            codeStr[i] = (char) alfa.indexOf(codeStr[i]); // привели символ к номеру из alfa
            res.append(alfa.charAt(codeStr[i] ^ codeKey[i % codeKey.length])); // сохранили символ alfa с номером XOR кодов
        }
        return res.toString();
    }
}
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Akela_wolf
Extreme Programmer
Зачем вы извращаетесь со строкой alfa?
Откройте для себя метод String.getBytes() и вообще разберитесь что такое кодировка символов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы