凯撒密码Java解密

时间:2019-11-26 17:39:33

标签: java caesar-cipher

尝试解码加密的消息时遇到问题。它几乎可以解密所有内容,但是当我尝试解密“ 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();
}

输出:

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

预期输出:

Text: ABCDEFGHILMNOPQRSTU hello giordano WORLD HOW wxyZ XyZ XYZ YOU  xyz
Encrypted: DEFGHIJKLOPQRSTUVWX#khoor#jlrugdqr#ZRUOG#KRZ#`ab]#[b]#[\]#\RX##abc
Decrypted: ABCDEFGHILMNOPQRSTU hello giordano WORLD HOW wxyZ XyZ XYZ YOU  xyz

2 个答案:

答案 0 :(得分: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”,您尚未编写任何此类条件。因此,如果您从函数中删除上述代码,它将开始工作。但这不是凯撒密码,因此您可以通过“如何以循环顺序遍历”开始寻找。

答案 1 :(得分:0)

经过搜索和测试发现这是正确的解码方式。

private static String decrypt(String message) {
        StringBuilder temp = new StringBuilder();
       //key = 4
        for(int i=0; i<message.length(); i++) {
                char  c = (char)((message.charAt(i) - 4 - 97) %26 +97);
                if(c < 'a') {
                    c = (char) (message.charAt(i) - 4 - 'a' + 'z' + 1);
                }
            temp.append(c);
        }

        return temp.toString();
    }