我有 ascii 密码的编码功能,但需要帮助来解码它

I have the encode function for an ascii cipher, but need help to how to decode it

我正在研究一个涉及解码密码的谜题。我已获得用于对密文进行编码的函数,但我不确定如何对其进行逆向工程以找到解码函数。

这是函数,在JavaScript:

function encodeText(ascii,x,y,z) {
    for (i=0; i<ascii.length; i++) {
        if(i%3==0){
            ascii[i]= (ascii[i]+x) % 256;
        }
        if(i%3==1){
            ascii[i]=(ascii[i]+y) % 256;
        }
        if(i%3==2){
            ascii[i]=(ascii[i]+z) % 256;
        }
    }
    return ascii;
}

我知道它 returns 一个数字数组,这是我收到的密文。

非常感谢帮助!

这是维吉尼亚密码,密钥长度为 3 (x, y, z)。

ascii[i]x 都小于 256,但 (ascii[i]+x) 可能导致数字大于 255。这就是模运算符将其翻转回范围 0 的原因-255.

解密看起来像 (ascii[i] - x + 256) % 256

ascii[i] - xascii[i] + x 正好相反,所以我认为这很清楚。 ascii[i] 可能是一个小于 x 的数字。在这种情况下,ascii[i] - x 可能小于零。问题是 -5 % 256-5 而不是 251 (example)。因此,我们需要将所有可能的结果移动到正数,然后应用模运算。

例如,(74 - 80 + 256) 是 250,250 % 256 仍然是 250。此外,(84 - 80 + 256)260260 % 2564 这就是区别。


凯撒密码和维吉尼亚密码通常被frequency analysis破解。您的 Vigenère 密码实例由三个凯撒密码组成。密钥 space 是 256*256*256 = 16,777,216,它太大而无法遍历并读取所有可能的恢复明文。

您应该知道明文使用的是什么语言。如果知道,那么您可以将密文拆分为三个字符串。第一个、第四个、第七个等等字符进入第一个字符串。第二个、第五个、第八个等等字符进入第二个字符串。第 3 个、第 6 个、第 9 个等字符进入第三个字符串。现在,您可以对这三个结果字符串中的每一个进行频率分析,并将结果与​​目标语言的字母频率进行比较 (english example)。

如果密文足够长,你应该可以判断哪些加密字母是en。当你拥有它时,转变是线性的。假设您标识为 e 的字母的序值为 43。如果您查看 ASCII table,实际的小写字母 e 的序值为 101。那将意味着你必须计算 43 - 101 = -58。由于这必须是正数,我们可以加上 256 得到 x = 198。您也应该对 y(第二个字符串)和 z(第三个字符串)重复该过程。