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 :

XOR entre 2 chaines via leurs bits : Comment éviter l'erreur sur la chaine de retour? [Python 3.X]


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Points : 104
    Points
    104
    Par défaut XOR entre 2 chaines via leurs bits : Comment éviter l'erreur sur la chaine de retour?
    Bonjour,

    j'ai essayé un truc comme ca pour faire un xor entre deux chaines (le texte a et la clef b):
    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
     
    a = "12345678abcdefghABCDEFGHàéèù$*+!"
    b = "zzzzzzzz"
     
    def xorStrings(a,b):
     
        # encode la chaine
        e = a.encode('utf-8')
        # creer une liste avec les bytes avec l'entete 0b slicee
        l = [bin(i)[2:] for i in e]
        # ajouter des 0 devant les bytes (jusqu'a qu'il fasse 8)
        for i in range(len(l)):
            while len(l[i])<8:
                l[i] = "0"+l[i]
        # créer un chaine de 0 et 1 avec les bytes
        s = "".join(l)
        print("string: ",s)
     
        # même chose que ci avant avec la str representant la clef
        e = b.encode('utf-8')
        l = [bin(i)[2:] for i in e]
        for i in range(len(l)):
            while len(l[i])<8:
                l[i] = "0"+l[i]
        k = "".join(l)
        print("key: ",k)
     
        # effectuer le xor entre chaque bit de la chaine et de la clef
        xored = []
        for i in range(max(len(s), len(k))):
            print(i%len(s), i%len(k))
            xoredVal = int(s[i%len(s)]) ^ int(k[i%len(k)])
            xored.append(str(xoredVal))
        x =  ''.join(xored)
        print("xored: ", type(x),x)
    puis j'essai de transformer cette chaine de 0 et 1 en chaine de caractères. Pour se faire, je teste avec ce bout de code (toujours dans la def):
    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 xorStrings(a,b):
    ...
    ..
        # faire une liste des bytes du xor (resultant du xor entre chaine et clef)
        xorStr = []
        for i in range(0, len(xored), 8):
            print("i=",i)
            buf = ""
            for j in range(i,i+8):
                print("j=",j)
                buf += xored[j]
            xorStr.append(buf)
        print(xorStr)
     
        # faire une chaine de carateres avec ces bytes "xorés"
        for i in xorStr:
            byte = chr(int(i))
            print(byte)
    les caractères obtenus sont souvent des "cases vides" et trucs bizarres.. mais il semblerait que ca bloque car la boucle retourne une erreur:
    󴘳
    󴘨
    󴘩
    󴚖
    󴚗
    󴚌
    󴚍
    󴉊








    𛆣
    𛆘
    𛆙
    𛈆
    𛈇
    𛇼
    𛇽
    𚶺
    Traceback (most recent call last):
    File "C:\Adm\Info\Python\MyPyProgs\Enigma-concept.py", line 349, in <module>
    print (xorStrings(a,b))
    File "C:\Adm\Info\Python\MyPyProgs\Enigma-concept.py", line 345, in xorStrings
    byte = chr(int(i))
    ValueError: chr() arg not in range(0x110000)
    Existe t'il un moyen de "xorer" deux chaines et d'avoir un retour qui puisse être traduit en caractères et écrit? (puis xoré à nouveau avec la clef pour retrouver le texte .. vu que c'est l'idée de l'exercice que je me suis fixé ).
    Merci pour votre aide .
    Jma

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Si vous faites XOR entre 2 entiers, il n'y a aucune raison pour que le caractère correspondant (chr...) soit "imprimable" mais on peut lui appliquer .isprintable() pour le savoir.

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

  3. #3
    Membre régulier
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Points : 104
    Points
    104
    Par défaut
    Merci W

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

Discussions similaires

  1. Recherche de corrélation entre 2 images via leur profil
    Par Orus dans le forum Traitement d'images
    Réponses: 82
    Dernier message: 30/04/2007, 17h06
  2. Réponses: 2
    Dernier message: 10/11/2006, 10h26
  3. Réponses: 2
    Dernier message: 09/10/2006, 10h06
  4. Comment éviter affichage #erreur dans un état
    Par Heureux-oli dans le forum Access
    Réponses: 2
    Dernier message: 07/06/2006, 14h31

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