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 code de chiffrage


Sujet :

Python

  1. #1
    Membre du Club
    Homme Profil pro
    Sans
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 51
    Points
    51
    Par défaut Avis sur code de chiffrage
    Bonjour
    Autodidacte et débutant en Python , je me suis amusé à créer un programme de chiffrage (bien grand mot) - dite méthode César - qui chiffre un texte.
    le texte chiffré redonne le texte original
    C'est une rotation par décalage.

    Que pensez-vous de ce code ?
    Merci de vos avis
    Bien cordialement.
    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
    def mot_a_coder(mot):
    	liste1=[]
    	mot2=[]
    	for i in range(48,123):
    			if i<58 or i>64 and i<91 or i>96 :
    				liste1.append(chr(i))
    	liste2=liste1[:]
    	liste2.reverse()
     
    	for i in range(len(mot)):
    		flag=0
    		for j in range(len(liste1)):
    			if liste1[j]==mot[i]:
    				mot2.append(liste2[j])
    				flag=1
    		if flag==0:
    			mot2.append(mot[i])
    	#print("".join(mot2))
    	return("".join(mot2))

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Points : 2 328
    Points
    2 328
    Par défaut
    Ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	liste1=[]
    	for i in range(48,123):
    			if i<58 or i>64 and i<91 or i>96 :
    				liste1.append(chr(i))
    peut etre bien raccourci, puisque vous savez exactement ce que vous mettez dans votre liste, pas besoin de faire autant de test if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste1=[char(i) for i in list( range(58) ) + list(range(65,91)) + list(range(97,123)) ]
    Ensuite pour rechercher un élément dans une liste vous n'êtes pas obligé de le faire à la main : il existe la méthode find.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=['hey','oh','on','rentre','du','boulot']
    print(a.find('oh')) ### retourne ici l'index 1.  Retourne -1 si l'élément recherché n'est pas dans la liste
    L'autre option surement plus judicieuse pour éviter toutes ces recherches dans des listes, serait, au lieu d'avoir 2 listes, avoir un dictionnaire. Le dictionnaire vous donnerais, en fonction d'un caractère, directement son caractère codé.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Bel effort. C'est bien de se motiver pour apprendre et se donner de petits challenges. Et ton programme est parfaitement fonctionnel. Simplement il a quelques petites maladresses qui, j'espère, disparaitront avec le temps.

    Par exemple il faut absolument éviter ce qu'on appelle les "nombres magiques" c'est à dire les valeurs telles que 91 ou 96. Ca rend le code confus et difficilement maintenable. Tu as à ta disposition la fonction "ord()" alors autant t'en servir (je pense que ce serait plus clair de lire if i >= ord('a') que if i > 96). De même mot2 n'a pas besoin d'être une liste. Tu peux très bien définir mot2 comme une string et lui rajouter des caractères en écrivant mot2=mot2+"caracteres_a_rajouter" (n'oublie pas la philosopie de Python: simple est mieux que complexe).

    Par ailleurs, tu pourrais rendre ta fonction beaucoup plus souple déjà en mettant le décalage comme paramètre. Ainsi c'est l'utilisateur qui choisit de combien il veut décaler. Et en plus si tu définissais carrément ta plage de caractères comme alphabet ex alphabet="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789". Ensuite, te suffirait de regarder si la lettre à chiffrer se trouve dans "alphabet" et si c'est le cas, récupérer la lettre située n rangs derrière sinon laisser la lettre inchangée.
    Code python : 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
    def mot_a_coder(mot, n):
    	alphabet="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
     
    	motX=""
    	for x in mot:
    		f=alphabet.find(x)
    		if f != -1:
    			motX=motX + alphabet[(f + n) % len(alphabet)]
    		else:
    			motX=motX + x
    		# if
    	# for
    	return motX
    # mot_a_coder()
     
    mot="Hello World"
    motSecret=mot_a_coder(mot, 5)
    motClair=mot_a_coder(motSecret, -5)
    print(mot)
    print(motSecret)
    print(motClair)

    L'avantage, c'est que tu peux ensuite rajouter facilement des caractères en plus, comme la ponctuation ou l'espace. Tu les rajoutes simplement dans "alphabet" sans rien changer d'autre et non seulement la fonction s'adapte automatiquement mais en plus tous les caractères de "alphabet" participeront au chiffement. Ainsi "Hello" pourra devenir "y*;;-" ce qui renforce d'autant plus le secret.
    L'inconvénient c'est que la fonction n'est plus (comme la tienne) réflexive. Si on veut chiffrer de 5 rangs il faudra passer "5" comme paramètre, si on veut déchiffrer il faudra demander "-5".

  4. #4
    Membre du Club
    Homme Profil pro
    Sans
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	liste1=[]
    	for i in range(48,123):
    			if i<58 or i>64 and i<91 or i>96 :
    				liste1.append(chr(i))
    peut etre bien raccourci, puisque vous savez exactement ce que vous mettez dans votre liste, pas besoin de faire autant de test if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste1=[char(i) for i in list( range(58) ) + list(range(65,91)) + list(range(97,123)) ]
    Ensuite pour rechercher un élément dans une liste vous n'êtes pas obligé de le faire à la main : il existe la méthode find.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=['hey','oh','on','rentre','du','boulot']
    print(a.find('oh')) ### retourne ici l'index 1.  Retourne -1 si l'élément recherché n'est pas dans la liste
    L'autre option surement plus judicieuse pour éviter toutes ces recherches dans des listes, serait, au lieu d'avoir 2 listes, avoir un dictionnaire. Le dictionnaire vous donnerais, en fonction d'un caractère, directement son caractère codé.
    Bonjour
    Merci pour vos conseils et des fonctions et code que vous me faites découvrir
    Oui le code aurait pu être réduit et optimisé.
    Je ne connais pas (encore) la notion de dictionnaire mais c'est une piste
    Bien cordialement et encore merci d'avoir pris le temps de me lire et d'expliquer

  5. #5
    Membre du Club
    Homme Profil pro
    Sans
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Sans

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    Bel effort. C'est bien de se motiver pour apprendre et se donner de petits challenges. Et ton programme est parfaitement fonctionnel. Simplement il a quelques petites maladresses qui, j'espère, disparaitront avec le temps.

    Par exemple il faut absolument éviter ce qu'on appelle les "nombres magiques" c'est à dire les valeurs telles que 91 ou 96. Ca rend le code confus et difficilement maintenable. Tu as à ta disposition la fonction "ord()" alors autant t'en servir (je pense que ce serait plus clair de lire if i >= ord('a') que if i > 96). De même mot2 n'a pas besoin d'être une liste. Tu peux très bien définir mot2 comme une string et lui rajouter des caractères en écrivant mot2=mot2+"caracteres_a_rajouter" (n'oublie pas la philosopie de Python: simple est mieux que complexe).

    Par ailleurs, tu pourrais rendre ta fonction beaucoup plus souple déjà en mettant le décalage comme paramètre. Ainsi c'est l'utilisateur qui choisit de combien il veut décaler. Et en plus si tu définissais carrément ta plage de caractères comme alphabet ex alphabet="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789". Ensuite, te suffirait de regarder si la lettre à chiffrer se trouve dans "alphabet" et si c'est le cas, récupérer la lettre située n rangs derrière sinon laisser la lettre inchangée.
    Code python : 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
    def mot_a_coder(mot, n):
    	alphabet="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
     
    	motX=""
    	for x in mot:
    		f=alphabet.find(x)
    		if f != -1:
    			motX=motX + alphabet[(f + n) % len(alphabet)]
    		else:
    			motX=motX + x
    		# if
    	# for
    	return motX
    # mot_a_coder()
     
    mot="Hello World"
    motSecret=mot_a_coder(mot, 5)
    motClair=mot_a_coder(motSecret, -5)
    print(mot)
    print(motSecret)
    print(motClair)

    L'avantage, c'est que tu peux ensuite rajouter facilement des caractères en plus, comme la ponctuation ou l'espace. Tu les rajoutes simplement dans "alphabet" sans rien changer d'autre et non seulement la fonction s'adapte automatiquement mais en plus tous les caractères de "alphabet" participeront au chiffement. Ainsi "Hello" pourra devenir "y*;;-" ce qui renforce d'autant plus le secret.
    L'inconvénient c'est que la fonction n'est plus (comme la tienne) réflexive. Si on veut chiffrer de 5 rangs il faudra passer "5" comme paramètre, si on veut déchiffrer il faudra demander "-5".
    Bonjour
    tout d’abord merci d'avoir pris le soin de reprendre mon code et de m'avoir expliqué pas mal de choses ; mais dans un tout premier temps de m'avoir encouragé.
    Oui les nombres magiques ce n'est pas la meilleure solution ni même les boucles et encore moins les listes et tous ces tests multiples...
    Votre code est clair, court et limpide et me donne de bonnes bases et des pistes de réflexions. Oui il vaut mieux simple que complexe !
    Merci pour cet adage et du temps pris pour m'expliquer et me proposer un code bien pensé et optimisé.

    Bien cordialement

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    salut,

    juste en passant :
    Citation Envoyé par ptitjoz Voir le message
    je me suis amusé à créer un programme de chiffrage (bien grand mot)
    c'est pas un grand mot c'est juste un mot mal employé, on parle de chiffrement en cryptographie, si tu vois un tuto ou un blog qui t'explique le "chiffrage", le "cryptage" ou autre cryptation de César tu peux le laisser tomber c'est probablement un mauvais tuto.

    pour le fun, une version compacte du chiffre de César :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    >>> cesar = lambda text,key: ''.join([alpha[(alpha.index(i.upper())+len(alpha)+key)%len(alpha)] if i.upper() in alpha else i for i in text])
    >>> cesar('salut, ca va ?', 3)
    'VDOXW, FD YD ?'
    >>> cesar('VDOXW, FD YD ?', -3)
    'SALUT, CA VA ?'

Discussions similaires

  1. Avis sur code Windev
    Par natChat dans le forum Windev Mobile
    Réponses: 11
    Dernier message: 15/10/2017, 22h07
  2. [Débutant] Avis sur code
    Par agparchitecture dans le forum C#
    Réponses: 16
    Dernier message: 29/07/2015, 09h16
  3. Réponses: 2
    Dernier message: 12/01/2012, 18h57
  4. Quel est votre avis sur Code::Blocks ?
    Par doudoustephane dans le forum Code::Blocks
    Réponses: 54
    Dernier message: 12/06/2009, 11h58

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