这是我在Stack Overflow上发布的第一个问题。我开发了一个应用程序,它将用户的文本以简单的加密形式存储在文本文件中。该应用程序还用于解密文本并根据用户的需求将其显示在屏幕上。下面的代码显示了我的" UnEncrypt"方法。该方法有效地将加密文本分成四个字符间隔。然后,它通过加密密钥方法运行这四个字符间隔,将四个字符转换为单个字符。我也有这种方法运行"测试"串。 "测试的价值" string是" 85jf"这对应于角色" t"在" UnKey"方法。现在出现问题:字符串" c"和"测试"两者都保持完全相同的值;然而,"测试"字符串被有效地转换为字符" t"和" c" string返回错误(" E")。我在下面列出了以下证据:" UnEncrypt"方法。所以在这里总结一下:字符串" test"和" c"具有完全相同的值,但是,这些值是以不同的方式创建的(如代码中所示)。当"测试"和" c"运行相同的方法" UnKey",返回两个不同的值。我的问题是为什么会这样?我需要" c"返回一个有效的字符,让我的应用程序工作。关于为什么会发生这种情况的唯一猜测是因为当for循环生成字符串" c"时,它在外部看起来相同,但是一些内部值是不同的,因此与我的方法不兼容" UnKey&#34 ;.我试图尽可能清楚。如果需要,请问我问题。在此先感谢您的帮助!编辑:字符串被传递到" UnEncrypt"是" 85jf"
public static String UnEncrypt(String s){
char one = 0;
char two = 0;
char three = 0;
char four = 0;
String c = "";
String fnl = "";
String test = "85jf";
for(int i = 0; i<= ((s.length()/4)-1); i++){
one = s.charAt((i*4)+0);
c += one;
two = s.charAt((i*4)+1);
c += two;
three = s.charAt((i*4)+2);
c += three;
four = s.charAt((i*4)+3);
c += four;
System.out.println(c);
System.out.println(test);
System.out.println(UnKey(test));
System.out.println(UnKey(c));
c = "";
}
return fnl;
}
public static char UnKey(String s){
char rtrn = 0;
if (s == "rtfg"){
rtrn = 'a';
}else if (s == "sefc"){
rtrn = 'b';
}else if (s == "escf"){
rtrn = 'c';
}else if (s == "wjvo"){
rtrn = 'd';
}else if (s == "wvke"){
rtrn = 'e';
}else if (s == "24fk"){
rtrn = 'f';
}else if (s == "35fs"){
rtrn = 'g';
}else if (s == "ceif"){
rtrn = 'h';
}else if (s == "5ue8"){
rtrn = 'i';
}else if (s == "544f"){
rtrn = 'j';
}else if (s == "09fj"){
rtrn = 'k';
}else if (s == "4f84"){
rtrn = 'l';
}else if (s == "34fr"){
rtrn = 'm';
}else if (s == "4ofo"){
rtrn = 'n';
}else if (s == "59e9"){
rtrn = 'o';
}else if (s == "fje3"){
rtrn = 'p';
}else if (s == "rewq"){
rtrn = 'q';
}else if (s == "3f55"){
rtrn = 'r';
}else if (s == "34kf"){
rtrn = 's';
}else if (s == "85jf"){
rtrn = 't';
}else if (s == "daf8"){
rtrn = 'u';
}else if (s == "5cr3"){
rtrn = 'v';
}else if (s == "34fr"){
rtrn = 'w';
}else if (s == "d390"){
rtrn = 'x';
}else if (s == "sef4"){
rtrn = 'y';
}else if (s == "54jf"){
rtrn = 'z';
}else if (s == "fr73"){
rtrn = '1';
}else if (s == "fr4r"){
rtrn = '2';
}else if (s == "seg7"){
rtrn = '3';
}else if (s == "u87i"){
rtrn = '4';
}else if (s == "436i"){
rtrn = '5';
}else if (s == "0et3"){
rtrn = '6';
}else if (s == "uti9"){
rtrn = '7';
}else if (s == "9i5t"){
rtrn = '8';
}else if (s == "675f"){
rtrn = '9';
}else if (s == "53d4"){
rtrn = '0';
}else if (s == "1432"){
rtrn = ' ';
}else{
rtrn = 'E';
}
return rtrn;
}
Please enter the password...
pass
Select command from menu...
1. View Passwords
2. Create New Entry
1
85jf
85jf
t
E
答案 0 :(得分:3)
这似乎是个糟糕的主意,我强烈建议您不要使用密码进行可逆转换。如果您的密码以可逆方式存储,则攻击者(可以访问该文件)可以撤消用户的密码。相反,目前的最佳做法是使用cryptographically secure hash和SALT来阻止rainbow tables的攻击。另见现在古老的Shadow Suite。
您是否知道pigeonhole principle?不可思议?那是你的提示Mr. Patinkin。
修改,因为您添加了代码,
不要使用==
来测试字符串相等性。使用Object类型进行引用相等性测试。您需要使用.equals()
。
if ("a" != new String("a")) {
System.out.println("It is known."); // <-- There a GoT reference too.
}