1

私は、Vigenere暗号でエンコードされたメッセージの暗号化をエンコード、デコード、および解読するプログラムを開発しようとしています。私が行き詰まっているのは、(キーなしで)メッセージを[暗号化]して破ることです。私はそれをどのように行うかについての考えを持っていますが、それをコーディングする方法がわかりません。私の考えは次のとおりです。

プログラムは、1から26で終わる長さの潜在的なキーを体系的に生成します。キーには英語のアルファベットの文字が含まれ、大文字と小文字は区別されません。キーの長さ(1〜26のどこか)ごとに、キーは文字「a」で埋められ、プログラムはそれらのキーが正しいかどうかを確認します(別の方法があります)。キーが正しくない場合、最後の位置にある文字がアルファベットの次の文字に回転します。最後の文字が26の可能な位置すべてを通過すると、最後から2番目の文字が回転し、次に最後の文字と最後から2番目の文字がそれに応じて回転します。 [潜在的な]キーの文字)。新しいキーが生成されるたびに、[potential]キーは別のメソッドでチェックされており、正しいキーが見つかるとメソッドは停止します。キー作成の進行は次のようになります。

[starting with keys that are only 1 letter long]
a
b
c
...
x
y
z

[now the potential key length becomes two]
aa
ab
ac
ad
...
zw
zx
zy
zz

[eventually the potential key length becomes 26]
aaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaab
aaaaaaaaaaaaaaaaaaaaaaaaac
aaaaaaaaaaaaaaaaaaaaaaaaad
...
zzzzzzzzzzzzzzzzzzzzzzzzzw
zzzzzzzzzzzzzzzzzzzzzzzzzx
zzzzzzzzzzzzzzzzzzzzzzzzzy
zzzzzzzzzzzzzzzzzzzzzzzzzz

(うまくいけば、そこにパターンを見ることができます)

誰かがこれを行う方法のコードを持っているか知っているか、これをコーディングするために必要な手順をガイドが満たすのを手伝ってくれるなら、それは大いにありがたいです。

ありがとう!

4

1 に答える 1

1

編集(今私は数学をしました)

反復する必要のある可能な組み合わせは約6*10^36あります-最大long値は約9*10^18-はるかに小さい数です。

そうは言っても、1秒あたり1兆(10 ^ 12)の組み合わせを生成して比較できる(平均的な開発者のマシンよりもはるかに高速な)組み合わせを反復処理する最適化された方法を見つけ、100万台のマシン間で並列化できるとしましょう。 -つまり、年間(60 * 60 * 24 * 365 * 10 ^ 12)* 10 ^ 6、または年間約3 * 10^25の組み合わせがチェックされます。

その驚異的なスピードでは、すべての組み合わせを検討するのにまだ約1,900億年かかるでしょう。

すべてのキーを試すのではなく、目標を達成するための別の方法を調査することを強くお勧めします。

さて(私の元の答えに戻って)、反復したい適度なサイズのキーのサブセットがある場合、数値を修正された基数に変換するだけのまっすぐな数値ループでこのようなことを行うことを想像できます-26鍵。

いくつかの擬似コード:

public void runAlgorithm () {
    for (int i=startKey; i<endKey; i++) {
        String key = toBase26(i);
        testKey(key);
    }
}

(以下にコピー)の実装には、ウィキペディアのこのヘキサビゲシマルコンバーターのようなものを使用してください。toBase26

public static String toBase26(int number){
    number = Math.abs(number);
    String converted = "";
    // Repeatedly divide the number by 26 and convert the
    // remainder into the appropriate letter.
    do
    {
        int remainder = number % 26;
        converted = (char)(remainder + 'A') + converted;
        number = (number - remainder) / 26;
    } while (number > 0);

    return converted;
}
于 2012-12-28T23:02:27.003 に答える