我正在制作一个加密程序来加密用户输入的单词,除了输出输入的加密单词外,我还能正常工作。以下是我的代码现在的样子:
第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
答案 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
寻找重复模式,例如ING
,TH
,ION
使用这四件事可以在破解替代密码时为您提供非常好的统计概率。如果你想了解更多关于它们的信息,我会查看here.