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