加密用户输入

时间:2016-12-09 18:46:36

标签: java encryption

我正在制作一个加密程序来加密用户输入的单词,除了输出输入的加密单词外,我还能正常工作。以下是我的代码现在的样子:

第1类

public class Encryption {

    String encrypt = "test";
    String key;
    String message;
    String alpha;
    Encryption(){
        encrypt = Encrypt();
    }
    private String Encrypt(){

        String[] alphabet = {
                "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , 
                "n" , "o" , "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z"

        };


        StringBuilder sbAlphabet = new StringBuilder();

        for (int i = 0; i <= 25; i++) {
            sbAlphabet.append(alphabet[i]);
        }
        alpha = sbAlphabet.toString();
        return encrypt;
    }           
}

第2类

package encryption;

import java.util.Random;

public class Key {

    String key;

    Key() {
        key = genKey();
    }
    private String genKey() {

        String[] scrambled = {
            "a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "i" , "j" , "k" , "l" , "m" , 
            "n" , "o" , "p" , "q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" , "y" , "z"

        };

        int r;
        String temp;
        String key;
        StringBuilder sbScrambled = new StringBuilder();

        for (int i = 0; i <= 25; i++) {
            r = (int)(25*Math.random() + 1);
            temp = scrambled[i];
            scrambled[i] = scrambled[r];
            scrambled[r] = temp;
        }
        for (int i = 0; i <= 25; i++) {
            sbScrambled.append(scrambled[i]);
        }
        key = sbScrambled.toString();
        return key;
    }
}

第3类

package encryption;

import java.util.Scanner;

public class Message {
    Key key = new Key();
    Encryption encrypt; 
    String message;

    Message() {
        System.out.println("Please enter an input:");
        Scanner user_input = new Scanner( System.in);
        message = user_input.next();
        encrypt = new Encryption();
    }

    public static void main(String[] args) {

        Message message = new Message();        
        System.out.println(message.key.key);
        System.out.println(message.encrypt.alpha);
    }

}

Encryption类返回字母表,Key类随机加密字母表然后显示它,Message类将加密的键和字母显示给用户。下面是运行它时的样子:

Please enter an input:

wew lad

mbptwuklhanjrsedzqfcyvxogi

abcdefghijklmnopqrstuvwxyz

我正在尝试使代码执行的操作是在加密字母表中显示用户输入,因此它看起来像这样:

Please enter an input:

wew lad

xwx jmt

mbptwuklhanjrsedzqfcyvxogi

abcdefghijklmnopqrstuvwxyz

1 个答案:

答案 0 :(得分:1)

回答你的问题:

您需要将message内的Message()传递到加密类中,并从那里循环遍历所有字符,并将message字符替换为其在加扰字母表中的等效字符。例如,您将使用A替换字符scrambled[0]

要做到这一点,你需要查看ASCII Table来查看它的数字表示。然后做一些像:

public String encryptText(String message) {
    message = message.toLowerCase();
    String encryptedMessage = "";
    for(int i = 0; i < message.length; i++) {
        encryptedText += scrambled[message[i] - 'a' + 1];
    }
    return encryptedMessage;
}

话虽如此,我强烈建议删除你刚才所做的一切。谈到加密,除非你真的知道你在做什么,否则你不应该尝试创建自己的协议,因为对于任何有能力加密的人来说,破解它将非常容易。

以下是您应该做的事情的简单示例https://stackoverflow.com/a/4487541/1327636

您正在做的是替换密码,这不是很难破解。破解替代密码的方法是:

  • 计算加密文本中字母的频率,并将其与letter frequency table

  • 进行比较
  • 寻找重复的字符,例如ZZ

  • 查看单词的长度,并将加密的字符串字符与频率表进行比较,以查找常用字词,例如The

  • 寻找重复模式,例如INGTHION

使用这四件事可以在破解替代密码时为您提供非常好的统计概率。如果你想了解更多关于它们的信息,我会查看here.