From 06f72f3cfefcc37d884f8a8011c451a6cbf85799 Mon Sep 17 00:00:00 2001 From: Samuel Zielke Date: Thu, 18 Apr 2024 14:34:39 +0200 Subject: [PATCH] Final Version with Types --- Saal.pdf | Bin 0 -> 6935 bytes main.py | 111 ++++++++++++++++++++++++++++++++++++++++++++++--------- test.py | 16 ++++++-- w999.pdf | Bin 0 -> 6633 bytes 4 files changed, 105 insertions(+), 22 deletions(-) create mode 100644 Saal.pdf create mode 100644 w999.pdf diff --git a/Saal.pdf b/Saal.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed3abb7dfda366a00e7ff230b9d625f04b725299 GIT binary patch literal 6935 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 IX`}`DA7iyiwg3PC literal 0 HcmV?d00001 diff --git a/main.py b/main.py index d238224..f92012b 100644 --- a/main.py +++ b/main.py @@ -1,24 +1,53 @@ import string, itertools from progress.bar import Bar +from pypdf import PdfReader, PdfWriter -# buchstaben = string.ascii_uppercase + string.ascii_lowercase + string.digits -anfangsbuchstaben = ('S', 's', 'K', 'k', 'A', 'a', 'P', 'p', 'B', 'b', 'M', 'm', 'D', 'd', 'E', 'e', 'I', 'i', 'W', 'w') -buchstaben = ('e', 'n', 'i', 'r', 's', 't', 'a', 'd', 'h', 'u', 'l', 'c', 'e', 'g', 'm', 'o', 'b', 'w', 'f', 'k', 'z') -ziffern = tuple(string.digits) -test_passwort = "Saal" +# SETTINGS +CHOICES_PER_SECOND_OFFLINE = 200000 +CHOICES_PER_SECOND_PDF = 552 + +# SETTING OF SOFTWARE - DONT EDIT LINE_UP = '\033[1A' LINE_CLEAR = '\x1b[2K' -DEBUG = False -def get_time_forMax(MaxChoices): - # maxSek = int(MaxChoices / 309598) - maxSek = int(MaxChoices / 200000) +# Buschstaben listen +anfangsbuchstaben_lower = ('s', 'k', 'a', 'p', 'b', 'm', 'd', 'e', 'i', 'w') +anfangsbuchstaben_upper = ('S', 'K', 'A', 'P', 'B', 'M', 'D', 'E', 'I', 'W') +anfangsbuchstaben_comp = ('S', 's', 'K', 'k', 'A', 'a', 'P', 'p', 'B', 'b', 'M', 'm', 'D', 'd', 'E', 'e', 'I', 'i', 'W', 'w') + +seltene_anfangsbuchstaben_lower = ('c', 'f', 'g', 'h', 'j', 'l', 'n', 'o', 'q', 'r', 't', 'u', 'v', 'x', 'y', 'z') +seltene_anfangsbuchstaben_upper = ('C', 'F', 'G', 'H', 'J', 'L', 'N', 'O', 'Q', 'R', 'T', 'U', 'V', 'X', 'Y', 'Z') +seltene_anfangsbuchstaben_comp = ('C', 'c', 'F', 'f', 'G', 'g', 'H', 'h', 'J', 'j', 'L', 'l', 'N', 'n', 'O', 'o', 'Q', 'q', 'R', 'r', 'T', 't', 'U', 'u', 'V', 'v', 'X', 'x', 'Y', 'y', 'Z', 'z') + +buchstaben_lower = ('e', 'n', 'i', 'r', 's', 't', 'a', 'd', 'h', 'u', 'l', 'c', 'g', 'm', 'o', 'b', 'w', 'f', 'k', 'z') +buchstaben_upper = ('E', 'N', 'I', 'R', 'S', 'T', 'A', 'D', 'H', 'U', 'L', 'C', 'G', 'M', 'O', 'B', 'W', 'F', 'K', 'Z') +buchstaben_comp = ('E', 'e', 'N', 'n', 'I', 'i', 'R', 'r', 'S', 's', 'T', 't', 'A', 'a', 'D', 'd', 'H', 'h', 'U', 'u', 'L', 'l', 'C', 'c', 'G', 'g', 'M', 'm', 'O', 'o', 'B', 'b', 'W', 'w', 'F', 'f', 'K', 'k', 'Z', 'z') + +seltene_buchstaben_lower = ('j', 'p', 'q', 'v', 'x', 'y') +seltene_buchstaben_upper = ('J', 'P', 'Q', 'V', 'X', 'Y') +seltene_buchstaben_comp = ('J', 'j', 'P', 'p', 'Q', 'q', 'V', 'v', 'X', 'x', 'Y', 'y') + +sonderzeichen = ['!', '#', '$', '%', '&', '*', '+', ',', '-', '.', '/', ':', ';', '?', '@', '_'] +seltene_sonderzeichen = ['"', "'", '(', ')', '<', '=', '>', '[', '\\', ']', '^', '`', '{', '|', '}', '~', ' '] + +buchstaben = buchstaben_lower +anfangsbuchstaben = anfangsbuchstaben_comp + + +ziffern = tuple(string.digits) + + +def get_time_forMax(MaxChoices, choices_per_second): + maxSek = int(MaxChoices / choices_per_second) max = int(maxSek/60) if max > 60: - max = int(max/60) + max = float(max/60).__round__(1) if max > 24: - max = int(max/24) + max = float(max/24).__round__(1) + if max > 365: + max = float(max/365).__round__(1) + return f"{max} Jahre" return f"{max} Days" return f"{max}h" else: @@ -29,28 +58,74 @@ def get_choices(letters: list) -> int: choices = 1 maxZeichen = len(buchstaben) + len(ziffern) for i in letters: - choices += pow(maxZeichen, i) + choices += pow(maxZeichen, i-1) return choices * len(anfangsbuchstaben) -def crack_password(letter_range: range) -> None: +def crack_password(letter_range: range, test_passwort: str, debugmode: bool) -> None: num_versuch = 0 maxChoices = get_choices(list(letter_range)) print("Möglichkeiten: {:,}".format(maxChoices)) - print(f"MaxTime/100% Power: {get_time_forMax(maxChoices)}") + print(f"MaxTime/100% Power: {get_time_forMax(maxChoices, CHOICES_PER_SECOND_OFFLINE)}") for num in letter_range: for anfang in anfangsbuchstaben: for versuch in itertools.product(buchstaben+ziffern, repeat=num-1): versuch = "".join(versuch) versuch = anfang + versuch - print("Aktuell: {:,}".format(num_versuch), f" Versuch: {versuch}") if DEBUG else None - print(LINE_UP, end=LINE_CLEAR) if DEBUG else None + print("Aktuell: {:,}".format(num_versuch), f" Versuch: {versuch}") if debugmode else None + print(LINE_UP, end=LINE_CLEAR) if debugmode else None num_versuch += 1 if versuch == test_passwort: print(f"\n\nRichtiges Passwort lautet: {versuch}","\nNötige Versuche: {:,}".format(num_versuch)) return + +def crack_pdf_password(letter_range: range, pdf_path: str, debugmode: bool) -> None: + num_versuch = 0 + reader = PdfReader(pdf_path) + writer = PdfWriter() + maxChoices = get_choices(list(letter_range)) + print("Möglichkeiten: {:,}".format(maxChoices)) + print(f"MaxTime/100% Power: {get_time_forMax(maxChoices, CHOICES_PER_SECOND_PDF)}") + for num in letter_range: + for anfang in anfangsbuchstaben: + for versuch in itertools.product(buchstaben+ziffern, repeat=num-1): + versuch = "".join(versuch) + versuch = anfang + versuch + print("Aktuell: {:,}".format(num_versuch), f" Versuch: {versuch}") if debugmode else None + print(LINE_UP, end=LINE_CLEAR) if debugmode else None + if reader.decrypt(versuch) > 0: + print(f"\n\nRichtiges Passwort lautet: {versuch}","\nNötige Versuche: {:,}".format(num_versuch)) + return + num_versuch += 1 -minChoice = input("please enter choices: ") -crack_password(range(int(minChoice), int(minChoice)+1)) \ No newline at end of file +def start_script(): + print(LINE_UP, end=LINE_CLEAR) + input_type = input("please enter type [1]password-crack-test [2]pdf-file [3]password-safety: ") + if input_type == "1": + print(LINE_UP, end=LINE_CLEAR) + testPasswort = input("please enter passwort to test [a-]: ") + minChoice = len(testPasswort) + debugmode = True if input("\nDEBUG: [1]Yes or [empty]No: ") == "1" else False + crack_password(range(int(minChoice), int(minChoice)+1), testPasswort, debugmode) + elif input_type == "2": + print(LINE_UP, end=LINE_CLEAR) + minChoice = input("please enter choices: ") + print(LINE_UP, end=LINE_CLEAR) + # pdf_path = input("please enter path of pdf: ") + pdf_path = "./w999.pdf" + crack_pdf_password(range(int(minChoice), int(minChoice)+1), pdf_path, False) + elif input_type == "3": + print(LINE_UP, end=LINE_CLEAR) + testPasswort = input("please enter passwort to test: ") + print(LINE_UP, end=LINE_CLEAR) + maxChoices = get_choices([len(testPasswort)]) + print(f"Das Passwort >{testPasswort}< hat folgende Sicherheit:") + print("Möglichkeiten: {:,}".format(maxChoices)) + print(f"MaxTime/100% Power: {get_time_forMax(maxChoices)}") + else: + return False + +while start_script(): + None \ No newline at end of file diff --git a/test.py b/test.py index 648cc49..fa7ac43 100644 --- a/test.py +++ b/test.py @@ -1,6 +1,14 @@ import string -buchstaben = ['e', 'n', 'i', 'r', 's', 't', 'a', 'd', 'h', 'u', 'l', 'c', 'e', 'g', 'm', 'o', 'b', 'w', 'f', 'k', 'z'] -ziffern = string.digits -gesamt = len(buchstaben) + len(ziffern) -print(gesamt) \ No newline at end of file +# buchstaben = ['e', 'n', 'i', 'r', 's', 't', 'a', 'd', 'h', 'u', 'l', 'c', 'e', 'g', 'm', 'o', 'b', 'w', 'f', 'k', 'z'] +# ziffern = string.digits +# gesamt = len(buchstaben) + len(ziffern) +# print(gesamt) + +seltene_anfangsbuchstaben_upper = ('J', 'P', 'Q', 'V', 'X', 'Y') + +new_list = [] +for i in seltene_anfangsbuchstaben_upper: + new_list.append(i) + new_list.append(i.lower()) +print(new_list) \ No newline at end of file diff --git a/w999.pdf b/w999.pdf new file mode 100644 index 0000000000000000000000000000000000000000..26eb185fe046db13cdb7905bfb38fbf690e30135 GIT binary patch literal 6633 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 literal 0 HcmV?d00001