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 de modification de bits PIL python pour outils de steganographie


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Problème de modification de bits PIL python pour outils de steganographie
    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

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

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

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

    JPEG est un format d'image qui inclut une perte d'information, la technique du LSB fonctionne plutôt sur du BMP ou du PNG

  3. #3
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 947
    Points : 9 275
    Points
    9 275
    Par défaut
    hello,
    Citation Envoyé par BufferBob Voir le message
    salut,

    JPEG est un format d'image qui inclut une perte d'information, la technique du LSB fonctionne plutôt sur du BMP ou du PNG
    dans PIL on peut sauvegarder une image en format jpeg sans perte en utilisant comme paramètres une qualité à 100 et un sous-échantillonnage à 0 :
    Even if you use quality=100, the saved image will still be slightly different from the original image. This is because PIL will also use subsampling technique to reduce the image size. You can use subsampling=0 to turn off this feature. Overall, to retain the content of original image, you may use:
    img.save('test.jpg',quality=100,subsampling=0)
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Merci Beaucoup à tous grâce à vous mon programme fonctionne
    """

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

Discussions similaires

  1. Problème de script python pour piloter un arduino
    Par astrofab dans le forum Arduino
    Réponses: 20
    Dernier message: 22/04/2019, 22h33
  2. Problème de script python pour piloter un arduino
    Par astrofab dans le forum Général Python
    Réponses: 17
    Dernier message: 19/04/2019, 18h51
  3. [WS 2008] problème de modification de chemin pour le partage du référentiel wsus
    Par demenageman dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 29/08/2014, 20h21
  4. Réponses: 2
    Dernier message: 30/01/2010, 12h16
  5. [débutant] Problème JSplitPane (modif :InternalFrame)
    Par pingoui dans le forum Agents de placement/Fenêtres
    Réponses: 61
    Dernier message: 03/09/2004, 17h01

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