凯撒密码Java解密



我在尝试解码加密邮件时遇到问题。它几乎可以按原样解密所有内容,但是当我尝试解密"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

您仅在小情况下面临的问题是因为您在加密中编写了此代码

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",你没有写任何这样的条件。因此,如果您从函数中删除上述代码,它将开始工作。但这不会是凯撒密码,就此而言,您可以通过"如何以循环顺序遍历"开始查找。

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

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

最新更新