caesar shift cipher java

时间:2015-02-06 10:44:36

标签: java encryption

我试图为Java实现一个基本的Caesar Shift Cipher,将所有字母移动13个。到目前为止,这是我的代码。

    public static String cipher(String sentence){
    String s = "";
    for(int i = 0; i < sentence.length(); i++){
        char c = (char)(sentence.charAt(i) + 13);
        if (c > 'z')
            s += (char)(sentence.charAt(i) - 13);
        else
            s += (char)(sentence.charAt(i) + 13);
    }
    return s;
}

但是,该程序还会更改数字和特殊字符的值,我不希望这样。

String sentence = "abc123";

返回&#34; nop&gt;?@&#34;

是否有一种简单的方法可以避免使用特殊字符而只关注字母?

编辑:我应该提到我想保留所有其他位。所以&#34; abc123&#34;将返回&#34; nop123&#34;。

2 个答案:

答案 0 :(得分:1)

在下面的示例中,我只加密字母(更准确地说是A-Z和a-z)并添加了使用任何偏移量的可能性:

public static String cipher(String sentence, int offset) {
  String s = "";
  for(int i = 0; i < sentence.length(); i++) {
    char c = (char)(sentence.charAt(i));
    if (c >= 'A' && c <= 'Z') {     
      s += (char)((c - 'A' + offset) % 26 + 'A');
    } else if (c >= 'a' && c <= 'z') {
      s += (char)((c - 'a' + offset) % 26 + 'a');
    } else {
      s += c;
    }
  }
  return s;
}

这里有一些例子:

cipher("abcABCxyzXYZ123", 1)   // output: "bcdBCDyzaYZA123"
cipher("abcABCxyzXYZ123", 2)   // output: "cdeCDEzabZAB123"
cipher("abcABCxyzXYZ123", 13)  // output: "nopNOPklmKLM123"

注意:由于您的代码,我认为您只想处理/加密“普通”26个字母。这意味着像...德语'ü'(Character.isLetter('ü')将返回true)保持未加密状态。

答案 1 :(得分:0)

问题是你将13添加为固定数字,对于某些字母(主要是字母的后半部分和数字)会产生不是字母的字符。

你可以通过使用字母数组并移动这些字符来解决这个问题。 (类似于数字)所以像这样

List<Character> chars = ... // list all characters, separate lists for upper/lower case
char c = chars.get((chars.indexOf(sentence.charAt(i)) + 13)%chars.size());
相关问题