java - 用其他字符替换字符

标签 java encryption caesar-cipher

我想要破译某个文本。当我遇到字符串中的一个字母时,我想用字母表中的下一个字母替换它。然后在下一轮中我想用下一个字母替换。

a -> b

k -> l

然后在第二轮它应该尝试

a -> c

k -> 米

字符的问题在于它包含各种奇怪的字符,当你遇到 z 并尝试替换它时,它会被一个奇怪的符号替换。

谁能帮我从A到Z制作某种循环列表?在下面的代码片段中,我创建了一个包含 a 到 z 的列表。在循环中选择一个字符,搜索并“调整”它的索引,并且应该检索新字符。但这不起作用。 (列表不循环的原因之一)

public static void decipher(){
    String cyphertext = "aVaqrprzoreoeratraWhyvhfraJnygreUbyynaqreqrgjrroebrefinaRqvguZnetbganneNzfgreqnzNaarjvytenntzrrxbzraznnezbrgabtrrarragvwqwrovwbznoyvwiraBznmnyurgzbrvyvwxuroorabzNaarabtrracnnejrxraqnnegrubhqrafpuevwsgRqvguSenaxvarraoevrsnnaTregehqAnhznaauhaiebrtrerohhezrvfwrvaSenaxshegnzZnva";
    char[] plaintext = new char[cyphertext.length()];

    List<Character> a2z = new ArrayList<Character>(26);
    for (char c = 'A'; c <= 'Z'; c++){
        a2z.add(Character.valueOf(c));
    }

    for(int i = 1; i < 26; i++){
        for(int j = 0; j < cyphertext.length(); j++){
            char currentChar = cyphertext.charAt(j);
            int newCharIndex = a2z.indexOf(currentChar)+i;
            plaintext[j] = a2z.get(newCharIndex);
        }
    }
}

最佳答案

您不需要循环列表来处理边缘情况。此外,您应该记住,字符 A-Z 的 ascii 值介于 65-90 之间,a-z 介于 97-122 之间。您可以创建两个循环列表,但不需要它们,因为边缘情况很容易处理:

public static void main(String[] args) {
    String cyphertext = "aVaqrprzoreoeratraWhyvhfraJnygreUbyynaqreqrgjrroebrefinaRqvguZnetbganneNzfgreqnzNaarjvytenntzrrxbzraznnezbrgabtrrarragvwqwrovwbznoyvwiraBznmnyurgzbrvyvwxuroorabzNaarabtrracnnejrxraqnnegrubhqrafpuevwsgRqvguSenaxvarraoevrsnnaTregehqAnhznaauhaiebrtrerohhezrvfwrvaSenaxshegnzZnva";
    char[] plaintext = new char[cyphertext.length()];

    // first shift
    shiftLetters(cyphertext, plaintext, 1);
    // update cyphertext with the intermediate result
    cyphertext = new String(plaintext);
    // second shift
    shiftLetters(cyphertext, plaintext, 2);
    // print result
    System.out.println(new String(plaintext));

}

private static void shiftLetters(String cyphertext, char[] plaintext, int shifts) {
    for (int i=0; i<cyphertext.length(); i++){
        int tmp = cyphertext.charAt(i) + shifts;
        tmp = handleEdgeCases(tmp);
        plaintext[i] = (char)(tmp);
    }
}

// here we handle the "circular" cases
private static int handleEdgeCases(int tmp) {
    if (tmp > 90 && tmp < 97) {
        tmp = tmp - 90 + 65;
    } else if (tmp > 122) {
        tmp = tmp - 122 + 97;
    }
    return tmp;
}

关于java - 用其他字符替换字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32674154/

相关文章:

c - 我用 c 编写了这个凯撒密码程序,但每次运行它都会崩溃

java - JavaFX PieChart 的问题

java - JDBC 模板运行缓慢

php - Web 服务器即时解密?

Java 密码设置特定随机数不起作用

python - 凯撒密码中单个字符不匹配 : Python

java - 使用 bash 脚本设置 java ProcessBuilder 环境

java - 带有 Play Framework 2.6 (Java) 的 Swagger 2.0 (Open Api 3.0)

.net - 如何加密字符串并获得等长的加密字符串?

java - 有错误的密码凯撒java程序