DM programme CHiffre de Vigenère

DM programme CHiffre de Vigenère - Python - Programmation

Marsh Posté le 27-11-2016 à 19:33:27    

Bonjour,  
Alors voilà je dois faire un programme sur le Chiffre de [/contents/217-le-chiffrement-de-vigenere Vigenère] sur Python. Il doit être très simple car je suis une très grande débutante (c'est pour l'ISN) et je ne m'y connais pas en programmation. Il doit aussi coder seulement les lettres minuscules.
J'ai fait le programme mais je n'arrive pas à comprendre mes erreurs car il ne fonctionne pas.  
J'en ai fait plusieurs différents de programme et dans mon ancienne version il fonctionnait seulement si le nombre de caractères de ma clé était supérieure ou égale au nombre de caractères de mon message à coder ( en effet la clé ne se répétait pas ). Je l'ai donc modifié et ce petit problème est résolu sauf que maintenant il ne code pas du tout selon Vigenère...
 
Voilà mon programme:
t=input("Saisir le message" )
c=input("Donner la clé" )
C=len(c)
T=len(t)
for i in range (0,T):
      w=ord(t[i])
      for k in range (0,C):
            x=ord(c[k])
      y=(w+x)-ord('a')
      if y>122:
         y=y-26
      z=chr(y)
      print(z)
 
Si quelqu'un pourrait m'aider svp, seulement en essayant de m'expliquer ce qui ne va pas. Bien sûr je ne demande pas qu'on fasse mon travail mais seulement un petit peu d'aide ou quelque chose qui pourrait m'aider à trouver seule.
Merci d'avance

Reply

Marsh Posté le 27-11-2016 à 19:33:27   

Reply

Marsh Posté le 28-11-2016 à 00:18:37    

Le problème vient de ton "for k ...".
En effet tu vas boucler sur tout les lettres de la clé à chaque fois et donc X prendra toujours la valeur de la dernière lettre de la clé.

 

Il te faut y remplacer ce for qui ne fait pas ce que tu penses par un index que tu initialises à 0 avant la boucle "for i ..." Et que tu incrémentes modulo C à chaque iteration.


Message édité par h3bus le 28-11-2016 à 00:20:48

---------------
sheep++
Reply

Marsh Posté le 28-11-2016 à 06:40:14    

Merci beaucoup pour votre réponse, je vais essayer de modifier ça !
Sinon dans l'idée avec deux boucles "for" je peux pas réussir à le faire ? Car il me semblait que mon prof nous avait conseillé de faire ça, sauf que je n'ai pas réussi...

Reply

Marsh Posté le 28-11-2016 à 07:42:15    

C'est possible d'utiliser deux boucles for en rusant, mais mon avis est que c'est une très mauvaise idée dans ce cas précis.
Une seule boucle for sur l chaîne de caractères et un index qui boucle sur la clé c'est tout ce dont tu as besoin.

 

À noter que tu peux itérer sur une chaine de caractère directement en python:

Code :
  1. for car in c:
  2.    // Do stuff with car


Message édité par h3bus le 28-11-2016 à 07:58:30

---------------
sheep++
Reply

Marsh Posté le 28-11-2016 à 14:27:39    

Ah d'accord merci mais je sais pas trop comment faire car on ne l'a pas vu mais je vais y réfléchir.
 
C'est bien ça, il faut que j'essaie merci !

Reply

Marsh Posté le 28-11-2016 à 15:54:26    

Je l'ai refait :
t=input("Saisir le message" )  
c=input("Donner la clé" )  
C=len(c)  
T=len(t)
l=0
for i in range (0,T):  
      w=ord(t[i])  
       x=ord(c[l])  
      y=(w+x)-ord('a')  
      if y>122:  
         y=y-26  
      z=chr(y)
      l=l+1
      if l==C:
          l=0
      print(z)
 
Est-ce mieux ?

Reply

Marsh Posté le 28-11-2016 à 18:33:04    

Oui c'est mieux.
 
Une version un peu plus lisible:

Code :
  1. import os
  2. str_plain = input("Chaîne à encoder: " )
  3. key = input("Clé: " )
  4. key_index = 0
  5. str_encoded = ""
  6. // Boucle sur les caractères d'entrée
  7. for char in str_plain:
  8.     // encode
  9.     char_encode = ord(char)
  10.     char_encode += ord(key[key_index]) - ord('a')
  11.     if char_encode > ord('z'):
  12.         char_encode -= ord('z') - ord('a')
  13.     // On stock le caractère encodé
  14.     str_encoded += str(chr(char_encode))
  15.    
  16.     // On passe au caractère de la clé suivant
  17.     key_index += 1
  18.     if key_index >= len(key):
  19.         key_index = 0
  20. print(str_encoded)


 
Ça ne fonctionne que si tous les caractères entrés sont en minuscule et sans accents par contre.


---------------
sheep++
Reply

Marsh Posté le 28-11-2016 à 18:38:24    

Oh merci beaucoup !! C'est très gentil pour votre aide.
Et oui en effet il faut que ça marche pour les lettres minuscules et sans accents.

Reply

Marsh Posté le 08-11-2019 à 15:43:53    

Bonjour comment on peut decrypter ce code en python alors?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed