这是我到目前为止所拥有的
namespace CaesarDecrypter
{
class Reader
{
static void Main(string[] args)
{
//Display Welcome Message
Console.WriteLine("Welcome To The Caesar Cypher Decryption Program");
Console.WriteLine("***********************************************");
Console.WriteLine("Beggining Decryption:");
Console.WriteLine("\n\n Content:\n\n");
//Loop the program till given a command.
bool Loop = true;
while (Loop == true)
{
//Read in Text From File
String text = File.ReadAllText(@"C:\Users\Grimswolf\Desktop\Text Folder\caesarShiftEncodedText.txt");
//Display The File Text
foreach (char c in text)
{
//Not Sure What to do here?
Console.WriteLine(text);
Console.WriteLine("\n\n");
}
Console.WriteLine("Do you with to continue? Enter no to exit application.");
//Enter "no" to exit the loop
String Answer = Console.ReadLine();
if (Answer == "no")
{
// set loop bool to false so it exits the program.
Loop = false;
}
}
}
}
}
我需要它不断地通过字母表前进并找到一种方法来移动X位置以破解密码。例如,输出看起来像Decryption shift
0 exxego ex srgi
1 dwwdfn dw rqfh
2 cvvcem cv qpeg
3 buubdl bu podf
一次发动攻击等
答案 0 :(得分:1)
我会使用这段代码:
public string Decrypt(string cipherString, int shift)
{
var alphabet =
Enumerable
.Concat(
Enumerable.Range((int)'a', 26),
Enumerable.Range((int)'A', 26))
.Select(i => (char)i)
.ToArray();
var map =
alphabet
.Zip(
alphabet.Concat(alphabet).Concat(alphabet).Skip(alphabet.Length + shift),
(c0, c1) => new { c0, c1 })
.ToDictionary(x => x.c0, x => x.c1);
return String.Join("", cipherString.Select(x => map.ContainsKey(x) ? map[x] : x));
}
那么你可以运行这段代码:
for (var i = 0; i < 5; i++)
{
Console.WriteLine("{0} {1}", i, Decrypt("exxego ex srgi", -i));
}
你得到这个输出:
0 exxego ex srgi
1 dwwdfn dw rqfh
2 cvvcem cv qpeg
3 buubdl bu podf
4 attack at once
答案 1 :(得分:0)
要破解此密码,您需要统计每个字母的出现可能性,例如&#39; a&#39; 18%&#39; b&#39; 4%等(你可以在网上找到这样的清单)和一个大文本。你算上字母,得到他们的文字,然后匹配他们。(例如,根据我们的统计数据,你最有可能&#39;根据我们的统计数据。
否则通过所有可能的字母表强行执行,查看结果并自行决定(不是真的称为decyphering) 如果您知道至少有几个单词只返回字母表,则那些去除的单词与您的猜测相符