Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
Discussion fermée
#1 15-02-2010 14: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 14:58:03
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 217
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. Depuis Python 3.x 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...
En ligne
#3 15-02-2010 20: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 20:43:36
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 217
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...
En ligne
#5 16-02-2010 13: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 16:08:46
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 217
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...
En ligne
#7 17-02-2010 14: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 11:12:11
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 217
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...
text=raw_input()
Tu peux condenser les deux en :
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.
*
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
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 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...
En ligne
#9 22-02-2010 11:16:20
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 217
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...
En ligne
#10 26-08-2021 12: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 20:43:32
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 217
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 DECODERest 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...
En ligne
#12 10-06-2024 20:04:56
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 217
Re : Crypter et décrypter un message avec Python
Bonjour mary - YAM 044
Le 10:06 je t'écrivais (extrait)
Bonsoir,
Quel rapport avec le sujet en cours ?
Pour moi, aucun...Bon, en attendant, tu as 24 h, pour accéder à ton post, le copier, cliquer sur ce lien : Nouvelle discussion, donner un titre à ton sujet et le coller dans la nouvelle fenêtre...
Dans 24 h, en tout cas, sans réponse de ta part, je supprimerai ton post (et le mien devenu inutile) : je ferme la discussion en cours.Yoshi
- Modérateur -
Tu as disposé près de 48 h pour réagir, je fais donc ce que j'ai promis en conformité avec nos Règles de fonctionnement....
Avec mes regrets,
Yoshi
Dernière modification par yoshi (13-06-2024 10:11:15)
Arx Tarpeia Capitoli proxima...
En ligne
Pages : 1
Discussion fermée