使用 java 的 Cesar 密码解密
Cesar Cipher Decription using java
我正在尝试使用 Java 解密此 Cesar 密码,但似乎无法获得使用密钥正确解密代码的代码。我使用 for 循环遍历所有可能的密钥并打印出解密版本。解密后的文本应该只有大写字母。
/**
* Write a description of class Main here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Main
{
// instance variables - replace the example below with your own
private String message;
private int key;
private int c;
/**
* Constructor for objects of class Main
*/
public Main()
{
// initialise instance variables
// y is 76 ascii
message = "YMUMNINYMNNBYZYUMCVCFCNSIZNBYCLWIOHMYFNBCMCMNBYWBCYZNBCHAVYHINJYLNOLVYXMUCXNBYJUAUHGILUFCMNNBUNQUMDOMNWFULYMIQHIJCHCIHVONBYQUMJYLNOLVYXFYNHINSIOLBYULNVYNLIOVFYXHYCNBYLFYNCNVYUZLUCXMUCXNBYHUTULYHYWFULYWBCGYXCHWILXCUFFSVONBCMBYULNQUMNLIOVFYXUFFNBYMUGYBIQBYQIOFXBUPYFCEYXNIWIHZLIHNNBIMYNQIALYUNNBCHEYLMUHXYULHYMNFSUJJYUFNINBYGUMZYFFIQGUHNIZYFFIQGYHUHXUMENBYGNINYFFBCGNBYCLGYNBIXBCMGIIXNLUHMGONYXCNMYFZCHNIUXIAAYXCHXCZZYLYHWYNCFFUNFYHANBBYZUHWCYXBYQUMFIIECHAIHBCMIQHYRCMNYHWYQCNBNBYJUMMCPYCHNYLYMNIZUHIONMCXYLBYQUMYGVCNNYLYXVSNBYWIHPCWNCIHNBUNUFFNBCMXYMIFUNCIHBUXVYYHVLIOABNUVIONVSNBYUWWCXYHNIZBYLVYCHAUXOLVYLPCFFYQBYHBYZIOHXNBUNNYMMWUGYIZNBUNYRBUOMNYXUHWCYHNFCHYUHXQUMHINIZNBYHYQNLCVYMZLIGVYFIQUMBYBUXZIHXFSXLYUGYXQBSBUXBYHINMNICWUFFSUVUHXIHYXBYLCHZCXYFCNSNIBCMJLCHWCJFYMNBCMQUMQBUNBYBUXAINVSUJIMNUMSUHXBCMJOHCMBGYHNQUMXYMYLPYXNBYHBYVYWUGYQYUL";
for(int a = 0; a<27; a++)
{
key = a;
for(int i=0; i<message.length(); i++)
{
char ch;
c = message.charAt(i)-key%23;
ch =(char) (c);
System.out.print(ch);
}
System.out.println("");
}
System.out.println("");
}
}
如有任何帮助,我们将不胜感激。
c = message.charAt(i)-key%23;
应该是
c = (message.charAt(i) - 'A' - key + 26) % 26 + 'A';
因为:
message.charAt(i)
是一个介于 65 (A
) 和 90 (Z
)
之间的数字
message.charAt(i) - 'A'
是 0 到 25 之间的数字
key
应该是 0 到 25 之间的值
我们希望结果为正,所以- key + 26
是一个介于1和26之间的值
相加是1到51之间的一个值
(...) % 26
则为0到25之间的值
最后 ... + 'A'
是一个介于 65 (A
) 和 90 (Z
)
之间的值
基本上你必须尝试 26 个密钥,每次你离开大写字母的范围(<65)你添加 26。显然你正在寻找破译你的消息的密钥是 20。
String message = "YMUMNINYMNNBYZYUMCVCFCNSIZNBYCLWIOHMYFNBCMCMNBYWBCYZNBCHAVYHINJYLNOLVYXMUCXNBYJUAUHGILUFCMNNBUNQUMDOMNWFULYMIQHIJCHCIHVONBYQUMJYLNOLVYXFYNHINSIOLBYULNVYNLIOVFYXHYCNBYLFYNCNVYUZLUCXMUCXNBYHUTULYHYWFULYWBCGYXCHWILXCUFFSVONBCMBYULNQUMNLIOVFYXUFFNBYMUGYBIQBYQIOFXBUPYFCEYXNIWIHZLIHNNBIMYNQIALYUNNBCHEYLMUHXYULHYMNFSUJJYUFNINBYGUMZYFFIQGUHNIZYFFIQGYHUHXUMENBYGNINYFFBCGNBYCLGYNBIXBCMGIIXNLUHMGONYXCNMYFZCHNIUXIAAYXCHXCZZYLYHWYNCFFUNFYHANBBYZUHWCYXBYQUMFIIECHAIHBCMIQHYRCMNYHWYQCNBNBYJUMMCPYCHNYLYMNIZUHIONMCXYLBYQUMYGVCNNYLYXVSNBYWIHPCWNCIHNBUNUFFNBCMXYMIFUNCIHBUXVYYHVLIOABNUVIONVSNBYUWWCXYHNIZBYLVYCHAUXOLVYLPCFFYQBYHBYZIOHXNBUNNYMMWUGYIZNBUNYRBUOMNYXUHWCYHNFCHYUHXQUMHINIZNBYHYQNLCVYMZLIGVYFIQUMBYBUXZIHXFSXLYUGYXQBSBUXBYHINMNICWUFFSUVUHXIHYXBYLCHZCXYFCNSNIBCMJLCHWCJFYMNBCMQUMQBUNBYBUXAINVSUJIMNUMSUHXBCMJOHCMBGYHNQUMXYMYLPYXNBYHBYVYWUGYQYUL";
for(int a = -1; a<26; a++)
{
StringBuilder sb = new StringBuilder();
for(int i=0; i<message.length(); i++)
{
char ch = message.charAt(i);
int chAscii = (int) ch;
chAscii -= a;
if (chAscii < 65) {
chAscii = 26 + chAscii;
}
char newChar = (char) (chAscii);
sb.append(newChar);
}
System.out.println("For key = "+a+" the message is "+sb.toString());
}
}
我正在尝试使用 Java 解密此 Cesar 密码,但似乎无法获得使用密钥正确解密代码的代码。我使用 for 循环遍历所有可能的密钥并打印出解密版本。解密后的文本应该只有大写字母。
/**
* Write a description of class Main here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class Main
{
// instance variables - replace the example below with your own
private String message;
private int key;
private int c;
/**
* Constructor for objects of class Main
*/
public Main()
{
// initialise instance variables
// y is 76 ascii
message = "YMUMNINYMNNBYZYUMCVCFCNSIZNBYCLWIOHMYFNBCMCMNBYWBCYZNBCHAVYHINJYLNOLVYXMUCXNBYJUAUHGILUFCMNNBUNQUMDOMNWFULYMIQHIJCHCIHVONBYQUMJYLNOLVYXFYNHINSIOLBYULNVYNLIOVFYXHYCNBYLFYNCNVYUZLUCXMUCXNBYHUTULYHYWFULYWBCGYXCHWILXCUFFSVONBCMBYULNQUMNLIOVFYXUFFNBYMUGYBIQBYQIOFXBUPYFCEYXNIWIHZLIHNNBIMYNQIALYUNNBCHEYLMUHXYULHYMNFSUJJYUFNINBYGUMZYFFIQGUHNIZYFFIQGYHUHXUMENBYGNINYFFBCGNBYCLGYNBIXBCMGIIXNLUHMGONYXCNMYFZCHNIUXIAAYXCHXCZZYLYHWYNCFFUNFYHANBBYZUHWCYXBYQUMFIIECHAIHBCMIQHYRCMNYHWYQCNBNBYJUMMCPYCHNYLYMNIZUHIONMCXYLBYQUMYGVCNNYLYXVSNBYWIHPCWNCIHNBUNUFFNBCMXYMIFUNCIHBUXVYYHVLIOABNUVIONVSNBYUWWCXYHNIZBYLVYCHAUXOLVYLPCFFYQBYHBYZIOHXNBUNNYMMWUGYIZNBUNYRBUOMNYXUHWCYHNFCHYUHXQUMHINIZNBYHYQNLCVYMZLIGVYFIQUMBYBUXZIHXFSXLYUGYXQBSBUXBYHINMNICWUFFSUVUHXIHYXBYLCHZCXYFCNSNIBCMJLCHWCJFYMNBCMQUMQBUNBYBUXAINVSUJIMNUMSUHXBCMJOHCMBGYHNQUMXYMYLPYXNBYHBYVYWUGYQYUL";
for(int a = 0; a<27; a++)
{
key = a;
for(int i=0; i<message.length(); i++)
{
char ch;
c = message.charAt(i)-key%23;
ch =(char) (c);
System.out.print(ch);
}
System.out.println("");
}
System.out.println("");
}
}
如有任何帮助,我们将不胜感激。
c = message.charAt(i)-key%23;
应该是
c = (message.charAt(i) - 'A' - key + 26) % 26 + 'A';
因为:
message.charAt(i)
是一个介于 65 (A
) 和 90 (Z
) 之间的数字
message.charAt(i) - 'A'
是 0 到 25 之间的数字key
应该是 0 到 25 之间的值我们希望结果为正,所以
- key + 26
是一个介于1和26之间的值相加是1到51之间的一个值
(...) % 26
则为0到25之间的值最后
... + 'A'
是一个介于 65 (A
) 和 90 (Z
) 之间的值
基本上你必须尝试 26 个密钥,每次你离开大写字母的范围(<65)你添加 26。显然你正在寻找破译你的消息的密钥是 20。
String message = "YMUMNINYMNNBYZYUMCVCFCNSIZNBYCLWIOHMYFNBCMCMNBYWBCYZNBCHAVYHINJYLNOLVYXMUCXNBYJUAUHGILUFCMNNBUNQUMDOMNWFULYMIQHIJCHCIHVONBYQUMJYLNOLVYXFYNHINSIOLBYULNVYNLIOVFYXHYCNBYLFYNCNVYUZLUCXMUCXNBYHUTULYHYWFULYWBCGYXCHWILXCUFFSVONBCMBYULNQUMNLIOVFYXUFFNBYMUGYBIQBYQIOFXBUPYFCEYXNIWIHZLIHNNBIMYNQIALYUNNBCHEYLMUHXYULHYMNFSUJJYUFNINBYGUMZYFFIQGUHNIZYFFIQGYHUHXUMENBYGNINYFFBCGNBYCLGYNBIXBCMGIIXNLUHMGONYXCNMYFZCHNIUXIAAYXCHXCZZYLYHWYNCFFUNFYHANBBYZUHWCYXBYQUMFIIECHAIHBCMIQHYRCMNYHWYQCNBNBYJUMMCPYCHNYLYMNIZUHIONMCXYLBYQUMYGVCNNYLYXVSNBYWIHPCWNCIHNBUNUFFNBCMXYMIFUNCIHBUXVYYHVLIOABNUVIONVSNBYUWWCXYHNIZBYLVYCHAUXOLVYLPCFFYQBYHBYZIOHXNBUNNYMMWUGYIZNBUNYRBUOMNYXUHWCYHNFCHYUHXQUMHINIZNBYHYQNLCVYMZLIGVYFIQUMBYBUXZIHXFSXLYUGYXQBSBUXBYHINMNICWUFFSUVUHXIHYXBYLCHZCXYFCNSNIBCMJLCHWCJFYMNBCMQUMQBUNBYBUXAINVSUJIMNUMSUHXBCMJOHCMBGYHNQUMXYMYLPYXNBYHBYVYWUGYQYUL";
for(int a = -1; a<26; a++)
{
StringBuilder sb = new StringBuilder();
for(int i=0; i<message.length(); i++)
{
char ch = message.charAt(i);
int chAscii = (int) ch;
chAscii -= a;
if (chAscii < 65) {
chAscii = 26 + chAscii;
}
char newChar = (char) (chAscii);
sb.append(newChar);
}
System.out.println("For key = "+a+" the message is "+sb.toString());
}
}