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 :

Avis sur mon programme "Chiffre du Che"


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2015
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mai 2015
    Messages : 8
    Par défaut Avis sur mon programme "Chiffre du Che"
    Bonjours a tous,

    Pour m’entraîner a programmer en python j'ai réaliser un programme qui permet de crypter un fichier selon la méthode du "chiffre du che" (plus d'information ici : http://www.cryptage.org/chiffre-che-guevara.html ).
    Voila j'ai réaliser le programme il marche mais je trouve qu'il est un peu mal programmé et j'aimerai avoir votre avis dessus.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    import os
     
    # Cette fonction lit le fichier et récupére son texte
    def encodage(fichier):
    	fs = open(fichier, 'r') # fichier source
     
    	# On enléve les espace, majuscule, minuscule, accent
    	txt = fs.read()
    	txt = txt.lower()	# convertie la chaine en minuscule
    	fs.close()
    	substitution(txt)
     
    # Cette fonction substitue les lettre de la chaine
    def substitution(ch):
    	# On substitue selon la méthode du che
    	substitut = {'a' : 6, 'b' : 38, 'c' : 32, 'd' : 4, 'e' : 8, 'f' : 30, 'g' : 36, 'h' : 34, 'i' : 39, 'j' : 31, 'k':78 , 'l' :72, 'm' : 70,'n' : 76, 'o' :9, 'p' : 79, 'q' : 71, 'r' : 58, 's' : 2, 't': 0, 'u' :52, 'v' :50, 'w' : 56, 'x' : 54, 'y' : 1, 'z' : 59, ' ' : ''}
     
    	listeNombre = []	# Contiendra les nombre substituée
    	for car in ch:		# subtitution
    		# Cette instruction permet de faire la substitution de chaque caractére de la chaine grace au dictionnaire et l'ajoute dans une liste
    		listeNombre.append(substitut[car])
    	paquet(listeNombre)
     
    # Cette fonction va transférer tous les chiffre de la liste dans une chaine
    def paquet(liste):
    	chCinq = ""	# Contiendra la chaine de nombre encodée
    	# Place les élements de la liste dans une chaine
    	espace = 0
    	for nb in liste:
    		if nb != '':
    			chCinq += str(nb)
    	encodageFinal(chCinq, 25638, 'encoChe')
     
     
    # Cette fonction procéde a l'encodage finale
    def encodageFinal(chEncoder, cleSecrete, nomDuFichier):
    	encodageFinal = ""	# Cette chaine servira au resultat final de l'encodage
    	cleSecrete = str(cleSecrete)
    	i, j = 0, 0
    	while i < len(chEncoder):
    		if j == len(cleSecrete):
    			j = 0
    		mod10 = int(chEncoder[i]) + int(cleSecrete[j])
    		mod10 = mod10 % 10
    		encodageFinal += str(mod10)
    		i, j = i+1, j+1
     
    	print(encodageFinal)
    	# Sépare la chaine en paquet de 5
    	chFinale, k = "", 0
    	for n in encodageFinal:
    		if k % 5 == 0:
    			chFinale += ' '
    		chFinale += n
    		k += 1
    	print(chFinale)
     
    	# écriture de l'encodage dans un fichier:
    	fd = open(nomDuFichier, 'w')
    	fd.write(chFinale)
    	fd.close()
     
    if __name__ == '__main__':
    	encodage('che')
    Voila en attendant vos critique et futur conseille qui je l’espéré me permettrons de m'améliorer.

  2. #2
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Amha, ce serait mieux si toutes tes fonctions prenaient en argument la variable "CleSecrete".

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    @marco056, je comprends pas pourquoi tu dis ça, dans quel but ?

    @wercos, le découpage de ton code fait plus penser à une suite de checkpoints qu'à une organisation vraiment pertinente, si chaque fonction n'est appelée qu'une seule fois à la fin de la fonction précédente, alors tu peux tout mettre dans une fonction unique et la rendre lisible grâce aux commentaires

    aussi la fonction principale prend en argument uniquement un nom de fichier, on ne peut pas choisir le fichier de sortie il est spécifié en dur tout à la fin du traitement "encoChe", dans un cas comme celui là soit on affiche sur la console et l'utilisateur se débrouille pour enregistrer dans le fichier qui l'intéresse grâce aux redirections, soit la fonction d'appel doit permettre de préciser le nom du fichier de sortie

    enfin... il est où le déchiffrement ?

  4. #4
    Membre Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,

    @marco056, je comprends pas pourquoi tu dis ça, dans quel but ?
    Dans le but de pouvoir changer de clé secrète.

  5. #5
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par marco056 Voir le message
    Dans le but de pouvoir changer de clé secrète.
    oui en fait j'ai compris après coup ce que tu voulais dire, j'avais pas fait attention que sa clé était un nombre codée en dur dans le code, effectivement ça serait une bonne idée de pouvoir spécifier la clé en paramètre

  6. #6
    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
    Salut,

    Dans l'ordre des fonctions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def encodage(fichier):
    	fs = open(fichier, 'r') # fichier source
     
    	# On enléve les espace, majuscule, minuscule, accent
    	txt = fs.read()
    	txt = txt.lower()	# convertie la chaine en minuscule
    	fs.close()
    	substitution(txt)
    cette fonction n'enlève ni les espaces ni les majuscules ni les minuscules ni les accents.

    Tout au plus remplace-t-elle les majuscules par des minuscules, mais surtout elle n'enlève pas les "retour-ligne", ce qui est important puisqu'il s'agit de lire un texte contenu dans un fichier.


    On peut donc convertir le texte de la sorte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >>> import unicodedata
    >>> TEXT = "Ernesto Rafael Guevara de la Serna alias 'Che Guevara' était un révolutionnaire marxiste d'Amérique latine, né le 14 juin 1928 à Rosario et décédé le 8 octobre 1967 à La Higuera en Bolivie."
    >>> txt = unicodedata.normalize('NFKD', TEXT).encode('ascii', 'ignore').lower().decode('utf-8')
    >>> txt
    "ernesto rafael guevara de la serna alias 'che guevara' etait un revolutionnaire marxiste d'amerique latine, ne le 14 juin 1928 a rosario et decede le 8 octobre 1967 a la higuera en bolivie.""
    Nous avons notre texte, mais il peut encore contenir des espaces des retour-lignes et quelques autres intrus.
    On peut se permettre de les ignorer.

    Pour cela on va utiliser le droit à l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    >>> code_txt = []
    >>> for i in txt:
    ...     try:
    ...             code_txt.append(substitutes[i])
    ...     except:
    ...             pass
    ... 
    >>> code_txt
    [8, 58, 76, 8, 2, 0, 9, 58, 6, 30, 6, 8, 72, 36, 52, 8, 50, 6, 58, 6, 4, 8, 72, 6, 2, 8, 58, 76, 6, 6, 72, 39, 6, 2, 32, 34, 8, 36, 52, 8, 50, 6, 58, 6, 8, 0, 6, 39, 0, 52, 76, 58, 8, 50, 9, 72, 52, 0, 39, 9, 76, 76, 6, 39, 58, 8, 70, 6, 58, 54, 39, 2, 0, 8, 4, 6, 70, 8, 58, 39, 71, 52, 8, 72, 6, 0, 39, 76, 8, 76, 8, 72, 8, 31, 52, 39, 76, 6, 58, 9, 2, 6, 58, 39, 9, 8, 0, 4, 8, 32, 8, 4, 8, 72, 8, 9, 32, 0, 9, 38, 58, 8, 6, 72, 6, 34, 39, 36, 52, 8, 58, 6, 8, 76, 38, 9, 72, 39, 50, 39, 8]
    Ensuite, dans ton code on trouve ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def paquet(liste):
    	chCinq = ""	# Contiendra la chaine de nombre encodée
    	# Place les élements de la liste dans une chaine
    	espace = 0
    	for nb in liste:
    		if nb != '':
    			chCinq += str(nb)
    	encodageFinal(chCinq, 25638, 'encoChe')
    Je m'étonne que personne ne l'aie remarqué, mais cela ne sert à rien, tu reconvertis en entier à l'étape suivante.

    Donc on saute, voyons la clé, rendons la plus simple à utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >>> KEY = 25638
    >>> key = [int(i) for i in str(KEY)]
    >>> key
    [2, 5, 6, 3, 8]
    On a le texte et la clé. Yapluka:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    >>> crypted = []
    >>> for ct in range(0, len(code_txt), 5):
    ...     bloc = ""
    ...     for c, k in zip(code_txt[ct:ct+5], key):
    ...             bloc += str((c + k) % 10)
    ...     crypted.append(bloc)
    ... 
    >>> crypted
    ['03210', '24498', '83890', '05214', '63890', '03294', '44250', '63256', '21496', '21530', '83437', '47627', '81226', '05212', '17612', '85417', '37454', '24214', '07440', '11217', '41427', '05010', '09456', '17626', '03254', '64256', '01496', '17537', '0']
    On termine en joignant le tout en une seule chaîne de texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >>> crypted = " ".join(crypted)
    >>> crypted
    '03210 24498 83890 05214 63890 03294 44250 63256 21496 21530 83437 47627 81226 05212 17612 85417 37454 24214 07440 11217 41427 05010 09456 17626 03254 64256 01496 17537 0'
    Puis faut mettre cela dans des fonctions séparées appelées indépendamment comme on t'a expliqué précédemment. Ça c'est de la mise au propre.


    Edit: J'ai enlevé l'espace du dictionnaire substitutes

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 743
    Par défaut
    Salut,

    Citation Envoyé par werkos Voir le message
    Voila en attendant vos critique et futur conseille qui je l’espéré me permettrons de m'améliorer.
    "encodage" appelle "substitution" qui appelle "paquet" qui appelle "encodageFinal"...
    Ça fait une longue chaîne d'appels de fonctions pas facile à tester les unes indépendamment des autres.

    Imaginez vouloir paramétrer le nom du fichier de sortie en fonction de celui du fichier d'entrée. C'est une fonctionnalité "simple" qui s'applique à une chaîne de caractère que les fonctions n'ont pas vraiment à connaître pour faire leur job.

    Pour le réaliser, il va falloir modifier 2/3 fonctions: "encoder" pour passer le nom du fichier, "paquet" pour le transmettre à "encodageFinal"...

    Imaginez aussi vouloir changer la substitution ou la clé secrète: ces données étant enfouies dans des sous fonctions, il faudra changer les interfaces.

    Vous pourriez réorganiser tout çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def encoder(data, substitut, cle_secrete):
          nombres = substitution(data, substitut)
          paquets = empaqueter(nombres)
          return encodage(paquets, cle_secrete)
    Vous y retrouvez la séquence des 3 étapes de l'algorithme.
    nota: vous pourriez enchaîner çà via "encodage(empaqueter(substitution(data, substitut)), cle_secrete)" i.e. en composant "naturellement" les fonctions.

    la fonction encoder reçoit le contenu du fichier et le retourne encrypté.
    Le détail côté nom de fichier est laissé à l'appelant.

    Vous voyez l'idée? Cela fait, il vous sera plus facile de comprendre les étapes que vous avez loupées dans le codage de l'algo.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/08/2009, 17h17
  2. Votre avis sur mon programme
    Par grinder59 dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 19/09/2008, 11h05
  3. votre avis sur mon programme
    Par warubi dans le forum C++
    Réponses: 6
    Dernier message: 19/02/2007, 09h47
  4. Avis sur mon ptit site perso
    Par mastercartman dans le forum Mon site
    Réponses: 21
    Dernier message: 13/05/2006, 20h43

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