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