什么是'A'角色?

时间:2013-03-06 15:48:30

标签: java encryption cryptography

实际上,如果使用代码[A],则运行失败。我不明白为什么。我也不明白第一个'A'然后+'A'。为什么[A]失败了? [B]好吗?

Code [A]  (char) (ch + key) % 26 )
Code [B]  (char) ('A' + ((ch -'A' + key) % 26))

public void run() {

        setFont("Arial-PLAIN-24");
        String line = readLine ("Enter line: ");
        int key = readInt ("Enter key: ");

        String siphertext = encryptCaesar(line , key);

        println("The result is: " + siphertext);

        String newplain = encryptCaesar(siphertext , -key);
        println("newplain:" + newplain);

    }

    private String encryptCaesar(String str , int key){
        if(key < 0){
            key = 26 - ( -key % 26 );
        }

        String result = "";
        for(int i = 0; i < str.length(); i++){
            char ch = str.charAt(i);        
            result += encryptChar(ch,key);
        }
        return result;
    }
    /**Why can't use ( (ch + key) % 26 )*/

    private char encryptChar(char ch, int key){
        if(Character.isUpperCase(ch)){
            return ( (char) ('A' + ((ch -'A' + key) % 26)) );
        }
        return ch;
    }

2 个答案:

答案 0 :(得分:2)

如果我理解你的要求......

此处'A'的功能是将字符转换为与字母表中序号位置对应的数字。

表达式(ch -'A' + key) % 26将产生0到25范围内的值,具体取决于字符的序号位置和键变量的值。

答案 1 :(得分:1)

[A]表单提供025之间的值,[B]表单为您提供'A''Z'之间的值。他们显然不是同一个词。


如果你从这个角度阅读这两个表格,首先在[B]形式中使用'A'是为了确保结果值保持在'A'到{{1}的范围内}}。

减去'Z'的第二个用途是需要正确实施凯撒加密。如果删除它,最终将使用不同的加密方式。 ('A'确保- 'A'选择字母表的key轮次。没有它,您的key将实际计算encryptCaesar(a, key);即凯撒加密一把不同的钥匙。)

但如果您“手动执行”代码的两个版本以查看它们如何将输入字符映射到输出字符,那么这一切都应该是显而易见的。