Vigenere解密奇怪

时间:2013-02-24 18:29:41

标签: java encryption vigenere

我编写了一个用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);
            }
        }

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分: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);
        }
    }