的V @ genere /多码加密解码器/ Decrypter的/断路器在Java中(Vigener

2019-10-17 13:21发布

我想开发编码,解码,并打破了一个V @ genere加密编码的消息加密的程序。 我在哪里卡住是打破[上加密]消息(无钥匙)。 我有一个如何去这样做的想法,但我不知道如何编写它。 我的想法是如下:

该计划将系统产生潜在的密钥,长度从1开始和结束的26键将包含英文字母表的字母,并且不区分大小写。 对于每个密钥长度(从1-26的任意位置),将键填充字母“A”,然后程序会检查,看看他们是否关键是corrent(我有另一个方法)。 如果他们的关键是不正确的,那么在最后一个位置的字母将被旋转到字母表中的下一个字母。 一旦最后一个字母已通过所有26个可能的位置了,倒数第二个字母将被旋转,然后最后一个字母和倒数第二个字母将相应地旋转,所以在等(后一路第一的[潜在]键的字母)。 生成新的密钥每一次,[潜在]键被与一个单独的方法检查,并且当正确的钥匙被发现该方法停止。 该密钥创建进程会去是这样的:

[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

(希望你可以看到这个模式有)

如果任何人有或者知道如何做到这一点,或将有助于引导通过必要编写这个步骤遇到的代码,这将是大加赞赏。

谢谢!

Answer 1:

编辑 (现在,我已经做了数学)

大约有6个* 10 ^ 36,您需要遍历可能的组合-最大的long价值约9 * 10 ^ 18 - 少很多。

话虽这么说,说你找到一个优化的方式来遍历组合,在这里你可以生成和比较万亿(10 ^ 12)每秒(比一般的开发人员的机器快得多 )的组合,并可以对其进行并行化跨越万台 - 这将是(60 * 60 * 24 * 365 * 10 ^ 12)* 10 ^ 6每年,或约3 * 10 ^ 25组合每年检查。

在这惊人的速度, 但它仍然会采取〜190十亿年去了所有组合。

我强烈建议你去调查为实现自己的目标,而不是试图每一个关键的另一种选择。

现在(回到我原来的答案),如果你有钥匙的合理大小的子集,你想遍历,我能想象做这样的事情了直线上升数环,只是转换的数量修饰碱基-26的键。

一些伪代码:

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

使用像维基百科这样hexavigesimal转换为的IMPL 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;
}


文章来源: Vigenere/Polyalphabetic Cipher Decoder/Decrypter/Breaker in Java