Caesar密码Java解密

问题描述 投票:0回答:1

我尝试解码加密的邮件时遇到问题。它几乎可以解密所有内容,但是当我尝试解密“ w x y z”(全部小写)时,它无法正常工作。仅在大写时解密这些字母。我做错了什么?

@SuppressWarnings("unused")
public static void main(String[] args) {

    String message = "ABCDEFGHILMNOPQRSTU hello giordano WORLD HOW wxyZ XyZ XYZ YOU  xyz";

    System.out.println(message);
    String encr = encrypt(message);
    String decr = decrypt(encr);

    System.out.println(encr + "\n" + decr);

}



@SuppressWarnings("unused")
private static String encrypt(String message) {
    StringBuilder temp = new StringBuilder();

    for(int i=0; i<message.length(); i++) {
        char c = (char)(message.charAt(i) + 3);

        if(c >= 'x') {
            c = (char)(message.charAt(i) - 23);
        } else {
            c = (char)(message.charAt(i) + 3);
        }

        temp.append(c);
    }

    return temp.toString();
}



private static String decrypt(String message) {
    StringBuilder temp = new StringBuilder();

    for(int i=0; i<message.length(); i++) {
            char c = (char)(message.charAt(i) - 3);

        // HELLO WORLD
        // KHOOR ZRUOG

        if(c > 'x') {
            c = (char)(message.charAt(i) + 26);
        } else {
            c = (char)(message.charAt(i) - 3);
        }

        temp.append(c);
    }

    return temp.toString();
}

输出:

ABCDEFGHILMNOPQRSTU hello giordano WORLD HOW wxyZ XyZ XYZ YOU  xyz
DEFGHIJKLOPQRSTUVWX#khoor#jlrugdqr#ZRUOG#KRZ#`ab]#[b]#[\]#\RX##abc
ABCDEFGHILMNOPQRSTU hello giordano WORLD HOW ]^_Z X_Z XYZ YOU  ^_`

期望的输出:

ABCDEFGHILMNOPQRSTU hello giordano WORLD HOW wxyZ XyZ XYZ YOU  xyz
DEFGHIJKLOPQRSTUVWX#khoor#jlrugdqr#ZRUOG#KRZ#`ab]#[b]#[\]#\RX##abc
ABCDEFGHILMNOPQRSTU hello giordano WORLD HOW wxyZ XyZ XYZ YOU  xyz
java caesar-cipher
1个回答
0
投票

您仅在小写情况下面临的问题是因为您已经以加密方式编写了此代码

        if(c >= 'x') {
            c = (char)(message.charAt(i) - 23);
        } else {
            c = (char)(message.charAt(i) + 3);
        }

和这个要解密的

        if(c > 'x') {
            c = (char)(message.charAt(i) + 26);
        } else {
            c = (char)(message.charAt(i) - 3);
        }

他们只处理小写的'x',而对于大写的'X',您没有写任何这样的条件。因此,如果您从函数中删除上述代码,它将开始工作。但这不是凯撒密码,因此您可以通过“如何以循环顺序遍历”开始寻找。

© www.soinside.com 2019 - 2024. All rights reserved.