我正在尝试使用移位密码来解码消息。我的某些角色翻译得很好,而其他角色则不能。我无法弄清楚问题是什么。
public class ShiftCipher {
public static void main(String[] args) {
System.out.println(cipher("F30MDAAFEMA1MI0EF0D9", 14));
}
static String cipher(String msg, int shift){
String characters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
String DecryptedMessege = "";
String DecryptedChar = "";
int trueShift;
boolean in = false; //Debugging
for(int x = 0; x < msg.length(); x++){
for (int y = 0; y < characters.length(); y++ ) {
if (msg.charAt(x) == characters.charAt(y)){
if (y+shift <= characters.length()){
trueShift = y + shift;
in = true; //Debugging
}
else {
trueShift = shift - (characters.length() - y);
in = false; //Debugging
}
DecryptedChar = new StringBuilder().append(characters.charAt(trueShift)).toString();
System.out.println(DecryptedChar + " " + in + " " + trueShift); //Debugging
}
}
DecryptedMessege = DecryptedMessege + DecryptedChar;
}
return DecryptedMessege;
}
}
一些早期的字母被错误地偏移-1。输出应为“ THE ROOTS OF WESTERN”,但应为“ TGD ROOTS OE WDSTDRN”。
有谁知道为什么这行不通?任何输入表示赞赏。
最佳答案
使用modulo %
(除以int除法):modulo 4将计数0、1、2、3、0、1、2、3,...
代替if-then-else,下面的代码更容易。
trueShift = (y + shift) % characters.length();
或者,如果y + shift可能为负(那么trueShift也将变为负),则更好:
int n = characters.length();
trueShift = (y + shift + n) % n;
在您的else部分中,
trueShift
不是对称的(内射的,不是双射的):crypto(scrypt)!= s。如果0,1,2,3映射到0,1,1,0,则存在问题。static String cipher(String msg, int shift){
String characters = "01234556789ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
int n = characters.length();
StringBuilder decryptedMessage = new StringBuilder();
for (int x = 0; x < msg.length(); x++) {
char ch = msg.charAt(x);
int y = characters.indexOf(ch);
if (y != -1) {
int trueShift = (y + shift + n) % n;
ch = characters.charAt(trueShift);
}
decryptedMessage.append(ch);
}
return decryptedMessage.toString();
}
关于java - Shift密码错误地移动了一些字符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49081138/