0

因此,我有一个为 Java 作业编写的“Caesar Cipher”,但我缺少 2 个必需的组件,到目前为止我对 Java 的了解有限,我无法弄清楚这些组件。

我需要通过将输出的字符串分成 4 个字符的块来进一步加密我的输出。即 AFSD GRTH WRGD

我尝试从标准库中查找 java 方法,但我还没有学习正则表达式,而且我不能使用番石榴,因为我是通过电子邮件提交的。这也没有在课堂上讲过。

我还需要包含一个 bruteForce 方法来加密我的纯文本,但为每个可能的密钥 (0-25) 输出密文。我尝试使用 while 循环将 shiftKey 设置为 0,并在循环结束时将键增加 1,但这会输出一个疯狂的混乱。

public String bruteForce(String plainText) {
    plainText = plainText.replaceAll("[^A-Za-z0-9]", "");
    String cipherText = "";
    int shiftKey = 0;
    while (shiftKey <= 26) {
        for (int i = 0; i < plainText.length(); i++) {
            int charPosition = alphabet.indexOf(plainText.charAt(i));
            int keyVal = (shiftKey + charPosition) % 26;
            char replaceVal = this.alphabet.charAt(keyVal);
            cipherText += replaceVal;
            shiftKey++;
        }

    }
    return cipherText.toUpperCase();
}

这是我到目前为止的代码

class CaesarCipher {
private final String alphabet = "abcdefghijklmnopqrstuvwxyz";
private final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public String bruteForce(String plainText, int shiftKey) {
    plainText = plainText.replaceAll("[^A-Za-z0-9]", "");
    String cipherText = "";
    for (int i = 0; i < plainText.length(); i++) {
        int charPosition = alphabet.indexOf(plainText.charAt(i));
        int keyVal = (shiftKey + charPosition) % 26;
        char replaceVal = this.alphabet.charAt(keyVal);
        cipherText += replaceVal;
    }
    return cipherText.toUpperCase();
}

public String encrypt(String plainText, int shiftKey) {
    plainText = plainText.replaceAll("[^A-Za-z0-9]", "");
    String cipherText = "";
    for (int i = 0; i < plainText.length(); i++) {
        int charPosition = alphabet.indexOf(plainText.charAt(i));
        int keyVal = (shiftKey + charPosition) % 26;
        char replaceVal = this.alphabet.charAt(keyVal);
        cipherText += replaceVal;
    }
    return cipherText.toUpperCase();

}

public String decrypt(String cipherText, int shiftKey) {
    String plainText = "";
    for (int i = 0; i < cipherText.length(); i++) {
        int charPosition = this.ALPHABET.indexOf(cipherText.charAt(i));
        int keyVal = (charPosition - shiftKey) % 26;
        if (keyVal < 0) {
            keyVal = this.ALPHABET.length() + keyVal;
        }
        char replaceVal = this.ALPHABET.charAt(keyVal);
        plainText += replaceVal;
    }
    return plainText.toUpperCase();
}

public static void main(String args[]) {
    String plainText = "this; is s'ome te.xt with punct";
    int shiftKey = 4;

    CaesarCipher cc = new CaesarCipher();

    String cipherText = cc.encrypt(plainText, shiftKey);
    System.out.println("Plain  Text :" + plainText);
    System.out.println("Cipher Text :" + cipherText);
    String PlainText = cc.decrypt(cipherText, shiftKey);
    System.out.println("Plain Text  :" + PlainText);
}
}
4

1 回答 1

1

四块

这是我能够想出的将字符串分成四个块的方法:

public  String[] splitIntoFour(String input){
    int chunkNum = 1+(input.length() / 4);
    String[] chunks = new String[chunkNum];
    for(int i = 0; i < chunkNum; i++){
        int startIndex = i*4;
        int endIndex = (i+1)*4;
        if(i == (chunkNum - 1))
            endIndex = input.length();
        chunks[i] = input.substring(startIndex, endIndex);
    }
    return chunks;
}

此方法获取您的字符串,将其长度除以四并加一,以防它不能被四整除。它创建了一个字符串数组,其中每个元素将是一个由四个字母组成的块。然后,对于每个块,你取输入的一个子字符串,开始索引被计算为四的倍数,结束索引也是如此。除非循环在它的最后一次迭代中,在这种情况下,结束索引被计算为输入的长度。这样做是为了解释不能被四整除的任何输入。

蛮力法

至于您的蛮力方法,您可能还想将输出作为数组提供,考虑到您的输出是 26 个不同的字符串,那么只需运行一个循环,使用您的其他加密方法使用每个密钥对输入进行加密,考虑到你正确地实现了。

public String[] bruteForce(String plainText) {
    String[] cipherText = new String[26];
    for(int i = 0; i < cipherText.length; i++)
        cipherText[i] = encrypt(plainText, i);
    return cipherText;
}

顺便说一句,蛮力解密实际上同样简单,只需encrypt(String)将循环内的方法更改为您的decrypt(String)方法:

public String[] bruteForceDecrypt(String cipherText) {
    String[] plainText = new String[26];
    for(int i = 0; i < plainText.length; i++)
       plainText[i] = decrypt(cipherText, i);
    return plainText;
}

打印数组

这是两个示例,使用蛮力方法,它们都将打印出 26 个不同的字符串:

public static void main(String[] args){
    CaesarCipher cipher = new CeasarCipher();
    //This variable contains 26 strings, returned from the bruteForce() method
    String[] cipherText = cc.BruteForce("This is an example text");
    //For each string in cipherText, print it out
    for(String string : cipherText)
        System.out.println(string);
}

public static void main(String[] args){
    CaesarCipher cipher = new CeasarCipher();
    //This variable contains 26 strings, returned from the bruteForce() method
    String[] cipherText = cc.BruteForce("This is an example text");
    //Access each string in cipherText through it's index
    for(int i = 0; i < cipherText.length; i++)
        System.out.println(cipherText[i]);
}

我希望这有帮助。

于 2013-10-13T04:00:40.463 回答