Java中的Vigenere / Polyalphabetic Cipher Decoder / Decrypter / Breaker

时间:2012-12-28 22:48:19

标签: java encryption vigenere

我正在尝试开发一个程序,对使用Vigenere密码编码的消息进行加密编码,解码和破解。我遇到的问题是打破[加密]消息(没有密钥)。我知道如何去做,但我不知道如何编码。我的想法如下:

该程序将系统地生成潜在的密钥,长度从1开始到26结尾。密钥将包含英文字母的字母,并且不区分大小写。对于每个密钥长度(1-26之间的任何一个),密钥将填充字母' a'然后程序将检查它们的密钥是否是正确的(我有另一种方法) 。如果键不正确,则最后位置的字母将旋转到字母表中的下一个字母。一旦最后一个字母经过所有26个可能的位置,倒数第二个字母将被旋转,然后最后一个字母和倒数第二个字母将相应地旋转,依此类推(依此类推) [潜在]键的字母)。每次生成新密钥时,都会使用单独的方法检查[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

(希望你能看到那里的模式)

如果有人知道或知道如何执行此操作的代码,或者可以通过编写此代码所需的步骤来帮助指导,那么我们将非常感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

编辑(现在我已经完成了数学运算)

您需要迭代大约6 * 10 ^ 36种可能的组合 - 最大long值约为9 * 10 ^ 18 - 较小的数字。

话虽如此,说你找到了一种优化的方法来迭代组合,你可以生成并比较每秒万亿(10 ^ 12)组合(很多比一般开发人员的机器更快) ,你可以在一百万台机器上并行化它 - 每年(60 * 60 * 24 * 365 * 10 ^ 12)* 10 ^ 6,或每年检查约3 * 10 ^ 25种组合。

以极快的速度,还需要大约1900亿年才能完成所有组合。

我强烈建议您研究另一种替代方法,以实现您的目标,而不是尝试每一个密钥。

现在(回到我原来的答案),如果你有一个合理大小的密钥子集你想要迭代,我可以想象用这样的东西做一个直接的数字循环,只是将数字转换为修改后的基数 - 26为钥匙。

一些伪代码:

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

使用类似this hexavigesimal converter from wikipedia的内容作为toBase26的impl(在下面复制):

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;
}