我正在尝试开发一个程序,对使用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
(希望你能看到那里的模式)
如果有人知道或知道如何执行此操作的代码,或者可以通过编写此代码所需的步骤来帮助指导,那么我们将非常感激。
谢谢!
答案 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;
}