1

平文と鍵を知らなくても暗号文を解読できるプログラムを作ろうとしています。

最も近い統計値と可能性のある候補キーのセットを提供する出力で可能性のあるプレーンテキストが必要です

周波数分析を開始し、完了しました。各アルファベットの発生を知るのに役立ちましたが、そこからキーを生成する方法がわかりません。

class Program
{
     static void Main()
     {
         // Array to store frequencies.
         int[] c = new int[(int)char.MaxValue];


         // Read entire text file.
            string s = File.ReadAllText("text.txt");


          // Iterate over each character.
          foreach (char t in s)
            {
            // Increment table.
            c[(int)t]++;
         }


          // Write all letters found.
         for (int i = 0; i < (int)char.MaxValue; i++)
         {
            if (c[i] > 0 &&
            char.IsLetterOrDigit((char)i))
            {
            Console.WriteLine("Letter: {0}  Frequency: {1}",
                (char)i,
                c[i]);
            }
         }
    }
}
4

2 に答える 2

2

Caesar 暗号は、プレーン テキストの各文字をアルファベットの一定数離れた文字に置き換えるだけです。大文字と小文字が区別されず、英語のテキストであると仮定すると、考えられる 26 のすべての復号化を生成し、正しいものを目で選択するだけで簡単になります。

置換暗号の場合、ソリューションを一般化する必要があります。簡単な方法は、あなたが提案したように頻度を数え、文字を頻度の降順にソートすることです。それらを文字にマッピングします (英語の場合も同様) ETAOINSRHOLUCMFYWGPBVKXQJZ (したがって、たとえば、最も頻繁に使用される文字は E を表し、次に頻繁に使用される文字は T などを表すと仮定します)。マッピングを使用して復号化を行います。暗号化テキストが多いほど、復号化が向上します。完全に正確というわけではありませんが、手動でギャップを埋めるのに十分な情報が得られます。

より洗練されたソリューションでは、並べ替え順序だけでなく頻度分布からマッピングを生成し、言語に関する既知の事実を使用する場合があります。たとえば、Q の後には通常 U が続きます。非常に凝った方法で、digraph と trigram の頻度を確認できます: http:/ /practicalcryptography.com/cryptanalysis/letter-frequencies-various-languages/english-letter-frequencies/

于 2015-10-04T00:54:18.587 に答える
0

単純な文字置換暗号の場合、英語で文字頻度のリストを取得し、それらをメッセージ内で最も頻繁に使用される文字にマッピングしようとします。ご了承ください。コンピューターが登場する前に、実際の軍隊はメッセージに無関係なテキストを挿入して、これを無視していました。当時、暗号学者が使用した戦略は、より長い繰り返し文字列を探すことでした。英語では、 andthenotforなどの 3 文字の単語を探しました。ドイツ語で、部隊が報告している本部の名前のような長い複合語を探したり、特定の場所と時間に送信された天気予報を推測しようとした.

于 2015-10-03T22:41:12.220 に答える