Есть ли способ для меня зашифровать и расшифровать сообщение с ключом в один метод в java? - PullRequest
0 голосов
/ 09 марта 2020

Я новичок в программировании и только 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» должен как зашифровать, так и расшифровать данный текст по заданному ключу. Вместо этого мне удалось только зашифровать заданный текст с заданным ключом, но я совершенно не представляю, как сделать обратное в этом же методе. Есть ли способ для меня, чтобы сделать это и какие изменения должны быть сделаны?

...