我将如何制作一个凯撒密码解密器?

时间:2015-11-28 08:36:50

标签: c# console-application

这是我到目前为止所拥有的

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

一次发动攻击

2 个答案:

答案 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) 如果您知道至少有几个单词只返回字母表,则那些去除的单词与您的猜测相符