1

平文が「一般的(しかし最近はあまり一般的ではない)」形式の暗号化されたファイルを受け取りました。〜80000
バイト暗号化テーブルが変更されたVigenere暗号として説明するもので暗号化されています。キーの1バイトとプレーンテキストの1バイトは、暗号文の1バイトにマップされます。キーストリングには一定の長さがあり、暗号化に使用されるキー文字はキーストリングを循環します。
キーには英数字のみが含まれます。

これまでのところ、暗号文で繰り返されるトリプルの開始位置の最小公約数を見つけることにより、キーの長さが30/60であると判断しました。ヴィジュネルのかなりの標準。

今、私は復号化されたバイトが何であるかを観察し、それらが許容範囲外にある場合の可能性を排除することによって、キーの可能な文字を推測してきました(32-126が表示されるため、16-31の間の値がないなど)
これ小さなキーがあり、平文はストレートASCIIであった最初の部分で機能しました。

より大きなファイルと「新しいファイル形式」で試してみると、すべての可能な文字が拒否されます。
これにより、ASCII、Ascii85、Base64、windows-1252、utf-7、QP、およびuuencodeがすべてASCII文字セットに依存するため、これらが排除されます。また、すべてのキーを拒否するEBCDICおよびISO8859-1のフィルターも作成しました。Utf-8も失敗しました。これは、すべてのバイトが0、10、110、1110、11110、111110、または1111110で始まるキーがないためです。

私が試したことがない残りの文字エンコードはUTF-16,32,1であり、フィルタリングの方法がわかりません。

私の質問は次のとおりです。

  • 私が忘れている他の文字エンコードはありますか?
  • フィルターをかけすぎて、バインドされていない文字の一部をスライドさせてしまう可能性はありますか?
  • ファイル形式は文字エンコード以外の意味でしょうか?もしそうなら、ASCII文字でフィルターが壊れている状態でそれを調整するにはどうすればよいですか?
  • ファイル形式が圧縮またはアーカイブを意味する場合はどうなりますか?

これが私が使用するフィルタリングコードです。フィルターは私がふるいにかけようとしているものに応じて変化します。

void guessCrypt(string fileName, int keyLength, int index)
{
    byte[] file = cast(byte[])read(fileName);
    foreach(key;ValidKeyChars)
    {
        bool work = true;
        for(int x = index; x < file.length-10; x+=keyLength)
        {
            byte single = file[x];
            int res = sdecrypt(single,key);
            if ((res < 32 && res > 15) || res > 126) //FILTER - this one ASCII
            {
                work = false;
                break;
            }
        }
        if (work == true)
        {
            writefln("\nwork: %s",key);
        }
    }

}
4

1 に答える 1

3

既存のエンコーディングを気にしないことをお勧めします。それを換字式暗号の別の層として扱い、文字の頻度に基づいて何が何にマッピングされるかを計算します。文字が実際に隣接している場合、それは分析に役立つだけです。そして、それらが実際に何にマップされているかがわかれば、そこから作業して、実際にどの文字が設定されているかを見つけることができます。

于 2011-09-22T00:49:36.393 に答える