Java中的Vigenere/多字母密码译码器/解密器/破译器

Java中的Vigenere/多字母密码译码器/解密器/破译器,java,encryption,vigenere,Java,Encryption,Vigenere,我正在尝试开发一个程序,对用Vigenere密码编码的消息进行编码、解码和解密。我陷入困境的地方是破坏信息的加密(没有密钥)。我有一个想法,如何着手做,但我不知道如何编码它。我的想法如下: 该程序将系统地生成潜在密钥,长度从1开始,到26结束。这些键将包含英文字母表中的字母,不区分大小写。对于每个键的长度(1-26之间的任何位置),键都将填充字母“a”,然后程序将检查它们的键是否正确(我有另一种方法)。如果他们的键不正确,那么最后一个位置的字母将旋转到字母表中的下一个字母。一旦最后一个字母穿过所

我正在尝试开发一个程序,对用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
(希望你能看到那里的模式)

如果有人拥有或知道如何编写代码,或者能够帮助met完成编写代码所需的步骤,我们将不胜感激

谢谢

编辑(现在我已经算好了)

您需要迭代大约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);
    }
}
编辑(现在我已经算好了)

您需要迭代大约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);
    }
}

我们不会为您编写代码。发布一些具体的问题,并向我们展示您迄今为止编写的一些代码。首先,为什么这个标记为递归(在我看来更像是简单的迭代),第二,强制使用Vigener密码可能不是最好的方法。我到目前为止还没有什么,正如我所说的,任何关于步骤的解释/帮助都是有用的。:)@你有什么建议?(请记住,这将是相对简单的,考虑到我不是专家)这是不切实际的,您将需要绝对大量的迭代-大约6*10^36。我会先阅读所有关于Vigenere的可用文献(以及用来简化问题的技巧),或者找到其他难题来解决。我们不会为您编写代码。发布一些具体的问题,并向我们展示您迄今为止编写的一些代码。首先,为什么这个标记为递归(在我看来更像是简单的迭代),第二,强制使用Vigener密码可能不是最好的方法。我到目前为止还没有什么,正如我所说的,任何关于步骤的解释/帮助都是有用的。:)@你有什么建议?(请记住,这将是相对简单的,考虑到我不是专家)这是不切实际的,您将需要绝对大量的迭代-大约6*10^36。我会先阅读有关Vigenere的所有可用文献(以及用于简化问题的技巧),或者找到一些其他难题来解决。你的解决方案的唯一问题是它产生如下输出:A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z、BA、BB、BC、BD、BE、BF、BG、BH、BI、BJ、BK,BL、BM、BN、BO、BP、BQ、BR、BS、BT、BU、BV、BW、BX、BZ、CA、CB、CC、CD、CE、CF、CG、CH、CI、CJ、CK、CL、CM、CN、CO、CP、CQ、CR、CS、CT、CU、CV、CW、CX、CY、CZ…其中,添加另一个字母开始时,第一个字母的位置与它应该的位置不同(例如,“b”而不是“a”),但除此之外,它非常接近。谢谢很少是完美的,但它应该指向足够正确的方向,你可以调整它来做你想做的。我现在正在计算潜在的键数,这是一个巨大的数字(这并不奇怪),我有