Geocrack

enigma_with_fool_protection

Jul 21st, 2022 (edited)
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.30 KB | None | 0 0
  1.  
  2. def default():
  3.     # 2 mal das Alphabet in eine Liste packen
  4.     alphabet = [[chr(i) for i in range(65, 91)], [chr(i)
  5.                                                   for i in range(65, 91)]]
  6.     # die Grundeinstellungen der Rotoren berrechnen
  7.     rotor_1, rotor_2 = rotor_update(alphabet) # die Grundeinstellungen der Rotoren werden festgelegt
  8.     return alphabet, rotor_1, rotor_2 # die Grundeinstellungen werden zurückgegeben
  9.  
  10.  
  11. def rotor_update(alphabet):
  12.     rotor_1 = [alphabet[0][7],alphabet[0][2],alphabet[0][1],alphabet[0][6],alphabet[0][10],alphabet[0][8],alphabet[0][3],alphabet[0][0],alphabet[0][5],alphabet[0][11],alphabet[0][4],alphabet[0][9],alphabet[0][15],alphabet[0][20],alphabet[0][17],alphabet[0][12],alphabet[0][18],alphabet[0][14],alphabet[0][16],alphabet[0][24],alphabet[0][13],alphabet[0][25],alphabet[0][23],alphabet[0][22],alphabet[0][19],alphabet[0][21]]
  13.     rotor_2 = [alphabet[1][5],alphabet[1][3],alphabet[1][8],alphabet[1][1],alphabet[1][6],alphabet[1][0],alphabet[1][4],alphabet[1][9],alphabet[1][2],alphabet[1][7],alphabet[1][12],alphabet[1][14],alphabet[1][10],alphabet[1][16],alphabet[1][11],alphabet[1][23],alphabet[1][13],alphabet[1][18],alphabet[1][17],alphabet[1][24],alphabet[1][22],alphabet[1][25],alphabet[1][20],alphabet[1][15],alphabet[1][19],alphabet[1][21]]    
  14.     return rotor_1, rotor_2 # die Positionen der Rotoren werden zurückgegeben
  15. # Grundeinstellungen der Rotoren
  16.  
  17. def right_input(input,additional): # prüft, ob die Eingabe korrekt ist
  18.     if len(input) == 0: # wenn die Eingabe leer ist
  19.         print("-"*50)
  20.         print("You have to enter a letter!")
  21.         print("-"*50)
  22.         return False
  23.     if len(input) > 1 and additional: # wenn die Eingabe mehr als ein Zeichen enthält
  24.         print("-"*50)
  25.         print("Please enter only 1 letter!")
  26.         print("-"*50)
  27.         return False
  28.     if not input.isalpha(): # wenn die Eingabe kein Buchstabe ist
  29.         print("-"*50)
  30.         print("Please enter a valid letter!")
  31.         print("-"*50)
  32.         return False
  33.  
  34.     return True
  35.  
  36.  
  37. def rotor_position(alphabet):  # die Positionen der Rotoren werden festgelegt
  38.     for i in range(2):
  39.         position = input(
  40.             f"Enter the position of the {i+1}. rotor (A-Z): ").upper()
  41.         if not right_input(position,additional=True):
  42.             # wird auf Grundeinstellungen zurückgesetzt
  43.             alphabet, rotor_1, rotor_2 = default()
  44.             return rotor_position(alphabet)
  45.         movement = (ord(position) + 65)
  46.         for _ in range(movement):  # das Alphabet wird um n Positionen nach links verschoben
  47.             # das Alphabet um eine Stelle nach links schieben
  48.             alphabet[i].append(alphabet[i][0])
  49.             alphabet[i].pop(0)
  50.     return alphabet
  51.  
  52.  
  53. def encrypt_enigma(alphabet, rotor_1, rotor_2, message):
  54.     encrypted_message = ""
  55.     rotor_1, rotor_2 = rotor_update(alphabet)
  56.     for item in message:  # der Text wird verschlüsselt
  57.         if item == " ": # wenn es ein Leerzeichen ist, wird es nicht verschlüsselt
  58.             encrypted_message += " "
  59.             continue
  60.  
  61.         for a in range(len(alphabet[0])):
  62.             if item == alphabet[0][a]:
  63.                 temp = rotor_1[a]
  64.                 break
  65.  
  66.         for b in range(len(alphabet[1])):
  67.             if temp == alphabet[1][b]:
  68.                 encrypted_message += rotor_2[b]
  69.                 break
  70.  
  71.         for x in range(2):  # das Alphabet um eine Stelle nach links schieben
  72.             alphabet[x].append(alphabet[x][0])
  73.             alphabet[x].pop(0)
  74.         rotor_1, rotor_2 = rotor_update(alphabet)
  75.  
  76.     # die verschlüsselte Nachricht wird ausgegeben
  77.     print(f"Your encrypted_message is: \"{encrypted_message}\"")
  78.     print("-"*50)
  79.  
  80.  
  81. def decrypt_enigma(alphabet, rotor_1, rotor_2, message):
  82.     decrypted_message = ""
  83.     rotor_1, rotor_2 = rotor_update(alphabet)
  84.  
  85.     for item in message:  # der Text wird entschlüsselt
  86.         if item == " ":
  87.             decrypted_message += " "
  88.             continue
  89.  
  90.         for a in range(len(rotor_1)):
  91.             if item == alphabet[1][a]:
  92.                 temp = rotor_2[a]
  93.                 break
  94.  
  95.         for b in range(len(rotor_2)):
  96.             if temp == alphabet[0][b]:
  97.                 decrypted_message += rotor_1[b]
  98.                 break
  99.  
  100.         for x in range(2):  # das Alphabet um eine Stelle nach links schieben
  101.             alphabet[x].append(alphabet[x][0])
  102.             alphabet[x].pop(0)
  103.             rotor_1, rotor_2 = rotor_update(alphabet)
  104.  
  105.     # die entschlüsselte Nachricht wird ausgegeben
  106.     print(f"Your decrypted_message is: \"{decrypted_message}\"")
  107.     print("-"*50)
  108.  
  109.  
  110. def main():  # die Hauptfunktion
  111.     while True:  # die Abfrage, ob das Programm beendet werden soll
  112.         # die Grundeinstellungen werden festgelegt
  113.         alphabet, rotor_1, rotor_2 = default()
  114.         # die Positionen der Rotoren werden festgelegt
  115.         alphabet = rotor_position(alphabet)
  116.         choice = input(
  117.             "Do you want to encrypt, decript or leave? (E/D/X): ").upper()  # die Abfrage, was geschehen soll
  118.         if not right_input(choice,additional=True):  # die Abfrage, ob die Eingabe korrekt ist
  119.             continue
  120.  
  121.         if choice == "E":  # wenn die Nachricht verschlüsselt werden soll
  122.             print("-"*50)
  123.             print("Encrypting...")
  124.             # die Nachricht wird eingelesen
  125.             message = input("Enter the message: ").upper()
  126.             if not right_input(message,additional=False):
  127.                 continue
  128.             encrypt_enigma(alphabet, rotor_1, rotor_2, message)
  129.         elif choice == "D":  # wenn die Nachricht entschlüsselt werden soll
  130.             print("-"*50)
  131.             print("Decrypt...")
  132.             # die Nachricht wird eingelesen
  133.             message = input("Enter the message: ").upper()
  134.             if not right_input(message,additional=False):
  135.                 continue
  136.             decrypt_enigma(alphabet, rotor_1, rotor_2, message)
  137.         elif choice == "X":  # wenn das Programm beendet werden soll
  138.             print("-"*50)
  139.             print("Goodbye!")
  140.             break
  141.         else: # wenn die Eingabe nicht korrekt ist
  142.             print("-"*50)
  143.             print("Wrong input!")
  144.             print("-"*50)
  145.  
  146.  
  147. if __name__ == "__main__":  # wenn das Programm direkt ausgeführt wird
  148.     main()
  149.  
Advertisement
Add Comment
Please, Sign In to add comment