Python de chiffrement de vigenere d'aller plus loin que nécessaire?
Je suis d'essayer de créer le chiffrement de vigenere en python et il semble y avoir un problème. Voici mon code de cryptage:
def encryption():
plaintext=input("Please enter the message you wish to encode.")
#This allows the user to enter the message they wish to encrypt.
keyword=input("Please enter your keyword, preferably shorter than the plaintext.")
#This allows the user to enter a keyword.
encoded=""
#This creates a string for the user to input the encrypted message to.
while len(keyword)<len(plaintext):
#This begins a while loop based on the fact that the length of the keyword is shorter than the length of the plaintext.
keyword+=keyword
#This repeats the keyword.
if len(keyword)>len(plaintext):
#This sees if the string length of the keyword is now longer than the string length of the plaintext.
newkey=keyword[:len(plaintext)]
#This cuts the string length of the keyword
for c in range(len(plaintext)):
char=ord(plaintext[c])
temp=ord(keyword[c])
newchar=char+temp
if newchar>ord("Z"):
newchar-=26
newnewchar=chr(newchar)
encoded+=newnewchar
print(encoded)
Je n'arrive pas à trouver le problème avec lui, mais quand je suis entrer dans le texte "bonjour" et le mot "salut" elle avec les symboles suivants: ¶º»½. Je pense que l'ajout de la boucle for peut être aller trop loin.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de comprendre l'ord() fonction chr() est l'inverse de l'ord()
Si vous n'utilisez pas de caractères Unicode, vous pouvez utiliser un alphabet chaîne
Je ne me contenterai pas de résoudre le problème pour vous car il y a beaucoup d'autres choses à améliorer ici !
Mettre de l'espace autour des opérateurs:
a=b
devrait êtrea = b
, même avec+
,-
, etc.J'ai trouver de mieux utiliser la fonction params que
input
. Vous pouvez toujours avoir une deuxième fonction pour obtenir l'entrée et chiffrer l'entrée:Je vous laisse écrire la fonction auxiliaire.
J', et de plus, l'habitude de mettre des commentaires sur la ligne ci-dessus le code correspondant. Aussi, pas besoin d'écrire
This
tous les temps, et de l'impératif est généralement préféré.Maintenant, nous allons jeter un oeil à votre
while
boucle. La condition estlen(keyword) < len(plaintext)
, à l'intérieur de vous vérifiezlen(keyword) > len(plaintext)
. Quand cela peut-il arriver ? Seulement au cours de la dernière itération. Ainsi, passer le code de la boucle.Aussi, ce que vous faites à l'intérieur de la
if
n'a pas besoin d'unif
:any_string[:len(any_string) + n] == any_string
(n
positifint
).De Plus, vous n'utilisez jamais
newkey
!Nous pouvons simplifier la boucle pour:
Qui est équivalent à:
Noter que les deux échouent lorsque
len(keyword) == 0
.Maintenant à la
for
boucle:Vous pouvez utiliser
zip
, comme polku vous a montré, mais je vais supposer que c'est trop compliqué pour l'instant et garder lerange
.Vous pouvez également utiliser l'alphabet, mais simple arithmétique peut faire l'affaire:
alphabet.index(x) == ord(x) - ord('a')
, si dans votre code:Si nous ignorons les lettres majuscules, nous pouvons substituer
Enfin:
alphabet[i] == ord(i + ord('a'))
.Voici tout cela mis ensemble:
En effet, l'addition va trop loin, parce que
ord
utilise le code ASCII (où A est 65), tandis que de Vigenère avait Un dans la première position. Vous pourriez soustraireord('A')
. Le code suppose également que tous les caractères sont en majuscules. Voici une variante qui utilise un peu de Python à la bibliothèque de fonctions pour effectuer la tâche.Une plus complète de la variante pourrait ne consomment clé pour les lettres, mais ce sera très bien si vos chaînes ne contenir que des lettres. La raison j'ai collé les lettres ASCII est parce que les paramètres régionaux spécifiques alphabets pourrait ne pas avoir l'intention de la commande, ni un ensemble correspondant de majuscules et les minuscules (par exemple, le ß allemand). Il est également tout à fait possible de traduire la clé dans une liste de tables de traduction qu'une seule fois.