2017-09-08 2 views
-1

Ich habe versucht, einen Caesar Cipher für mein erstes Python-Projekt in der Schule zu machen. Ich habe Code aus einem Youtube-Video für das Hauptverschlüsselungssegment kopiert, aber wenn ich die Nachricht, die ein Benutzer eingibt, verschlüssle, tut es eine zufällige Chiffre anstelle eines Schlüssels, den er in die Shell eingibt. Dies ist der Code:Caesar Cipher rotiert nicht richtig? (Python)

abc = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz' 

def main(): 
    message = input("What's the message to encrypt/decrypt? ") 
    key = int(input("What number would you like for your key value? ")) 
    choice = input("Choose: encrypt or decrypt. ") 
    if choice == "encrypt": 
     encrypt(message, key) 
    elif choice == "decrypt": 
     encrypt(message, key * (-1)) 
    else: 
     print("Bad answer, try again.") 

def encrypt(message, key): 
    cipherText = "" 
    for letter in message: 
     if letter in abc: 
      newPosition = (abc.find(letter) + key) % 26 
      cipherText += abc[newPosition] 
     else: 
      cipherText += letter 
    print(cipherText) 
    return cipherText 

main() 

Könnte jemand mir helfen, dieses Problem zu lösen. Bitte mach es auch nicht sehr komplex, da ich ein Anfänger bei Python bin und nicht viel weiß.

DANKE!

+0

Werfen Sie einen Blick auf [ask] – pvg

+0

Sie geben Ihren 'Schlüssel' oder' Nachricht' nicht an die 'encrypt' Methode weiter. – KDecker

+0

'Verschlüsseln' Methode hat zwei Argumente. – GAVD

Antwort

0

Das Problem ist, dass Sie Groß- und Kleinbuchstaben in Ihrem Zeichensatz sind verflechten. Wenn Sie beispielsweise versuchen, einen Charakter durch ein Zeichen zu ersetzen, sagen wir 5 Zeichen voraus, drehen Sie den Fall um und bewegen 2-3 Zeichen weiter (je nachdem, mit welchem ​​Fall Sie begonnen haben). Es gibt bessere Möglichkeiten, dies zu erreichen, aber es stellt sich heraus, eine einfache Änderung der Code wie erwartet machen:

newPosition = (abc.find(letter) + key * 2) % 52 

Wenn Sie den Schlüssel verdoppeln, wenn Sie Ihren Ersetzungszeichen finden, dann werden Sie beide übersprungen werden die Groß- und Kleinbuchstaben im Zeichensatz. Und da Ihr doppelter Schlüssel immer gerade ist, haben Sie denselben Fall, mit dem Sie begonnen haben. Sie müssen auch den Modulo entsprechend auf 52 ändern, wie von R.Sharp gezeigt.

+0

Vielen Dank, das hat mein Problem gelöst !!! Und danke an alle anderen, dass sie mir geholfen haben !! Ich wusste nicht, dass es so eine offensichtliche Lösung war, haha ​​!!! – Kieran

0
abc = 'AaBbCcDdEeFfGgHhIiJjKKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz' 

def main(): 
    message = input("What's the message to encrypt/decrypt? ") 
    key = int(input("What number would you like for your key value? ")) 
    choice = input("Choose: encrypt or decrypt. ") 
    if choice == "encrypt": 
     encrypt(message, key) 
    elif choice == "decrypt": 
     encrypt(message, key * (-1)) 
    else: 
     print("Bad answer, try again.") 

def encrypt(message, key): 
    cipherText = "" 
    for letter in message: 
     if letter in abc: 
      newPosition = (abc.find(letter) + key) % 26 
      cipherText += abc[newPosition] 
     else: 
      cipherText += letter 
    print(cipherText) 
    return cipherText 

main() 

fehlt die Nachricht, Schlüsselargumente in encrypt

+0

ja, tut mir leid. Das habe ich bereits in einer früheren Anfrage gelöst. Ich habe nur vergessen, das hinzuzufügen. Auch nach den 2 Argumenten funktioniert es nicht:/ – Kieran

1

Während ich @glibdud stimme, gibt es einen weiteren Fehler. Sie nehmen modulo 26 auf Wert des Schlüssels + die Position in abc. aber abc 52 Zeichen lang ist - so in der Lage sein, zu entschlüsseln, was Sie verschlüsseln, müssen Sie das newPosition = (abc.find(letter) + key) % 52

ändern Wenn Sie die Verschlüsselungskette willkürlicher machen wollen, sagen einige Interpunktion oder Zeichen Zeichen enthalten, ersetzen 26 oder 52 mit der berechneten Länge der Verschlüsselungskette.

+0

Vielen Dank für Ihre Hilfe !! Ich wusste nicht, dass die Antwort im Grunde die ganze Zeit vor mir war. – Kieran

0
(abc.find(letter) + key) % 26 

da abc sowohl Groß- als auch Kleinbuchstaben gemischt hat. Ein Schlüssel (z. B. 2), der auf ein Zeichen "C" angewendet wird, führt zu "D" anstelle von "E".

+0

Vielen Dank, in einem Kommentar oben sagt es 'Schlüssel * 2)% 52' was funktioniert. Also, durch Hinzufügen der '* 2' löste das Problem: D – Kieran