【问题标题】:caesar shift cipher java凯撒移位密码java
【发布时间】:2015-02-06 10:44:35
【问题描述】:

我正在尝试为 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";

返回 "nop>?@"

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

编辑:我应该提到我想保留所有其他位。所以“abc123”会返回“nop123”。

【问题讨论】:

    标签: java encryption


    【解决方案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)保持未加密状态。

    【讨论】:

      【解决方案2】:

      问题是您将 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());
      

      【讨论】:

        猜你喜欢
        • 2014-09-28
        • 2013-10-07
        • 1970-01-01
        • 2017-02-08
        • 2016-08-30
        • 2014-12-23
        • 1970-01-01
        • 2014-06-24
        • 1970-01-01
        相关资源
        最近更新 更多