有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将输出拆分为4个字符的块和一个bruteForce方法

因此,我有一个为java任务编写的“Caesar密码”,但我缺少了两个必需的组件,这两个组件是我目前掌握的有限java知识所无法理解的

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

我试着从标准库中查找java方法,但我还没有学习regex,而且我不能使用guava,因为我通过电子邮件提交了这篇文章。 这门课也还没有讲过

我还需要包括一个bruteForce方法,该方法加密我的明文,但为每个可能的密钥(0-25)输出密文。 我尝试过使用while循环,它将shiftKey设置为0,并在循环结束时将key增加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);
}
}

共 (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]);
    }
    

    我希望这有帮助