По заданию нужно реализовать шифр гаммирования по модулю 2. При данном способе шифрования символы текста и гаммы представляются в двоичном виде, а затем каждая пара двоичных разрядов складывается по модулю 2.
Даны только заглавные буквы русского алфавита. Двоичный код символов нужно брать по Windows 1251. Начинаем с буквы "А", то есть её десятеричное представление - это 192, а двоичное - 1100 0000 . Заканчиваем символом "Я", двоичное представление - 223, десятеричное - 1101 1111.
Пример шифрования:
Пример шифрования сообщения «ВОВА» с помощью ключа «ЮЛЯ». Так как длина ключа меньше длины открытого сообщения, то для генерации гаммы он циклически повторяется. Пример показан на картинке.
У меня же символы начинаются с 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();
}
}