IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Coder un decrypteur


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut Coder un decrypteur
    Hello, désolé de vous déranger, mais je suis bloqué sur un projet et je n'arrive pas à trouver ce qui ne va pas.
    Je suis en train de coder un décrypteur de texte en python (rien de bien fastidieux, ici c'est du code César, donc un décalage dans l'alphabet, avec une clé, qui désigne de combien de lettres on décale le texte.
    J'ai réussi à rédiger un code qui, pour un texte et une clé donnée, va décrypter le message.
    Je souhaiterais maintenant que le programme teste toutes les clés possibles (entre 1 et 25), et affiche chaque transcriptions associé à la clé qui a permit de l'obtenir.
    Dans l'idée, mon code est fonctionnel, mais toutes les combinaisons s'affichent à chaque fois, s'ajoutant les unes à la suite des autres.
    Voici les deux codes, celui fonctionnel permettant de décrypter si on a la clé, et la tentative que je n'arrive pas à mettre en place.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    liste = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    for x in range(len(liste)):    #Dedouble la liste
        liste.append(liste[x])
     
    message = input('Entrez votre message : ')
    cle = int(input('Entrez votre clef ( entre 1 et 25 ) : '))
     
    def dechiffrage_lettre(lettre,liste,cle):
        for i in range(len(liste)):
            if lettre==' ':       #au cas ou il y a un espace
                return ' '
            elif liste[i]==lettre:          
                    return str(liste[i-cle])            
    message_dechiffre = str()
    for lettre in message:
        message_dechiffre += dechiffrage_lettre(lettre,liste,cle)
    print(message_dechiffre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    liste = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    for x in range(len(liste)):    #Dédouble la liste
        liste.append(liste[x])
     
    message = 'RTSXNJZW' #input('Entrez votre message : ')
     
    def dechiffrage_lettre(lettre,liste,cle):
     
        for i in range(len(liste)):
            if lettre==' ':       
                return ' '
            elif liste[i]==lettre:
                return str(liste[i-cle])
     
    message_dechiffre = str()
     
    cle = 0
     
    for n in range(25):
        cle = cle + 1    
        for lettre in message:
            message_dechiffre += dechiffrage_lettre(lettre,liste,cle)    
        print(cle)
        print(message_dechiffre)
    Merci d'avance pour votre aide !!

    PS: par soucis de simplicité, le mot à décoder est toujours le même, c'est RTSXNJZW, ce qui donne "MONSIEUR", en majuscule, décodé avec une clé = 5.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Citation Envoyé par Popkhorn Voir le message
    Dans l'idée, mon code est fonctionnel, mais toutes les combinaisons s'affichent à chaque fois, s'ajoutant les unes à la suite des autres.
    Il faut "vider" la chaine message_dechiffre = "" pour chaque clé :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for n in range(25):<br>
        cle = cle + 1<br>
        for lettre in message:<br>
            message_dechiffre += dechiffrage_lettre(lettre, liste, cle)<br>
        print(cle, message_dechiffre)<br>
        message_dechiffre = ""

    PS : On peut faire plus simple...

    Exemple pour doubler la liste tu peux juste faire ça : liste *= 2... Mais je ne vois pas pourquoi tu la doubles dans le code de cryptage... Je pense que cela doit t'être utile pour le cryptage...

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Popkhorn Voir le message
    liste = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
    liste="ABCDEFGHIJKLMNOPQRSTUVWXYZ" aurait aussi fonctionné et est plus simple à écrire. ou bien import string; liste=string.ascii_uppercase
    Citation Envoyé par Popkhorn Voir le message
    if lettre==' ': #au cas ou il y a un espace
    Et s'il y a un point-virgule ? Ou un chiffre ? Ou ...
    if lettre not in liste: #au cas où la lettre n'est pas prévue
    Citation Envoyé par Beginner. Voir le message
    Mais je ne vois pas pourquoi tu la doubles dans le code de cryptage...
    C'est parce qu'il ne connait pas le modulo (ou qu'il le connait mais qu'il n'a pas pensé à l'utiliser), et qu'il veut donc pouvoir gérer le circulaire (ie 'Z' qui donnera 'E' en chiffré). Mais malheureusement ça ne fonctionne pas pour gérer le circulaire inverse ('E' qui donne 'Z')...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2020
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2020
    Messages : 5
    Par défaut
    Hey ,
    De toute évidence je suis démasqué !
    Je me suis inspiré d'algorithmes de cryptage pour créer mon code, donc en effet le dédoublement est dans mon cas inutile.
    Pour le modulo, je suis en 1ère, donc disons que j'en ai entendu parler, mais de là à le mettre en place dans un programme, cela me semblait un peu... disons tendu.
    En tout cas super, j'ai apporté quelques modif en suivant vos indications, et tout fonctionne, un grand merci à vous !

    Juste une question, j'ai compris que dédoubler la liste dans un sens, compte tenu du fait que l'on recule pour décoder est inutile, mais du coup, comment le programme fait il pour retomber à lafin de la liste ? est ce qu'il définit à partir de la liste que l'on est en modulo26 ?

    Bonne journée à vous et merci encore.

  5. #5
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par Popkhorn Voir le message
    Juste une question, j'ai compris que dédoubler la liste dans un sens, compte tenu du fait que l'on recule pour décoder est inutile, mais du coup, comment le programme fait il pour retomber à lafin de la liste ? est ce qu'il définit à partir de la liste que l'on est en modulo26 ?
    Dans ce cas tu fais (26 - key) % 26

    Dans cet exemple le codage recule et le décodage avance:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    import string
    LETTERS = string.ascii_uppercase
     
    def encode_letter(letter, key):
        if letter == " ":
            return letter
     
        return LETTERS[(LETTERS.index(letter) + 26 - key) % 26]
     
    def decode_letter(letter, key):
        if letter == " ":
            return letter
     
        return LETTERS[(LETTERS.index(letter) + key) % 26]
     
    key = 12
    message = "HELLO WORLD FROM THE MARVELLOUS PYTHON FLYING CIRCUS"
    code = "".join([encode_letter(i, key) for i in message])
    print(code)
    print("".join([decode_letter(i, key) for i in code]))

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Popkhorn Voir le message
    Je me suis inspiré d'algorithmes de cryptage
    Le terme exact est "chiffrement".
    Le "chiffrement", c'est rendre un message inintelligible pour qui n'a pas la clef
    Le "déchiffrement" c'est l'opération inverse par le destinataire (qui lui a la clef)
    Le "décryptage" c'est tenter de trouver le message sans avoir la clef
    Par opposition, le "cryptage" serait tenter de rendre le message inintelligible sans la clef, ce qui n'a pas de sens

    Citation Envoyé par Popkhorn Voir le message
    Pour le modulo, je suis en 1ère, donc disons que j'en ai entendu parler
    Oui, au CM2 (7°) quand on t'a appris la division, avec le diviseur, le dividende, résultat et surtout le reste. Donc 6 ans pour te familiariser avec cette notion ultra-complexe évidemment c'est un peu court je suis d'accord...


    Citation Envoyé par VinsS Voir le message
    Dans ce cas tu fais (26 - key) % 26
    Même pas besoin. Le modulo fonctionne aussi avec les négatifs purs. Et autant utiliser len(liste) plutôt que 26 pour être évolutif (si la liste s'allonge avec les minuscules, les chiffres etc ça continue à fonctionner) => return LETTERS[(LETTERS.index(letter) - key) % len(liste)].

    Citation Envoyé par VinsS Voir le message
    code = "".join([encode_letter(i, key) for i in message])
    Pas besoin de transformer le générateur en liste (les crochets). La méthode join accepte parfaitement de traiter un generateur => code = "".join(encode_letter(i, key) for i in message).

    En plus ça peut même être contre-productif car en transformant le générateur en tuple (ou liste), Python ne peut plus l'analyser lors de la génération et est obligé de tout générer avant d'évaluer

    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def fct(n):
    	print(n)
    	return n < 5

    Si on commence par transformer le générateur en liste
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> print(all([fct(x) for x in range(10)]))
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    False

    Si on laisse Python utiliser le générateur à sa sauce
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> print(all(fct(x) for x in range(10)))
    0
    1
    2
    3
    4
    5
    False
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment coder une tabulation pour cut ?
    Par ggnore dans le forum Linux
    Réponses: 2
    Dernier message: 26/11/2004, 10h31
  2. Réponses: 5
    Dernier message: 08/10/2004, 14h40
  3. Coder un binaire PE sans étape de linkage
    Par Asmx86 dans le forum x86 32-bits / 64-bits
    Réponses: 5
    Dernier message: 11/04/2004, 23h07
  4. Réponses: 13
    Dernier message: 07/04/2004, 14h25
  5. Comment coder guillemets et cotes ?
    Par Vow dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 14/05/2003, 12h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo