Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 15-02-2010 13:24:42

Unik
Membre
Inscription : 15-02-2010
Messages : 4

Crypter et décrypter un message avec Python

Bonjour,

Je découvre Python et j'ai un petit problème.
j'aimerais coder et décoder un message avec Python.

Je vous expose mon problème:

"Une méthode simple pour crypter un message consiste en un simple décalage: le A devient le K, le B devient le L, le C devient le M, etc... et on boucle sur l'alphabet lorsqu'on arrive à Z.
pour crypter et décrypter, il suffit donc de connaître le pas du décalage.
On limitera dans un premier temps les messages à ceux écrits en lettres majuscules, en acceptant comme seule ponctuation que le point et l'espace.

1 - Ecrire un programme permettant de coder un message, le pas du décalage étant dans un premier temps bloqué à 5, puis on donnera ensuite la possibilité à l'utilisateur de choisir le pas.

2 - Ecrire un programme permettant de décoder un message:
           a - en connaissant le pas de décalage;
           b - sans connaitre le pas de décalage, c'est à dire proposer tous les messages possible;
           c - sans connaitre le pas de décalage, mais en tenant compte d'un résultat statistique très connu:
                le "e" est la lettre la plus fréquente.

Voilà...
Je vous remercie par avance pour votre aide...

Hors ligne

#2 15-02-2010 13:58:03

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Crypter et décrypter un message avec Python

Bonjour,

Atention ! Python 2.6.x ou 3. ? Il y a de subtiles nuances

Cela s'appelle coder selon l'algorithme de Cesar, tu peux t'inspirer de cette discussion :
http://www.bibmath.net/forums/viewtopic.php?id=2382
Je n'ai utilisé là que des fonctions mathématiques et Python de base : je n'ai pas fait intervenir le % (modulo)

Tu dois insérer une condition : si le caractère lu est une , ou un . tu conserves ce caractère et tu avances d'un pas.

Tu dois encore ajouter un questionnement
En 2.6.x  : phrase_a_coder = raw_input("Veuillez entrer la phrase à coder. Merci")
en 3.x     : phrase_a_coder = input("Veuillez entrer la phrase à coder. Merci")
Dois-tu tenir compte des éventuels accents ou caractères parasites ? ; / * % par ex ?
Si oui, alors tu dois faire un traitement d'erreurs...

Attention tout ce qui se trouve dans cette section est écrit pour python 2.6x. En Python 3.1 le print est devenu une fonction.
On n'écrit plus : print "python", mais print("Python")
Python 2.6 print 6/4 --> 1 et print 6.0/4 = 1.5
Python 3.1 print(6/4) --> 1.5  et print (6//4) --> 1

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#3 15-02-2010 19:10:10

Unik
Membre
Inscription : 15-02-2010
Messages : 4

Re : Crypter et décrypter un message avec Python

Merci pour ton aide. Par contre je ne dois pas utiliser l algorithyme de césar. Et je ne dois pas utiliser les accents ni les caractères spéciaux, j'ai le droit au point et a l espace.

Hors ligne

#4 15-02-2010 19:43:36

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Crypter et décrypter un message avec Python

Salut,

Si je m'abuse, le codage par décalage tel que tu le décris est référencé sous le nom d'algorithme de Cesar.
Voir :
http://www.bibmath.net/crypto/substi/cesar.php3

Quant aux entrées interdites (accents...), j'avais compris.
Ce que je te demande c'est si tu dois tenir du compte du cas où quelqu'un rentrerait un mot avec avec caractères spéciaux, par ex déçu, si tu dois traiter l'entrée pour corriger ça en decu...
De même si la phrase est entrée en minuscules ou mélanges minuscules/majuscules, dois-tu la traiter pour tout convertir tout en majuscules.

Autre chose pour l'avenir, tu n'as pas répondu v: Python 2.6.x ou Python 3.x ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#5 16-02-2010 12:06:30

Unik
Membre
Inscription : 15-02-2010
Messages : 4

Re : Crypter et décrypter un message avec Python

Python 2.5

Hors ligne

#6 16-02-2010 15:08:46

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Crypter et décrypter un message avec Python

Salut,

OK ! Tout ce que j'ai fait fonctionnera...
Donc procédons comme ça :
* tu écris un bout de code et tu le postes,
* je le teste et te fais une proposition d'amélioration ou de correction si nécessaire.

Ca te va ?


@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#7 17-02-2010 13:27:29

Unik
Membre
Inscription : 15-02-2010
Messages : 4

Re : Crypter et décrypter un message avec Python

Voici le début!



# -*- coding: cp1252 -*-
import string


alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ .ABCDEFGHIJKLMNOPQRSTUVWXYZ ."
code=""
decode=""
print "Entrez le texte à crypter en MAJUSCULE"
text=raw_input()

print "Entrez le pas de codage"
pas=input()

for i in range(0,len(text)):
    code=code+alpha[alpha.index(text[i])+pas]


print "                       MESSAGE CODEE                    "
print "------------------------------------------------------\n"
print code
print "\n------------------------------------------------------"


for i in range(0,len(code)):
    decode=decode+alpha[alpha.index(code[i])-pas]

print "                      MESSAGE DECODEE                   "
print "------------------------------------------------------\n"
print decode
print "\n------------------------------------------------------"


Maintenant j'ai des problemes pour les différents décodages à faire...

Hors ligne

#8 18-02-2010 10:12:11

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Crypter et décrypter un message avec Python

Salut,

Ton code tourne, ce n'est pas une surprise.

import string
Pour quoi faire ?
Ton code tourne en Python 2.6.4 sans ça...

print "Entrez le texte à crypter en MAJUSCULE"
text=raw_input()

Tu peux condenser les deux en :

text=raw_input("ENTRER le texte à crypter en MAJUSCULES : ")

sauf si tu tiens à avoir la demande et le texte sur deux lignes.
Cela dit,
* Si je rentre des minuscules au milieu des majuscules, ton code plante !
   Remède : text = text.upper()
* Si j'utilise d'autres signes de ponctuation que le . et l'espace, ton code plante.
   Solution : inspecter le message à coder et supprimer les ';:!... éventuels.
   C'est comme tu veux.

* Même remarque pour le pas.
   Condenser en pas raw_input("Entrer le pas  : ") ?
   Si je rentre un pas de 29, ton code plante. Tu as fait un travail modulo 28 (à cause du point et de l'espace)
   Pas de 0 ou pas de 28 donnent le même résultat.

for i in range(0,len(text)):
    code=code+alpha[alpha.index(text[i])+pas]

0, len(text) : le 0 est inutile, par défaut le 1er indice de contrôle d'une boucle en python est 0.
    len(txt) : pourquoi ne pas écrire
   

lg=len(text)
   for i in range(0,lg):
    code=code+alpha[alpha.index(text[i])+pas]

Ca le rend code plus lisible.

* code+=code+alpha[alpha.index(text[i])+pas] peut être raccourci en : code+=alpha[alpha.index(text[i])+pas]

* Tu transformes le . et l'espace en lettres et réciproquement. C'est voulu ?

Concernant l'affichage des décodages possible.
Une proposition : inclure ta boucle de décodage dans une autre boucle

for pas in range(1, 28):
    for i in range(0,len(code)):
        decode+=alpha[alpha.index(code[i])-pas]
    print decode
    print "\n------------------------------------------------------"
    BonMauvais=raw_input("Ce texte est-il cohérent (O/N) ? ")
    if BonMauvais = "O":
        break
    else:
        decode=""
print "\n                      MESSAGE DECODE                   "
print "------------------------------------------------------\n"
print decode
print "\n------------------------------------------------------"

contrôlée par la variable pas (prenant les valeurs de 1 à 27) et permettant de balayer les 27 décodages possibles, si nécessaire...
A chaque pas on pose la question de savoir si le texte affiché a un sens. Si oui, on arrête la boucle (break) et on réaffiche proprement le résultat.
Si non, on réinitialise decode et on repart pour un tour...

Pour utiliser l'histoire des lettres les plus fréquentes, cela n'a un sens que si tu as un texte d'au moins 150 à 200 lettres, sinon, c'est très aléatoire.
Tu peux :
* Transformer ta chaine en une chaine comprenant tous les caractères séparés par une virgule, et stocker tous ces éléments dans une liste,
* Trier la liste en supprimant les doublons et en comptant le nombre d'occurences de chaque caractère
* Stocker le tout sous la forme d'une liste de tuples : (caract, nombre).
* Puis trier sur le 2e élément de chaque tuple : j'ai ça en stock
Tu auras ainsi la liste des caractères différents de la chaîne code, classés par nombre d'occurences décroissant.
Le 1er de la liste correspondant en principe au E, il ne reste plus qu'à calculer le pas et décoder...
Tu devrais créer une fonction decodage, puisque tu vas te servir 3 fois de la même chose.

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#9 22-02-2010 10:16:20

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Crypter et décrypter un message avec Python

Re,

Pas de nouvelles ?
Peut-être à cause de ça :
http://www.developpez.net/forums/d87812 … ces-texte/ ?

@+


Arx Tarpeia Capitoli proxima...

Hors ligne

#10 26-08-2021 11:32:41

louis muscat
Invité

Re : Crypter et décrypter un message avec Python

Bonjour, j'aimerais crée un algorithme de décodage en python mais je ne sais pas comment faire.
Mon algorithme est en binaire exemple : 01 = Z         10 = Y          11 = X      100 = W        101 = V   etc... je veut que l'on puisse copier coller le message et que ca le code ou décode SVP aidez moi.

#11 26-08-2021 19:43:32

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 946

Re : Crypter et décrypter un message avec Python

Bonsoir,

Coder un message avec ton algorithme, ne sera pas compliqué...
Par contre le décodage, risque de ne pas être simple, sauf si on sépare les groupes de chiffres correspondant aux lettres...
mais là, ce ne serait plus qu'un codage de César déguisé et particulièrement évident à décoder...

Un peu moins simple serait de respecter le découpage en mots.

Vite fait :

Phrase_A_Coder='PAR CONTRE LE DECODAGE RISQUE DE NE PAS ETRE SIMPLE SAUF SI ON SEPARE LES GROUPES DE CHIFFRES CORRESPONDANT AUX LETTRES MAIS LA CE NE SERAIT PLUS QU UN CODAGE DE CESAR DEGUISE PARTICULIEREMENT EVIDENT A DECODER'
Dico_Alphabet_Inverse={'K': 16, 'Z': 1, 'X': 3, 'N': 13, 'B': 25, 'M': 14, 'V': 5,\
                       'L': 15, 'C': 24, 'E': 22, 'H': 19, 'J': 17, 'I': 18, 'T': 7,\
                       'O': 12, 'U': 6, 'G': 20, 'S': 8, 'Y': 2, 'W': 4, 'R': 9,\
                       'A': 26, 'D': 23, 'Q': 10, 'P': 11, 'F': 21}

Blanc=" "
Phrase_Codee=""
for lettre in Phrase_A_Coder:
    if lettre== " ":
        Phrase_Codee+=Blanc
    else:
        valeur_b2=bin(Dico_Alphabet_Inverse[lettre])[2:]
        Phrase_Codee+=valeur_b2
print("        La phrase :")
print(Phrase_A_Coder)
print()
print("        est devenue :")
print(Phrase_Codee)
 

Voilà ce que ça donne :

La phrase :
PAR CONTRE LE DECODAGE RISQUE DE NE PAS ETRE SIMPLE SAUF SI ON SEPARE LES GROUPES DE CHIFFRES CORRESPONDANT AUX LETTRES MAIS LA CE NE SERAIT PLUS QU UN CODAGE DE CESAR DEGUISE PARTICULIEREMENT EVIDENT A DECODER

        est devenue :
1011110101001 1100011001101111100110110 111110110 101111011011000110010111110101010010110 1001100101000101011010110 1011110110 110110110 1011110101000 10110111100110110 10001001011101011111110110 10001101011010101 100010010 11001101 100010110101111010100110110 1111101101000 10100100111001101011101101000 1011110110 11000100111001010101101011001101101000 1100011001001100110110100010111100110110111110101101111 1101011011 1111101101111111001101101000 111011010100101000 111111010 1100010110 110110110 10001011010011101010010111 101111111101000 1010110 1101101 11000110010111110101010010110 1011110110 11000101101000110101001 10111101101010011010010100010110 10111101010011111001011000110111110010101101001101101110101101101111 101101011001010111101101101111 11010 101111011011000110010111101101001


@+


Arx Tarpeia Capitoli proxima...

Hors ligne

Réponse rapide

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
quatre-vingt deux moins trente et un
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Pied de page des forums