单字母密码解密?

时间:2013-05-06 19:45:39

标签: java encryption jcreator

有谁能看到我在这里做错了什么?我有一个算法,通过沿着一个数组移动它14个空格来加密一个字符串但是当我尝试解密它时,一些字母重复,例如
加密时:abcdefghijklmnopqrstuvwxyz == opqrstuvwxyzabcdefghijklmn
解密时:opqrstuvwxyzabcdefghijklmn == abcdefghijklklabcdefghijkl

char[] plaintext = input.toCharArray();

for(int i = 0; i<plaintext.length; i++) {
    for(int j = 0 ; j<26; j++) {
        if(j>=14 && plaintext[i]==alphabet[j]) {
            plaintext[i] = alphabet[j-14];
            break;
        }

        else if(plaintext[i] == alphabet[j] && j<14 ) {
            plaintext[i] = alphabet [j+14] ;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

问题在于,当字符为>= 14< 14时,您应用的操作不同,并且它也可能是错误的,因为它可能会越过边界。

你做的是:

  • 18 (>= 14) -> 18 - 14 = 418 + 14 = 32 = 26+66 != 4
  • 13 (<14) -> 13 + 14 = 27超出范围。

方法不正确,您应该将值包裹在字母数组上,这可以通过mod %运算符轻松完成:

newIndex = (oldIndex+shift) % alphabetLength

如果不使用适当的工具,每个简单的任务都会出错并且难以维护。您也可以在没有模数的情况下进行,但计算应该是正确的,在字母索引中添加和减去14肯定不会创建有效的映射。