Я новичок в программировании и только Python в прошлом. В настоящее время я работаю над университетским заданием, которое требует от меня применения Цезаря Шифра. Во-первых, мне дали интерфейс под названием «Шифр», и мне поручено написать класс под названием «RotationCipher», который реализует этот интерфейс.
Интерфейс:
public interface Cipher {
/**
* Encodes the given plain text into a secret cipher text
*
* @param plainText the plain text to encode
* @return the cipher text
*/
abstract public String encrypt(String plainText);
/**
* Determines the plain text string for a given cipher text.
*
* @param cipherText the cipher text to decode
* @return the plain text original
*/
abstract public String decrypt(String cipherText);
}
Класс RotationCipher, который реализует интерфейс:
abstract class RotationCipher implements Cipher {
protected int shift;
public RotationCipher(int key) {
shift = key;
}
protected String text;
protected abstract String rotate(int shift, String text);
public String encrypt(String plainText) {
String cipherText = rotate(shift, plainText);
return cipherText;
}
public String decrypt(String cipherText) {
shift = shift - 26;
String plainText = rotate(shift, cipherText);
return plainText;
}
}
Подкласс CaesarCipher, который происходит от класса RotationCipher (предназначенный как для шифрования, так и дешифрования сообщения с использованием ключа):
public class CaesarCipher extends RotationCipher{
public CaesarCipher(int key){
super (key);
}
public String rotate(int shift, String text) {
String cipherTxt = "";
String plainTxt = "";
if(shift>26) {
shift = shift%26;
}else if(shift < 0) {
shift = (shift%26) + 26;
}
int length = text.length();
for(int i = 0; i < length; i++) {
char ch = text.charAt(i);
if(Character.isLetter(ch)) {
if(Character.isLowerCase(ch)) {
char c = (char)(ch + shift);
if(c > 'z') {
cipherTxt = cipherTxt + (char)(ch - (26 - shift));
}else {
cipherTxt = cipherTxt + c;
}
}else if(Character.isUpperCase(ch)) {
char c = (char)(ch + shift);
if(c > 'Z') {
cipherTxt = cipherTxt + (char)(ch - (26 - shift));
}else if(ch == 'X') {
cipherTxt = cipherTxt + (char)(ch -(26 - shift));
}
else {
cipherTxt = cipherTxt + c;
}
}
}else if(Character.isLetter(ch) == false) {
cipherTxt = cipherTxt + ch;
}
}
return cipherTxt;
}
}
Он также упоминается мной моим лектор, что кодирование и декодирование - это, по сути, одна и та же операция, но с инвертированными ключами. Я полагаю, что метод «rotate» должен как зашифровать, так и расшифровать данный текст по заданному ключу. Вместо этого мне удалось только зашифровать заданный текст с заданным ключом, но я совершенно не представляю, как сделать обратное в этом же методе. Есть ли способ для меня, чтобы сделать это и какие изменения должны быть сделаны?