1

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

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

话虽如此,假设您找到了一种优化的方法来迭代组合,您可以在其中每秒生成和比较一万亿 (10^12) 个组合(比普通开发人员的机器快得多),并且可以在百万台机器上并行化它- 这将是 (60*60*24*365*10^12)*10^6 每年,或每年检查大约 3*10^25 组合。

以如此惊人的速度,仍然需要大约 1900 亿年才能遍历所有组合。

我强烈敦促您研究另一种实现目标的替代方法,而不是尝试每一个键。

现在(回到我原来的答案),如果你有一个合理大小的键子集想要迭代,我可以想象用一个直接向上的数字循环做这样的事情,只是将数字转换为修改后的 base-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 回答