简单加密

时间:2016-11-08 15:04:49

标签: java encryption

我正在编写一个简单的加密程序。对于A' A'之间的所有字母&安培; ' Z'和' a' &安培; ' Z'我想把字母变成'a' a'是' z'和' b'是'。

这是我到目前为止所做的。

public static void deCrypt() {
    char[] alphabet = "abcdefghijklmnopqrstuvwxyz ".toCharArray();
    char[] crypt = "zyxwvutsrqponmlkjihgfedcba ".toCharArray();
    Scanner scan = new Scanner(System.in);
    System.out.print("Mata in meddelandet: ");
    String input = scan.nextLine();
    for (int i = 0; i < input.length(); i++) {
        char temp = input.charAt(i);

        int tempNums = (new String(alphabet).indexOf(temp));
        System.out.print(new String(crypt).charAt(tempNums));
    }
}

问题是程序不区分大小写,所以如果我输入大写或(!)我会收到错误。我希望能够输入&#34; GO go Go&#34;。有什么提示吗?

8 个答案:

答案 0 :(得分:1)

如果您不关心案件,可以input.toLowerCase()

答案 1 :(得分:0)

您可以添加一个if语句,检查该字母是否为字符。

您可以使用"someString".matches("[ a-z]"),如果它是小写字符或空格,则返回true,否则返回false。同样,您可以将正则表达式"[ A-Z]"用于大写。

你可以这样做:

public static void deCrypt() {
    String alphabetLowerCase = "abcdefghijklmnopqrstuvwxyz ";
    String alphabetUpperCase = alphabetLowerCase.toUpperCase();
    int length = alphabetLowerCase.length();

    Scanner scan = new Scanner(System.in);
    System.out.print("Mata in meddelandet: ");
    String input = scan.nextLine();

    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);

        if (String.valueOf(c).matches("[ a-z]")) {
            System.out.print(alphabetLowerCase.charAt(length - alphabetLowerCase.indexOf(c)));
        } else if (String.valueOf(c).matches("[ A-Z]")) {
            System.out.print(alphabetUpperCase.charAt(length - alphabetUpperCase.indexOf(c)));
        }
    }
}

请注意,我没有运行此代码,因此索引可能会在某个地方偏离。

答案 2 :(得分:0)

如果您希望它不区分大小写,可以尝试使用variablename*.equalsIgnoreCase(variablename*)。有一些替代方法,比如事先转换字符串以规范它。

正如Lidae指出的那样,input.toLowerCase()可以很容易地完成归一化。

答案 3 :(得分:0)

这是另一种方法

    String alphabet = "abcdefghijklmnopqrstuvwxyz";
    String input = "Go go GO";
    for(int i=0; i < input.length(); i++) {
        int index = alphabet.indexOf(Character.toLowerCase(input.charAt(i)));
        if (index == -1) {
            System.out.print(input.charAt(i));
            continue;
        }
        char encrypted = alphabet.charAt(25 - index);
        if (Character.isUpperCase(input.charAt(i))) {
            System.out.print(Character.toUpperCase(encrypted));
        } else {
            System.out.print(encrypted);
        }
    }

答案 4 :(得分:0)

您可以简单地将输入转换为小写,并仅在循环字符串时加密字母字符。在这种情况下,您也不需要字母表字符串。只需减去&#39; a&#39;从角色获取索引。

String crypt = "zyxwvutsrqponmlkjihgfedcba";

Scanner scan = new Scanner(System.in);
System.out.print("Mata in meddelandet: ");
String input = scan.nextLine().toLowerCase();

for (int i = 0; i < input.length(); i++) {
      char ch = input.charAt(i);
      if (Character.isLetter(ch)) {
           ch = crypt.charAt((int)(ch - 'a'));
      }                                                                                                                                         
      System.out.print(ch);
}   

答案 5 :(得分:0)

这是一个私人功能,可以做你想做的事情:

private String encrypt(String input) {
    String alphabet = "abcdefghijklmnopqrstuvwxyz ";
    List<Character> list = alphabet.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
    String output = "";
    for(int i = 0; i < input.length(); i++) {
        output += list.get(list.size() - list.indexOf(input.toLowerCase().charAt(i)) -1);
    }
    return output;
}

它将您的字母字符串转换为列表并循环输入,从列表中收集相反的顺序并返回编码的输出字符串。 需要Java 8。

像这样使用:

encrypt("GO go GO") // Returns "umaumaum"

答案 6 :(得分:0)

您可以通过从122中减去char的int值并添加“a”或“A”来实现此目的,具体取决于您的char是大写还是小写。

public static String deCrypt(String str) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i<str.length(); i++){
        sb.append((char)(122-str.toLowerCase().charAt(i)+ ((Character.isLowerCase(str.charAt(i)))?'a':'A')));
    }
    return sb.toString();
}

答案 7 :(得分:-1)

你想要实现一个Ceasar密码,除非它的学术我建议你只为自己查找一个实现。

http://practicalcryptography.com/ciphers/caesar-cipher/

相关问题