0

私は、頻度分析を使用してテキストファイルを復号化するという任務を負っています。これは私の質問ではありませんが、私は絶対に次に何をすべきかわかりません。私がこれまでに持っているものは、ファイルからテキストを読み取り、各文字の頻度を数えます。頻度に応じて手紙を交換することに関して誰かが私を正しい方向に向けることができれば、それは大いにありがたいです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace freqanaly
{
    class Program
    {
        static void Main()
        {
            string text = File.ReadAllText("c:\\task_2.txt");
            char[,] message = new char[2,26];
            Console.Write(text); int count = 0;
            for (int x = 'A'; x <= 'Z'; x++)
            {
                message[0, count] = (char)x;
                Console.WriteLine(message[0, count]);
                count++;
            }

            foreach (char c in text)
            {  count = 0;
                for (int x = 'A'; x <= 'Z'; x++)
                {
                    if (c == x)
                    {
                        message[1, count]++;
                    }
                    count++;
                }
            }

            Console.ReadKey();
            for (int x = 0; x <= 25; x++)
            {
                Console.Write(message[0, x]); Console.Write(" = "); Console.WriteLine((int)message[1, x]);
            }
            Console.ReadKey();
        }
    }
}
4

2 に答える 2

2

これは暗号化されたデータであり、単純な換字式暗号を使用しているだけです(私は推測します)。エンコーディング/暗号化の定義を参照してください。 http://www.perlmonks.org/index.pl?node_id=66249

とにかく、Sergeyが提案したように、文字の頻度表を取得し、頻度を一致させます。ドキュメント内に「A」の8.167%が正確に存在するという保証はないため、ある程度の偏差を考慮する必要があります(おそらく、このドキュメントでは、「A」のパーセントは8.78または7.65%です)。また、「a」と「A」を区別するのではなく、Aが発生するたびに評価するようにしてください。これは、キャラクターの単純なToUpperまたはToLower変換で処理できます。ただ一貫している。

また、あまり一般的ではないが人気のある文字になり始めたら、それを処理する必要があります。C、F、G、W、およびMはすべて2%+/-マークの周りにあるため、文字が単語に収まるまで、つまりこの文字置換が行われるドキュメント内で、復号化されたテキストを操作する必要があります。も起こります。この概念は、数独行列の数値のフィッティングに似ています。幸いなことに、手紙がどこに行くべきかを見つけると、それは文書全体にカスケードされ、復号化されたプレーンテキストが出現するのを見ることができます。例として、「(F)it」と「(W)it」はどちらも有効な単語ですが、「F」に置き換えたときにドキュメントに「(F)hen」が表示されている場合は、次のように推測できます。代わりに、この文字を「W」に置き換える必要があります。(T)ここと(W)ここに別の例があり、単語()hen will' (W)henと(T)henはどちらも有効な単語であるため、tはそれ自体でガイダンスを提供します。ここで、どの単語が意味をなすかについて、文脈上の手がかりを組み込む必要があります。「では、攻撃を開始するのに良い時期ですか?」「攻撃を開始するのに適した時期はいつですか?」ほど意味がありません。

これはすべて、単一アルフェベティック置換を使用していることを前提としています。ポリアルフェベティック置換はより困難であり、この問題を回避する方法を見つけるために、ヴィジュネル暗号の例を解読することを検討する必要があるかもしれません。

S.Singhの「TheCodeBook」を読むことをお勧めします。これは非常に興味深い読み物であり、使用された歴史的な暗号とそれらがどのように解読されたかを簡単に理解できます。

http://www.google.com/products/catalog?q=the+code+book&rls=com.microsoft:en-us:IE-SearchBox&oe3%um=1&ie=UTF-8&tbm=shop&cid=5361323398438876518&sa=X&ei=hpR0T- HyObSK2QWvgvH-Dg&ved = 0CFoQ8wIwBQ#

于 2012-03-29T17:02:39.380 に答える
2

次に、公開されている英語の頻度リスト(たとえば、ウィキペディアから)をいくつか入手し、実際の頻度の表と比較して、文字の代わりを見つける必要があります。

于 2012-01-19T07:27:29.813 に答える