Bonjour, je suis nouveau dans le forum, je suis en train de developper un outil de stéganographie et pour tous vous dire cela fait maintenant 2j que je passe mon temps dans les forums pour un bug. Je m'explique quand je crypte le message dans l'image, j'affiche les bits, et quand je réouvre cette image 2s après avec l'option decrypt j'affiche de nouveau les bits de l'image et ils ne sont pas les même que quand j'ai enregistré l'image donc forcément mon code ne peut pas marcher.
Je vous met le code juste en dessous:

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
 
from PIL import Image
import numpy as np
 
img = Image.open("stegg.jpg")
width, height = img.size
 
ImgArray = np.zeros((height, width, 3), dtype=np.uint8) #initialise tableau de la taille de l'image
 
 
for columns in range(width): #rempli tableau avec pixel image (1e plan pour r, 2e pour v, 3e pour b)
    for lines in range(height):
        r,v,b = img.getpixel((columns,lines)) #(x, y)
        ImgArray[lines, columns, 0] = r
        ImgArray[lines, columns, 1] = v
        ImgArray[lines, columns, 2] = b
 
 
 
def encrypt_text():
    message = "je m'appelle test"
    message = "#/#/#"+message+"#/#/#"
    BinMessage = []
    for i in message: #transforme chaque lettre en octet
        BinMessage.append(format(ord(i), "08b")) #formatage
    BinMessage = ''.join(BinMessage)#transforme la liste des octets, en (une suite sans espaces)
    return BinMessage
 
def encrypt_into_image():
 
    BinMessage = encrypt_text()
 
    if len(BinMessage) <= ImgArray.size: 
 
        messageIndex = 0 #compteur 
        messageSize = len(BinMessage)
 
        for dim in range(3): #parcours tableau
            for columns in range(width): #parcours tableau
                for lines in range(height): #parcours tableau
 
                    value = ImgArray[lines, columns, dim] #récupère valeur du pixel
                    value = format(int(value), "08b") #transforme en binaire
                    value = (int(value[:-1] + BinMessage[messageIndex], 2)) #enlève dernier bit et remplace par celui de BinMessage
                    #print(value)
                    ImgArray[lines, columns, dim] = value
 
                    if messageIndex == messageSize - 1: #quand tout texte caché dans image:
 
                        print(ImgArray[0:16, 0, 0])
                        print("finished")
                        pil_image=Image.fromarray(ImgArray) #transformer tableau en image
                        pil_image.save("stegg.jpg") #save
                        return "ok" #pour stopper boucle
 
                    else: 
                        messageIndex += 1 #sinon ajoute un au compteur et recommence
 
 
 
    else:
        print("The text couldn't be hidden into the image because the image is too small to contain this text\n Please extend the image")
 
 
def decrypt():
 
    text = []
 
    print(ImgArray[0:16, 0, 0])
 
    for dim in range(3): #parcours de la même façon qu'à l'encodage
        for columns in range(width):
            for lines in range(height):
 
                value = ImgArray[lines, columns, dim] #récupère valeur en chiffre
                value = format(int(value), "08b") #la met en bit
                last_bit = value[-1] #récupère dernier bit de l'octet 
                text.append(last_bit) #les met à la suite dans text
 
 
    i = 0
    octet = []
    finally_text = []
 
    for num in range(len(text)): #pour trancher tout les 8 bits et faire des octets 
        if i != 8:
            bit = text[num]
            #print(bit)
            octet.append(bit)
            i += 1
        else:
            octet = "".join(octet) 
            ascii = int(octet, 2) #met octet en int
            character = chr(ascii) #récupère caractère qui correspond au nombre
            finally_text.append(character) #ajoute à liste de caractère 
            i = 0   # on remet le compteur de bit à 0
            octet = [] #on retransforme octet en liste
 
    #transforme liste en str
    finally_text = "".join(finally_text)
 
 
 
 
ask = input("What do you want to do ?\n[0] encrypt\n[1] decrypt\n")
 
 
if int(ask) == 0:
    encrypt_into_image()
elif int(ask) == 1:
    decrypt()
else: 
    print("Please enter a good value")
Testez l'option 0 et ensuite la 1 et vous verrez le problème.
Si quelqu’un peut m’expliquer. Je lui suis très reconnaissant
Merci
Xam