用Java创建Caesar Cipher

时间:2015-02-27 02:57:02

标签: java encryption caesar-cipher

我正在开展一个项目,我将通过将文件作为输入然后从用户请求号码来创建Ceaser Cipher。该数字用于向前移动字母,因此如果输入的数字是2,则a将变为c。字母表是环绕的(所以如果字母是z,输入是2,加密的字母将是b),程序将忽略非字母字符并继续向前。

我有一个我相信应该有效的解决方案,但我认为我错过了一些东西,因为输出不是我的预期,也不应该是什么。我已经包含了以下代码的相关部分

public static String encode(String content, int num){
    char[] contentArray = content.toCharArray();
    String encoded = "";
    for(int i = 0; i < contentArray.length; i++){
        char current = contentArray[i];
        if (current >= 'a' && current <='z' || current >= 'A' && current <= 'Z'){
            current = (char) (current + num);
            if (current > 'z' | current > 'Z'){
                current = (char) (current - 26);
            } else if (current < 'a' | current < 'A'){
                current = (char) (current + 26);
            }
            contentArray[i] = current;
            encoded = encoded + encoded.concat(Character.toString(contentArray[i]));
        } else {
            i++;
        }
    }
    return encoded;
}

以上是我的主要功能,在调用此功能之前,它只是要求用户输入必要的输入。在这种情况下,字符串内容由以下字符组成:taco cat 1-349z 2

理论上,如果用户输入2为num,则应该返回vceq ecv 1-349b 2。不幸的是,返回以下内容......

\ I \ IK \ I \ IKW \ I \ IK \ I \ IKWI \ I \ IK \ I \ IKW \ I \ IK \ I \ IKWI \\ I \ IK \ I \ IKW \ I \ IK \我\ IKWI \ I \ IK \ I \ IKW \ I \ IK \ I \ IKWI \ b'/ p>

......这显然不正确。我不知道我的代码出了什么问题,所以非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

试试这个

public static String encode(String enc, int offset) {
        offset = offset % 26 + 26;
        StringBuilder encoded = new StringBuilder();
        for (char i : enc.toCharArray()) {
            if (Character.isLetter(i)) {
                if (Character.isUpperCase(i)) {
                    encoded.append((char) ('A' + (i - 'A' + offset) % 26));
                } else {
                    encoded.append((char) ('a' + (i - 'a' + offset) % 26));
                }
            } else {
                encoded.append(i);
            }
        }
        return encoded.toString();
    }

用法

 System.out.println(encode("taco cat 1-349z", 2));