凯撒密码与java acm

时间:2013-12-27 01:24:31

标签: java acm-java-libraries

以下代码以Caesar的方式加密单词或句子。你把移位值和程序取出单词/句子的每个字母,并根据移位(键)值在字母表中“移动”。但这不是问题。 我在互联网上找到了代码,我无法解释其中的一些内容。 我知道它是如何工作的,但我需要一些关于它的一些特定答案。 这是代码:

import acm.program.*;

public class CaesarCipher extends ConsoleProgram {

public void run() {
    println("This program implements a Caesar cipher.");
    int key = readInt("Character positions to shift: ");
    String plaintext = readLine("Enter a message: ");
    String ciphertext = encodeCaesarCipher(plaintext, key);
    println("Encoded message: " + ciphertext);
}


private String encodeCaesarCipher(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);
        if (Character.isLetter(ch)) {
            if (Character.isUpperCase(ch)) {
                ch = (char) ('A' + (ch - 'A' + key) % 26);
            }
            else {
                ch = (char) ('a' + (ch - 'a' + key) % 26);
            }
        }
        result += ch;
    }
    return result;
}
}

这些线究竟是什么意思,他们如何做他们的工作?

ch = (char) ('A' + (ch - 'A' + key) % 26);

ch = (char) ('a' + (ch - 'a' + key) % 26);

2 个答案:

答案 0 :(得分:5)

这两行的行为相同,除了一个适用于大写,一个适用于小写的事实。我将在这里解释大写操作。请注意,这些char值将被视为int,直到下面的第6步。

ch = (char) ('A' + (ch - 'A' + key) % 26);
  1. ch - 'A'给出了首字母int与首都A的偏移。
  2. ch - 'A' + key将偏移量增加key,从而创建加密字符与大写字母A的偏移量。
  3. (ch - 'A' + key) % 26:此处的模数确保加密字符的数值为0-25(对于字母表中的26个字母),防止字母“溢出”。该表达式的值现在是加密字符与大写字母A的标准化偏移量。
  4. 'A' + (ch - 'A' + key) % 26将加密字符从大写字母A的偏移量添加到大写字母A本身,从而产生加密字符的int值。
  5. (char) ('A' + (ch - 'A' + key) % 26)int转换为char类型,从而将加密字符设为char
  6. 此代码将字母表的开头(大写字母A)视为“起始点”,从中测量每个字母的偏移量。偏移量是字符从'A'开始的字母数。

    示例:使用6:

    键来加密“E”
    1. 找出“E”和大写字母A之间的字母数。 A的ASCII码为65,E的码为69.要从A中找到E的偏移量,减去69 - 65 = 4
    2. 添加偏移量和密钥:4 + 6 = 10。这是来自A加密字符的字母数。
    3. 10 % 26 = 10(由于起始字母小+小键无效)
    4. 'A' + 10 = 65 + 10 = 75会产生加密字符的ASCII码,75('K')
    5. 将75投射到char可以将其视为字符,而不是int

答案 1 :(得分:2)

它将字符转换为ASCII等效字符,由+运算符表示(不能添加字符,只能添加数字),然后将字符更改一定数量的值。 (char)正在将结果转换(转换)回字符,以便您可以将其分配给ch

'A的ASCII值为65,ch是当前在字符串中位置i处计算的字符。 ch = (char) ('A' + (ch - 'A' + key) % 26);的计算结果为'65 +(字符的ASCII码 - 65 +键)%26'。然后将此结果强制转换为字符并分配给ch。模数(%)运算符取一个数字,除以第二个数字,在本例中为26,并返回余数(5%6为5,而7%3为1)。第二个语句以相同的方式工作,但使用小写'a'(97)而不是大写'A'。

有关ASCII键的信息,请参阅此页:http://www.asciitable.com/