gpt4 book ai didi

java - 暴力破解java递归密码

转载 作者:行者123 更新时间:2023-12-01 07:51:05 24 4
gpt4 key购买 nike

我接到了另一项家庭作业,我已经绞尽脑汁思考了一周了:我得到了一个类,该类仅创建给定长度的 a-z 密码。

public class Password {
private String _password = "";

// Constructor that generates a password
public Password(int length) {
Random generator = new Random();
for (int i = 0; i < length; ++i) {
this._password = this._password + (char) (generator.nextInt(26) + 97);
}
}

//Method that compares a given string to the password
public boolean isPassword(String st) {
return st.equals(this._password);
}
}

规则:

  • 如果要使用 String 类,则只允许使用以下内容:charAt、equals、length、substring。
  • 您必须使用递归。
  • 您不能使用 26 次递归调用。
  • 没有支持方法。
  • 没有数组。
  • 没有静态变量。
  • 重载是可以的。

这是我到目前为止得到的:

public static String findPassword(Password p, int length) {
String pswd= "";
char char2Check = 'a';

if (length == 0) {
return "";
}
else {
return findPassword(p,length, pswd, char2Check);
}
}

public static String findPassword(Password p,int length, String pswd, char char2Check) {
if (pswd.length() < length) {
pswd+= char2Check;
pswd = findPassword(p,length,pswd,char2Check);
if (pswd.length() < length) {
if (pswd.length() == 0) {
if (char2Check == 'z') {
return pswd;
}
if (char2Check < 'z') {
char2Check++;
pswd += char2Check;
return findPassword(p, length, pswd, char2Check);
}
}
else {
if (char2Check == 'z') {
return pswd.substring(0, pswd.length() - 1);
}
if (char2Check < 'z') {
pswd = pswd.substring(0, pswd.length() - 1);
char2Check++;
pswd += char2Check;
return findPassword(p, length, pswd, char2Check);
}
}
}
}
if (pswd.length() == length) {
System.out.println(pswd);
if (p.isPassword(pswd)) {
return pswd;
}
if (char2Check < 'z') {
pswd = pswd.substring(0, pswd.length() - 1);
char2Check++;
pswd+= char2Check;
return findPassword(p,length,pswd,char2Check);
}
if (char2Check == 'z'){
return pswd.substring(0, pswd.length() - 1);
}
}
return pswd;
}

问题是:

如果第一个字符是“r”,它不会检查后面的 a、b 或 c,它会直接转到 s、t、u...

还有一些问题,但是一旦这个问题消失了,我想剩下的就会更容易解决..

这里是输出的粘贴: http://pastebin.com/CK9AyKUi

希望有人能帮助我:)

最佳答案

您为一些本应很简单的事情花了很多功夫:生成所有长度为 n 且仅包含 a-z 字符的字符串。

关于性能的说明:当您想要执行大量追加和删除字符时,请使用StringBuilder而不是String。字符串是不可变的,因此它们会在代码中一次又一次地复制。

现在,关于递归,您只需考虑两件事:您的一般情况是什么?你的停止条件是什么?

这里,停止条件很简单:真实密码和当前尝试的长度相同。如果试用正确,则返回;否则继续递归。第二个停止条件:对当前前缀尝试了所有可能,没有匹配到,则继续递归。

一般情况也很简单:给定当前前缀,尝试附加每个可能的字母 a-z 并添加一级递归。

现在,您可能想用这些线索再试一次(提示:重新开始比尝试修复当前代码更容易)。我的解决方案如下,但您可以提出自己的解决方案:

public static String findPassword(Password p, int length) {
return findPassword(p,length, new StringBuilder());
}

public static String findPassword(Password password, int length, StringBuilder str) {
// Stop condition, password and trial have same length
if (length == str.length()) {
if (password.isPassword(str.toString())) {
return str.toString();
} else {
return "";
}
}

String s;

for (char c = 'a'; c <= 'z'; c++) {
// Add a new character to the given prefix
str.append(c);
// Try to find a password for the new prefix
s = findPassword(password, length, str);
if (!s.equals("")) {
return s;
}
// Didn't work out, remove the character
str.deleteCharAt(str.length()-1);
}
// All chars have been tried without success, go up one level
return "";
}

关于java - 暴力破解java递归密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37629135/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com