Java 我的加密程序需要帮助

Java 我的加密程序需要帮助,java,encryption,Java,Encryption,我使用input.replace方法创建了一个加密程序,因为它应该加密用户的输入,但我一直遇到的一个问题是,代码从未完全加密。例如,如果我输入“happy”这个词,这个词就会输出“haccl”,当“h”和“a”也应该加密时,它们就不会被碰。这是我的密码: public class HelloWorld { public static void main(String[] args) { System.out.print("Input a word: ");

我使用input.replace方法创建了一个加密程序,因为它应该加密用户的输入,但我一直遇到的一个问题是,代码从未完全加密。例如,如果我输入“happy”这个词,这个词就会输出“haccl”,当“h”和“a”也应该加密时,它们就不会被碰。这是我的密码:

public class HelloWorld
{
    public static void main(String[] args)
    {
        System.out.print("Input a word: ");
        Scanner inputscan = new Scanner(System.in);
        String input = inputscan.nextLine();

        input = input.replace('A', 'N');
        input = input.replace('B', 'O');
        input = input.replace('C', 'P');
        input = input.replace('D', 'Q');
        input = input.replace('E', 'R');
        input = input.replace('F', 'S');
        input = input.replace('G', 'T');
        input = input.replace('H', 'U');
        input = input.replace('I', 'V');
        input = input.replace('J', 'W');
        input = input.replace('K', 'X');
        input = input.replace('L', 'Y');
        input = input.replace('M', 'Z');
        input = input.replace('N', 'A');
        input = input.replace('O', 'B');
        input = input.replace('P', 'C');
        input = input.replace('Q', 'D');
        input = input.replace('R', 'E');
        input = input.replace('S', 'F');
        input = input.replace('T', 'G');
        input = input.replace('U', 'H');
        input = input.replace('V', 'I');
        input = input.replace('W', 'J');
        input = input.replace('X', 'K');
        input = input.replace('Y', 'L');
        input = input.replace('Z', 'M');
        input = input.replace('a', 'n');
        input = input.replace('b', 'o');
        input = input.replace('c', 'p');
        input = input.replace('d', 'q');
        input = input.replace('e', 'r');
        input = input.replace('f', 's');
        input = input.replace('g', 't');
        input = input.replace('h', 'u');
        input = input.replace('i', 'v');
        input = input.replace('j', 'w');
        input = input.replace('k', 'x');
        input = input.replace('l', 'y');
        input = input.replace('m', 'z');
        input = input.replace('n', 'a');
        input = input.replace('o', 'b');
        input = input.replace('p', 'c');
        input = input.replace('q', 'd');
        input = input.replace('r', 'e');
        input = input.replace('s', 'f');
        input = input.replace('t', 'g');
        input = input.replace('u', 'h');
        input = input.replace('v', 'i');
        input = input.replace('w', 'j');
        input = input.replace('x', 'k');
        input = input.replace('y', 'l');
        input = input.replace('z', 'm');

        System.out.println("After replace: " + input);
    }
}

您可能希望使用某种类型的数据结构来存储转置

  • 你可以映射每个角色。这样,您就不会更换任何已更换的部件
  • 此外,还可以使用掩码快速切换要忽略的字母
  • 最后,您可以将加密密钥作为文本文件读入,并动态构建映射
  • 这看起来像凯撒密码,您可以使用已知的算法来移动字符

    import java.util.*;
    公共类加密{
    静态最终地图绘制;
    静态定形掩模;
    公共静态void main(字符串[]args){
    系统输出打印(“输入一个单词:”);
    扫描仪输入扫描=新扫描仪(System.in);
    System.out.println(“替换后:+encrypt(inputscan.nextLine()));
    inputscan.close();
    }
    私有静态字符串加密(字符串明文){
    StringBuffer buff=新的StringBuffer();
    for(char ch:plaintext.toCharArray()){
    buff.append(!mask.contains(ch)和&mapping.containsKey(ch)
    ?映射。获取(ch)
    :ch);
    }
    返回buff.toString();
    }
    静止的{
    mapping=newhashmap();
    mask=newhashset();
    mapping.put('A','N');
    mapping.put('B','O');
    mapping.put('C','P');
    mapping.put('D','Q');
    mapping.put('E','R');
    mapping.put('F','S');
    mapping.put('G','T');
    mapping.put('H','U');
    mapping.put('I','V');
    mapping.put('J','W');
    mapping.put('K','X');
    mapping.put('L','Y');
    mapping.put('M','Z');
    mapping.put('N','A');
    mapping.put('O','B');
    mapping.put('P','C');
    mapping.put('Q','D');
    mapping.put('R','E');
    mapping.put('S','F');
    mapping.put('T','G');
    mapping.put('U','H');
    mapping.put('V','I');
    mapping.put('W','J');
    mapping.put('X','K');
    mapping.put('Y','L');
    mapping.put('Z','M');
    mapping.put('a','n');
    mapping.put('b','o');
    mapping.put('c','p');
    mapping.put('d','q');
    mapping.put('e','r');
    mapping.put('f','s');
    mapping.put('g','t');
    mapping.put('h','u');
    mapping.put('i','v');
    mapping.put('j','w');
    mapping.put('k','x');
    mapping.put('l','y');
    mapping.put('m','z');
    mapping.put('n','a');
    mapping.put('o','b');
    mapping.put('p','c');
    mapping.put('q','d');
    mapping.put('r','e');
    mapping.put('s','f');
    mapping.put('t','g');
    mapping.put('u','h');
    mapping.put('v','i');
    mapping.put('w','j');
    mapping.put('x','k');
    mapping.put('y','l');
    mapping.put('z','m');
    加上('a');
    加上('h');
    }
    }
    

    下面是一个凯撒密码的实现(改编自)

    import java.util.*;
    公共类EncryptionUtil{
    专用静态最终设置掩码;
    静止的{
    MASK=newhashset(Arrays.asList('a','h'));
    }
    公共静态void main(字符串[]args){
    字符串短语=“动作>>你好世界”;
    System.out.println(短语);
    字符串加密=密码(短语,13,掩码);
    System.out.println(加密);
    字符串明文=密码(加密,13,掩码);
    System.out.println(纯文本);
    }
    私有静态字符串密码(字符串明文、整数移位、设置掩码){
    StringBuffer buff=新的StringBuffer();
    for(char ch:plaintext.toCharArray()){
    如果(!mask.contains(ch)&&Character.isAlphabetic(ch)){
    int baseOrd=(int)(ch>='a'?'a':'a');
    int origPos=((int)ch)-baseOrd;
    int newPos=(origPos+shift)%26;
    buff.append((char)(baseOrd+newPos));
    }否则{
    buff.append(ch);
    }
    }
    返回buff.toString();
    }
    私有静态字符串密码(字符串明文,int移位){
    返回密码(明文、shift、Collections.emptySet());
    }
    }
    
    输出:

    action >> hello world
    apgvba >> hryyb jbeyq
    actioa >> hello world
    

    您的代码多次替换字母。我的解决方案是使用循环并逐个替换字母:

    public class HelloWorld {
    
    public static void main(String[] args) {
        System.out.print("Input a word: ");
        Scanner inputscan = new Scanner(System.in);
        String input = inputscan.nextLine();
    
        StringBuilder stringBuilder = new StringBuilder(input);
        for (int i = 0; i < input.length(); i++) {
    
            switch (input.charAt(i)) {
                case 'A':
                    stringBuilder.setCharAt(i, 'N');
                    break;
                case 'B':
                    stringBuilder.setCharAt(i, 'O');
                    break;
    
                //Add all the other cases here.
    
            }
        }
        System.out.println("After replace: " + stringBuilder.toString());
    }
    
    }
    
    公共类HelloWorld{
    公共静态void main(字符串[]args){
    系统输出打印(“输入一个单词:”);
    扫描仪输入扫描=新扫描仪(System.in);
    字符串输入=inputscan.nextLine();
    StringBuilder StringBuilder=新的StringBuilder(输入);
    对于(int i=0;i
    我将创建一个用于查找的
    映射,以及一个用于忽略键的掩码。问题是
    input=input.replace('u','h')发生在
    input=input.replace('h','u')之后
    并将其更改回
    h