ASCII Vigenere Chiffre nicht entschlüsseln

Mein Vigenere-Chiffre-Programm hat alle auf zwei Listen heruntergekommen. Eine Liste von ASCII-Nummern, die die Zeichen der zu verschlüsselnden / verschlüsselten Nachricht darstellen und die andere eine Liste von ASCII-Nummern des Schlüssels, die zur Entschlüsselung / Verschlüsselung der Nachricht verwendet werden soll.

Zur Verschlüsselung:

encryption = [((x + y) % 26) + ord('A') if x < 128 else x for x, y in zip(msglist, keylist)] 

Zur Entschlüsselung:

 encryption = [((x - y) % 26) + ord('A') if x < 128 else x for x, y in zip(msglist, keylist)] 

Wenn ich 'Python' mit dem Schlüssel 'love' eingeben, um zu verschlüsseln bekomme ich:

 GYAXLN 

Leider, wenn ich versuche zu entschlüsseln 'GYAXLN' mit dem gleichen Schlüssel bekomme ich:

 PEZNUT 

Was ist nicht das, was es sein sollte. Ich glaube, es ist etwas falsch mit meiner Mathematik, aber ich kann es einfach nicht ganz richtig und bis jetzt habe ich versucht, verschiedene Zahlen zu sehen, was funktioniert (ich bin nicht das Beste bei Mathe). Was fehlt mir hier Kann man das nicht alles in einem Listenverständnis machen?

    One Solution collect form web for “ASCII Vigenere Chiffre nicht entschlüsseln”

    Das Problem ist in der Anweisung (x - y) % 26 weil mod einer Zahl von 0 bis m-1 definiert ist, im obigen Fall 0 bis 25, aber während du dich subtrahierst, bekommst du negative Zahlen, also um das Richtige zu bekommen Ergebnis Sie sollten dies tun (x - y + 26) % 26 . Wenn der negative Wert, den wir durch (xy) niedriger als "-m" im obigen Fall niedriger als -26 ist, dann ist das Nein immer noch negativ, dann musst du es positiv machen, hier ist der Pseudocode dafür:

     val = (x - y) % 26 while(val < 0) val += 26 val = val % 26 
    Python ist die beste Programmiersprache der Welt.