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 :

Problème d'encodage de clé? [Python 3.X]


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2017
    Messages : 53
    Par défaut Problème d'encodage de clé?
    Bonjour tout le monde,
    J'ai créé un micro-programme qui qui génère une clé 256 bit avec os.urandom(32) et je stocke dans une variable key. J'enregistre la valeur de la clé dans un fichier automatiquement généré que j'ai appelé : tetKey.txt.
    Un fois cela, je lance une boucle qui va me demander la valeur de la clé, va tester cette valeur entrée avec la véritable clé et va déverrouiller le programme si celle-xi est la bonne.
    Voici le code :
    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 os
     
    key = os.urandom(32)
    with open("tetKey.txt", "wb") as tK :
    	tK.write(key)
    key = None
    goodKey = False
     
    while goodKey == False :
    	enKey = input("Key >>")
    	with open("tetKey.txt", "rb") as tK :
    		key = tK.read()
    		print(key)
    		print(enKey)
    		if enKey == key :
    			print("Good job this is the good key" + enKey)
    			goodKey = True
    		else :
    			print("Try again")
    print("END")
    Ce que je ne comprends pas, c'est quand je teste le programme et que pour faire en sorte que le programme se déverrouille je récupère la clé notée dans le fichier, et que je la colle, ça ne fonctionne pas. J'aimerais donc comprendre pourquoi Merci d'avance pour vos réponses

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Salut,

    Citation Envoyé par wildshadow956 Voir le message
    ça ne fonctionne pas. J'aimerais donc comprendre pourquoi
    La commande magique "print" vous indiquerait que votre clef est une suite de "bytes" alors que ce que retourne "input" est "str"ing. Vous comparez des objets de type différent: ils seront toujours inégaux.

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

  3. #3
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2017
    Messages : 53
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    La commande magique "print" vous indiquerait que votre clef est une suite de "bytes" alors que ce que retourne "input" est "str"ing. Vous comparez des objets de type différent: ils seront toujours inégaux.

    - W
    Mais même quand je transforme la string en bytes, elles ne s'encode pas comme elle l'aurait du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    key = tK.read()
    		print(key)
    		enKey = bytes(enKey, encoding="utf-8")
    		print(enKey)
    		if enKey == key :

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par wildshadow956 Voir le message
    Mais même quand je transforme la string en bytes, elles ne s'encode pas comme elle l'aurait du :
    Vous transformez une chaîne de caractères Unicode en utf-8 puis la transformez en bytes.
    Comme elle contient des caractères > 128, cette transformation va remplacer 1 caractères par 2 ou 3 bytes.
    Donc c'est n'importe quoi et en général, çà ne fonctionne pas.

    Il faudrait la transformer d'abord en une liste d'entiers (avec la fonction "ord"), puis en faire des bytes après avoir validé ce que récupère "input".

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

  5. #5
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2017
    Messages : 53
    Par défaut
    Donc je résume : Pour obtenir une bonne comparaison,
    - dans une boucle, je transforme tout les caractères en entiers grâce à ord()
    - Je les transforme en byte et je compare

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par wildshadow956 Voir le message
    Donc je résume : Pour obtenir une bonne comparaison,
    - dans une boucle, je transforme tout les caractères en entiers grâce à ord()
    - Je les transforme en byte et je compare
    Après avoir validé ce que retourne "input".
    Regardez un peu le len() de ce qu'à retourné "input"... vous devriez être surpris.

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

  7. #7
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2017
    Messages : 53
    Par défaut
    Pourquoi tous il n'y a pas tout les caractères ????

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par wildshadow956 Voir le message
    Pourquoi tous il n'y a pas tout les caractères ????
    Si "len" retourne une valeur < 32.... mais il est fort probable que cette valeur soit bien plus grande.
    Ayez la curiosité d'essayer et d'imaginer ce qu'il peut bien se passer (pour en arriver là).

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

  9. #9
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2017
    Messages : 53
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si "len" retourne une valeur < 32.... mais il est fort probable que cette valeur soit bien plus grande.
    Ayez la curiosité d'essayer et d'imaginer ce qu'il peut bien se passer (pour en arriver là).

    - W
    La plupart du temps où je fais le copier-coller ( environ une quinzaine d'essai ), le nbr de caractères est < 32. Lors qu'il est égal à 32, j'ai mis en place ce que vous m'avez dit. Voilà par exemple ce que j'obtiens :

    Nom : tetKey.PNG
Affichages : 126
Taille : 7,8 Ko


    nouveau code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    listBytesKey = []
    			for x in range(0, len(enKey)) :
    				cint = ord(enKey[x])
    				listBytesKey.append(cint)
     
    			listBytesKey = bytes(listBytesKey)
    			print(listBytesKey)

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par wildshadow956 Voir le message
    La plupart du temps où je fais le copier-coller ( environ une quinzaine d'essai ), le nbr de caractères est < 32.
    Dans quel contexte faites vous ces copier coller? Votre code étant incomplet, pas facile de savoir.
    De toutes façons, si je crée une clef de 10 bytes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> x = os.urandom(10)
    >>> x
    b'0Y\xbbx\xe9\xfc\xf1(~\x99'
    Et que je fais un copie coller vers "input":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> z = input()
    0Y\xbbx\xe9\xfc\xf1(~\x99
    >>> len(z)
    25
    Les \x... ne sont plus interprétés par Python comme "byte codé en hexa" mais comme de simples caractères.
    Et çà ne va pas être facile d'expliquer à l'utilisateur comment il va bien pouvoir entrer sa clef.

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

  11. #11
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2017
    Messages : 53
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Dans quel contexte faites vous ces copier coller? Votre code étant incomplet, pas facile de savoir.
    De toutes façons, si je crée une clef de 10 bytes:

    Les \x... ne sont plus interprétés par Python comme "byte codé en hexa" mais comme de simples caractères.
    Et çà ne va pas être facile d'expliquer à l'utilisateur comment il va bien pouvoir entrer sa clef.

    - W
    En fait pour le test je récupère la clé qui est stocké fichier : "´û&¤VØâý5–¾îÚ=…fÆgñ¾.NR²Œ1¦ó‘"
    que je place dans l'input()

    et c'est la que je fais la conversion

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par wildshadow956 Voir le message
    En fait pour le test je récupère la clé qui est stocké fichier : "´û&¤VØâý5–¾îÚ=…fÆgñ¾.NR²Œ1¦ó‘"
    que je place dans l'input()
    Et vous espérez que çà puisse fonctionner?

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

  13. #13
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2017
    Messages : 53
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et vous espérez que çà puisse fonctionner?

    - W
    Bah oui, il s'agit bien du même texte

  14. #14
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par wildshadow956 Voir le message
    Bah oui, il s'agit bien du même texte
    Si c'était du texte, vous n'auriez aucun soucis.

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

  15. #15
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2017
    Messages : 53
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Si c'était du texte, vous n'auriez aucun soucis.

    - W
    Alors comment je suis censé faire

  16. #16
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par wildshadow956 Voir le message
    Alors comment je suis censé faire
    Vous constatez que les bytes "binaires" voyagent mal car ils vont être affichés et récupérés par les différents composants qui entrent dans le copie/coller, input,... sans être préservés.
    De plus, vous constatez aussi que çà ne va pas être facile pour l'utilisateur d'entrer ces caractères là.
    Une solution serait de transformer ces bytes en texte i.e. des caractères imprimables qui permettraient déjà de vérifier ce qu'on a tapé....
    Les représenter sous forme hexadécimale, par exemple, permettrait d'avoir du "texte" plus facile à transporter.

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

  17. #17
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2017
    Messages : 53
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Vous constatez que les bytes "binaires" voyagent mal car ils vont être affichés et récupérés par les différents composants qui entrent dans le copie/coller, input,... sans être préservés.
    De plus, vous constatez aussi que çà ne va pas être facile pour l'utilisateur d'entrer ces caractères là.
    Une solution serait de transformer ces bytes en texte i.e. des caractères imprimables qui permettraient déjà de vérifier ce qu'on a tapé....
    Les représenter sous forme hexadécimale, par exemple, permettrait d'avoir du "texte" plus facile à transporter.

    - W
    D'accord, donc le processus de conversion serait :
    - conversion de la clé en hex via hex() ou avec le module binascii
    - et écriture du fichier avec le mode wb


    Je vais tester.
    Je remarque que la verison hex de la clé est toujours encodée en 64 caractères. Est-ce toujours le cas?

  18. #18
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2017
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2017
    Messages : 53
    Par défaut
    Un GRAND Merci wiztricks, j'ai bien compris que lors des opérations de types copier/coller ou input(), le byte n'est pas le type le plus approprié. Il faut donc se tourner vers des caractères imprimables type hexadécimal. Sur ce, je ferme le sujet.

  19. #19
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par wildshadow956 Voir le message
    Je remarque que la verison hex de la clé est toujours encodée en 64 caractères. Est-ce toujours le cas?
    Combien de digits/chiffres hexadécimaux faut-il pour coder un byte/octet?

    - 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. [CSV] Problème d'encodage
    Par simoryl dans le forum Langage
    Réponses: 13
    Dernier message: 18/04/2012, 15h20
  2. Problème d'encodage avec Python
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 22/02/2006, 14h36
  3. Problème d'encodage en Unicode
    Par Skreo dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 28/12/2005, 10h43
  4. Problème d'encodage sur MySql 4.1
    Par Blanchet dans le forum Outils
    Réponses: 1
    Dernier message: 04/12/2005, 04h53
  5. [XML::PARSER] Problème d'encodage
    Par frangin2003 dans le forum Modules
    Réponses: 13
    Dernier message: 05/09/2005, 14h59

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