1

我编写了一个使用 Vigenere 密码进行编码的 java 程序,加密工作正常,但是对于某些特殊情况,解密并不适用。

例如,如果纯文本是 'k' 并且密钥是 'y' 它正确地产生密文 'i' ((10 + 24 = 34 % 26 = 8))

但是,当解密密文是“i”并且密钥是“y”时,我得到((8-24)=-16%26=-16)),即使它是肯定的,也会是 Q。什么时候应该正确解密回到“k”,即 10。

有谁可以帮我离开这里吗?如果需要,我可以发布更多代码。

---链接到 wiki Viginare 密码算法http://en.wikipedia.org/wiki/Vigen%C3%A8re_cipher ---

        //decryption
    else{
        for (int i=0; i < a.length(); i++){

                for (int j=0; j < full.length(); j++){
                    //finding the index of the current cipher text letter
                    if (a.charAt(i) == full.charAt(j)){
                        positionP = j;

                    }
                    //finding the index of the current key letter
                    if(key.charAt(i)==full.charAt(j)){
                        positionK = j;
                    }


                }
                //using the formula for vigenere encoding it adds the newly encrypted character to the output
                output = output + full.charAt((positionP - positionK)%26);
            }
        }
4

2 回答 2

3

请注意,Java 中的余数运算符被定义为结果的大小始终小于除数的大小,如果被除数为负 [JLS] ,则余数运算的结果为负。

您可以通过执行以下操作获得所需的输出:

 output = output + full.charAt((positionP - positionK + 26)%26);

如果positionP-positionK为正,则加法不会改变结果(因为 26%26=0)。如果positionP-positionK是负数(介于 -25 和 0 之间),那么positionP - positionK + 26将是非负数,从而产生正确的结果。

于 2013-02-24T18:45:12.500 回答
1

如果您的密钥是 'y'=24 并且字母表的长度是 26,那么您必须将 alphabet-key= 26 - 24 = 2 转换为解密。您总是必须添加然后计算 mod 26。

所以你的代码必须是

       //decryption
else{
    for (int i=0; i < a.length(); i++){

            for (int j=0; j < full.length(); j++){
                //finding the index of the current cipher text letter
                if (a.charAt(i) == full.charAt(j)){
                    positionP = j;

                }
                //finding the index of the current key letter
                if(key.charAt(i)==full.charAt(j)){
                    positionK = j;
                }


            }
            //using the formula for vigenere encoding it adds the newly encrypted character to the output
            output = output + full.charAt((positionP + (26-positionK))%26);
        }
    }
于 2013-02-24T18:48:10.123 回答