2017-09-08 4 views
-1

J'ai essayé de faire un César Cipher pour mon tout premier projet Python à l'école. J'ai en quelque sorte copié le code d'une vidéo YouTube pour le segment de chiffrement principal, mais quand je crypte le message d'un utilisateur, il fait un chiffre aléatoire au lieu d'une clé qu'il introduit dans le shell. C'est le code:Caesar Cipher ne fait pas tourner les lettres correctement? (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() 

Quelqu'un pourrait m'aider à résoudre ce problème s'il vous plaît. Aussi s'il vous plaît ne le rendez pas très complexe puisque je suis un débutant chez Python et que je ne connais pas grand chose du tout.

MERCI!

+0

Jetez un coup d'œil sur [ask] – pvg

+0

Vous ne passez pas votre 'key' ou' message' à la méthode 'encrypt'. – KDecker

+0

La méthode 'encrypt' a deux arguments. – GAVD

Répondre

0

Le problème est que vous entrelaçant les lettres majuscules et minuscules dans votre jeu de caractères. Ainsi, lorsque vous tentez de remplacer un personnage par un personnage, par exemple, 5 caractères devant vous, vous renversez l'affaire et déplacez 2-3 caractères devant (selon le cas avec lequel vous avez commencé). Il y a de meilleures façons d'y parvenir, mais il se révèle un simple changement peut rendre votre travail de code comme prévu:

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

Si vous doublez la clé lorsque vous trouvez votre personnage de remplacement, alors vous serez en sautant à la fois les lettres majuscules et minuscules dans le jeu de caractères. Et puisque votre clé doublée sera toujours égale, vous finirez avec le même cas que vous avez commencé avec. Vous devrez également modifier le modulo correspondant à 52 comme indiqué par R.Sharp.

+0

Merci, cela a résolu mon problème !!! Et merci à tous les autres pour m'avoir aidé !! Je ne savais pas que c'était une solution tellement évidente 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() 

manquant le message, les arguments clés Crypter

+0

oui, désolé. J'ai déjà résolu cela dans une demande préalable. Juste oublié d'ajouter cela. Même après avoir les 2 arguments, cela ne fonctionne pas:/ – Kieran

1

alors que je suis d'accord avec @glibdud, il y a une autre erreur. Vous prenez modulo 26 sur la valeur de la clé + la position dans abc. mais abc est de 52 caractères - afin de pouvoir déchiffrer ce que vous chiffrez, vous devez changer cela pour newPosition = (abc.find(letter) + key) % 52

Si vous voulez faire la chaîne de cryptage plus arbitraire, par exemple d'inclure certains caractères de ponctuation ou d'un chiffre, remplacer 26 ou 52 avec la longueur calculée de la chaîne de chiffrement.

+0

Merci beaucoup pour votre aide !! Je ne savais pas que la réponse était essentiellement en face de moi tout ce temps xd. – Kieran

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

puisque abc a à la fois des majuscules et des minuscules mélangées. une touche (ex: 2) appliquée à un caractère 'C' donnera 'D' au lieu de 'E'.

+0

Merci, dans un commentaire ci-dessus, il dit 'key * 2)% 52' qui fonctionne. donc en ajoutant le '* 2' résolu le problème: D – Kieran