Записать пароль в txt файл с простым шифрованием с помощью StringBuilder и PrintWriter (не StringWriter) - PullRequest
0 голосов
/ 11 июля 2020

Итак, прежде чем я объясню свой вопрос, я уже спросил, могу ли я использовать StringWriter для этого кода, однако нам сказали, что мы должны использовать StringBuilder. Текущее состояние инструкций ...

Когда пароли совпадают, с помощью StringBuilder запишите пароль в текстовый файл с именем Lab5.txt, но используйте следующее простое шифрование - запишите значение ASCII для каждого символа, разделенное запятая. Напишите 0 (ноль), чтобы обозначить конец пароля.

У меня есть общее представление о том, как это будет работать, однако я не совсем уверен, где go отсюда, так как я очень не знаком со StringBuilder, и не было много полезных руководств, и большинство сообщений stackoverflow по этому поводу предлагают использовать StringWriter.

Мой текущий код ...

import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.ArrayList;
import java.util.List;
import java.io.PrintWriter;

public class Project5_Part1_Final {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        System.out.print("Please enter password : ");
        String pass = in.nextLine();
        System.out.print("Please re-enter password: ");
        String confirm = in.nextLine();

        List<String> errorList = new ArrayList<String>();

        while (!isValid(pass, confirm, errorList)) {
            System.out.println("The password entered here  is invalid");
            for (String error : errorList) {
                System.out.println(error);
            }

            System.out.print("Please enter password : ");
            pass = in.nextLine();
            System.out.print("Please re-enter password: ");
            confirm = in.nextLine();
        }
        System.out.println("your password is: " + pass);

    }

    public static boolean isValid(String password, String confirm, List<String> errorList) {

        int passLength = password.length();
        int i;

        Pattern specailChar = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
        Pattern digitCase = Pattern.compile("[0-9 ]");
        errorList.clear();

        boolean testing = true;

        if (!password.equals(confirm)) {
            errorList.add("password and confirm password does not match");
            testing = false;
        }
        if (password.length() < 8) {
            errorList.add("Invalid Password - Password must be at least 8 characters");
            testing = false;
        }
        if (!digitCase.matcher(password).find()) {
            errorList.add("Invalid password - Password must have at least 1 number");
            testing = false;
        }
        if (!specailChar.matcher(password).find()) {
            errorList.add("Invalid password - Password must have at least one special character");
            testing = false;
        }

        for (i = 0; i < passLength; i++) {
            char character = password.charAt(i);
            int ascii = (int) character;
            System.out.print(ascii + ",");

            PrintWriter output = new PrintWriter("Lab5.txt");
            StringBuilder sb = new StringBuilder();
            sb.append(ascii);

            output.println(sb.toString());
        }
        System.out.print(" 0  ");       
        return testing;
    }
}

Мое текущее сообщение об ошибке. ..

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
    PrintWriter cannot be resolved to a type
    PrintWriter cannot be resolved to a type

    at Project5_Part1_Final.isValid(Project5_Part1_Final.java:66)
    at Project5_Part1_Final.main(Project5_Part1_Final.java:18)

Я знаю, что мне не хватает некоторых важных разделов кода, однако я не смог найти ни одной публикации или примеров, где StringBuilder и PrintWriter используются вместе, как это, все они либо просто PrintWriter, или PrintWriter и StringWriter. Любая форма помощи будет принята с благодарностью. Спасибо.

1 Ответ

1 голос
/ 11 июля 2020

Ниже рассматривается только шифрование, а не получение или проверка пароля.

Насколько я понимаю ваш вопрос, вам необходимо заменить каждый символ пароля его кодом ASCII, например, вместо A вам нужно число 65 (в десятичной системе). Кроме того, вам необходимо разделить ASCII-код каждой буквы запятой, и, наконец, вам нужно завершить закодированный пароль с помощью di git 0 (ноль).

Приведенный ниже код достигает этого.

String str = "George$Best11";
char[] letters = str.toCharArray();
StringBuilder sb = new StringBuilder();
for (char letter : letters) {
    int code = (int) letter;
    sb.append(code);
    sb.append(',');
}
sb.append(0);
System.out.println(sb);
try (PrintWriter pw = new PrintWriter("Lab5.txt")) {
    pw.printf("%s%n", sb);
}
catch (IOException xIo) {
    xIo.printStackTrace();
}

Пример пароля: George $ Best11 , который соответствует вашим условиям для действительного пароля, т.е.

  • минимум 8 символов
  • минимум один специальный символ ( $ )
  • хотя бы один di git

Я получаю массив символов для строки пароля. Я привел каждый символ к int. Я добавляю int к StringBuilder и сразу после int добавляю запятую. Наконец, после добавления всех букв я добавляю завершающий ноль.

Приведенный выше код отображает следующее:

71,101,111,114,103,101,36,66,101,115,116,49,49,0
...