需要解释凯撒密码中的代码

时间:2019-10-12 12:33:20

标签: java caesar-cipher

嘿,最近我受命创建一个应用程序,该应用程序读取消息并使用Java中的Caesar密码对消息进行加密。

直到出现添加数字密码会使您将字母a-z / A-Z转换为特殊符号并且我真的不知道该怎么做之前,我才真正遇到问题。

这是我的解决方案的代码:

private String caesarCipher(String message) {
    Scanner input = new Scanner(System.in);
    StringBuilder cipher = new StringBuilder();
    char ch;
    int key;

    System.out.print("Enter a key: ");
    key = Integer.parseInt(input.nextLine());

    for(int i = 0; i < message.length(); i++) {
        ch = message.charAt(i);
        if(ch >= 'a' && ch <= 'z'){
            ch = (char)(ch + key);

            if(ch > 'z'){
                ch = (char)(ch - 'z' + 'a' - 1);
            }

            cipher.append(ch);
        }
        else if(ch >= 'A' && ch <= 'Z'){
            ch = (char)(ch + key);

            if(ch > 'Z'){
                ch = (char)(ch - 'Z' + 'A' - 1);
            }

            cipher.append(ch);
        }
        else {
            cipher.append(ch);
        }
    }

    return cipher.toString();
}

有人可以向我解释以下陈述的过程和原因吗?

if(ch > 'z'){
    ch = (char)(ch - 'z' + 'a' - 1);
}

1 个答案:

答案 0 :(得分:0)

它将永远不允许加密的字符超出其假定范围,即a-z。 a和z的ascii分别为97和122,并且您只希望在此字符范围内进行Caesar密码加密。

这将检查ch的ASCII码是否大于z的ASCII

if(ch > 'z'){

如果是,它将计算:(ch的ascii)-(z的ascii)+(a的ascii)-1。

ch = (char)(ch - 'z' + 'a' - 1);

它被翻译成ch = (char)(ch - 122 + 97 - 1);

假设您要使用密钥a对字符3进行加密。该程序将花费97(a的ascii)+3。您将得到100,这是d的ascii。但是,如果要使用密钥z加密3怎么办?

与以前相同,将需要122(z的ascii)+ 3 =125。但是,在97-122(a-z)范围内找不到125。因此,您将得到一个不需要的字符(在这种情况下,}的ascii为125)。

因此,(ch - 'z' + 'a' - 1)将确保任何超过ascii 122的字符都将被转换回ascii范围仅在97和122之间的字符。在125的示例中,ch = (char)(125 - 122 + 97 - 1) => ch = (char)(99) => ch = c

相关问题