2017-06-10 5 views
2

Ich schreibe ein Python-Programm zum Verschlüsseln und Entschlüsseln einer benutzerdefinierten Zeichenfolge. Dies wird nicht für etwas Ernsthaftes verwendet werden, es ist nur zum Spaß. Der Verschlüsseler scheint gut zu funktionieren, aber hier ist es, der Verschlüssler. Das Programm schreibt alles in eine Datei. Wie im folgenden Code zu sehen ist, durchläuft das Programm ASCII-Zeichen, wenn der Schlüssel (der vom Benutzer definiert wird) über 127 steht.Python 3.4 Verschlüsseler und Decrypter funktioniert nicht

Mein Problem ist, dass ich beim Entschlüsseln seltsame Zeichen bekomme. Es schlägt fehl, wenn eine Taste über 229.

Encrypter mit:

temp_key = 9999 
message = "Hello" 
result = "" 
for char in message: 
    ecry_char_int = ord(char) - temp_key 
    while ecry_char_int < 0: 
       temp_key -= 128 
       ecry_char_int = 128 - temp_key 
    result += chr(ecry_char_int) 
print(result) 

Decrypter:

result2 = "" 
encoded = result 
ekey = 9999 
for char in encoded: 
    decr_char_int = ord(char) + ekey 
    while decr_char_int > 127: 
     ekey -= 128 
     decr_char_int = ekey 
    result2 += chr(decr_char_int) 
print(result2) 

Zum Beispiel "Hello" mit dem Schlüssel 9999 Verschlüsselung; Ich bekomme die verschlüsselte Zeichenfolge "qV]]`". Entschlüsseln String "qV]]`" mit Schlüssel 9999 ich dieses:

'\x0fello' 

Was ich versuche, dies herauszufinden ist, wie soll ich von stoppen geschieht, da es mit geschieht dies nur das erste Zeichen ist.

Hinweis: Ich möchte/kann keine zusätzlichen Module (z. B. Kryptographie) installieren, da dies hauptsächlich auf meinem Schulcomputer erfolgt.

+0

Könnten Sie uns bitte ein [minimales, vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) zur Verfügung stellen. – Hami

+0

@MartijnPieters, Sie haben den seltsamen 15-stelligen ASCII-Code aus der Frage entfernt und können ihn nicht erneut hinzufügen, da eine Bearbeitung mindestens 6 Zeichen lang sein muss. – Hami

+0

@Hami: nichts wurde entfernt, nur hinzugefügt; siehe den "Side-by-Side Markdown" Diff unter https://stackoverflow.com/posts/44477022/revisions –

Antwort

0

Das ist, weil Sie wirklich nichts verschlüsseln - nach dem ersten Zeichen wird Ihr Algorithmus in eine einfache Caesar-Chiffre, wobei das erste Zeichen immer als der Wert von 128 - temp_key % 128 für alle Bedingungen verschlüsselt wird, wo temp_key > ord(first_char).

Das Problem ist, dass nach den ersten ecry_char_int = ord(char) - temp_key, Sie nicht Ihren aktuellen Zeichen für etwas unter Berücksichtigung, wenn sie kleiner als der Schlüssel sein geschehen (und das ist der Fall bei ord('H')72 zu sein, während der Schlüssel sind 9999) - Sie gehen in eine Schleife, in der Sie nacheinander 128 von der temp_key und 128 - temp_key als ecry_char_int abziehen. Schließlich wird temp_key klein genug sein, um eine positive Zahl zu erzeugen, wenn sie von 128 subtrahiert wird. An diesem Punkt wird diese Zahl als Ihr "verschlüsseltes" Zeichen festgelegt. Also, Sie gingen im Wesentlichen eine lange, schlaue Weise, um das erste Zeichen auf den Wert 128 - temp_key % 128 (was 113, BTW. Und deshalb ist das erste Zeichen von Ihrer Funktion wird immer q für so ziemlich alle Schlüssel >256).

Aber das ist nicht alles - da haben Sie jetzt den Wert Ihres temp_key-temp_key % 128 des Originals (so 15 für Ihren 9999 key) geändert, jetzt alle daraus folgenden Zeichen, die durch die Menge, ascii nach links verschoben wird e resultierende zu werden V (chr(ord("e") - 15)) usw. Also - Sie haben sich eine Caesar cipher.

Ihre Entschlüsselungsfunktion funktioniert in der umgekehrten Richtung ziemlich ähnlich, das erste Zeichen wird immer auf die gleiche Art und Weise konstruiert und der Rest der Zeichen wird um die gleiche Position nach rechts verschoben.

Tun Sie sich einen Gefallen und verwenden Sie eine geeignete Verschlüsselung, wenn Sie eine Verschlüsselung benötigen. Hier ist ein simple example.