Esteganografía basada en imágenes usando Python

La esteganografía es el método de ocultar datos secretos en cualquier imagen/audio/video. En pocas palabras, el motivo principal de la esteganografía es ocultar la información deseada dentro de cualquier imagen/audio/video que no parezca ser secreto con solo mirarlo.
La idea detrás de la esteganografía basada en imágenes es muy simple. Las imágenes están compuestas de datos digitales (píxeles), que describen lo que hay dentro de la imagen, generalmente los colores de todos los píxeles. Como sabemos, cada imagen está compuesta de píxeles y cada píxel contiene 3 valores (rojo, verde, azul).
 

Codificar los datos:

Cada byte de datos se convierte a su código binario de 8 bits utilizando valores ASCII. Ahora los píxeles se leen de izquierda a derecha en un grupo de 3 que contiene un total de 9 valores. Los primeros 8 valores se utilizan para almacenar datos binarios. El valor se hace impar si ocurre 1 e incluso si ocurre 0. 
Por ejemplo: 
supongamos que el mensaje que se ocultará es ‘ Hola ‘. Dado que el mensaje es de 3 bytes, los píxeles necesarios para codificar los datos son 3 x 3 = 9. Considere una imagen de 4 x 3 con un total de 12 píxeles, que son suficientes para codificar los datos proporcionados.
 

[(27, 64, 164), (248, 244, 194), (174, 246, 250), (149, 95, 232),
(188, 156, 169), (71, 167, 127), (132, 173, 97), (113, 69, 206),
(255, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]

El valor ASCII de ‘ H ‘ es 72 cuyo equivalente binario es 01001000.
Tomando los primeros 3 píxeles (27, 64, 164), (248, 244, 194), (174, 246, 250) para codificar. Ahora cambie el píxel a impar por 1 e incluso por 0. Entonces, los píxeles modificados son (26, 63, 164), (248, 243, 194), (174, 246, 250). Dado que tenemos que codificar más datos, el último valor debe ser par. De manera similar, ‘ i ‘ se puede codificar en esta imagen.
La nueva imagen se verá así:
 

[(26, 63, 164), (248, 243, 194), (174, 246, 250), (148, 95, 231),
(188, 155, 168), (70, 167, 126), (132, 173, 97), (112, 69, 206),
(254, 29, 213), (53, 153, 220), (246, 225, 229), (142, 82, 175)]

Decodificar los datos:

Para decodificar, se leen tres píxeles a la vez, hasta que el último valor es impar, lo que significa que el mensaje ha terminado. Cada 3 píxeles contiene datos binarios, que se pueden extraer con la misma lógica de codificación. Si el valor es impar, el bit binario es 1, de lo contrario, 0.
 

A continuación se muestra la implementación de la idea anterior: 
 

Python

# Python program implementing Image Steganography
 
# PIL module is used to extract
# pixels of image and modify it
from PIL import Image
 
# Convert encoding data into 8-bit binary
# form using ASCII value of characters
def genData(data):
 
        # list of binary codes
        # of given data
        newd = []
 
        for i in data:
            newd.append(format(ord(i), '08b'))
        return newd
 
# Pixels are modified according to the
# 8-bit binary data and finally returned
def modPix(pix, data):
 
    datalist = genData(data)
    lendata = len(datalist)
    imdata = iter(pix)
 
    for i in range(lendata):
 
        # Extracting 3 pixels at a time
        pix = [value for value in imdata.__next__()[:3] +
                                imdata.__next__()[:3] +
                                imdata.__next__()[:3]]
 
        # Pixel value should be made
        # odd for 1 and even for 0
        for j in range(0, 8):
            if (datalist[i][j] == '0' and pix[j]% 2 != 0):
                pix[j] -= 1
 
            elif (datalist[i][j] == '1' and pix[j] % 2 == 0):
                if(pix[j] != 0):
                    pix[j] -= 1
                else:
                    pix[j] += 1
                # pix[j] -= 1
 
        # Eighth pixel of every set tells
        # whether to stop ot read further.
        # 0 means keep reading; 1 means thec
        # message is over.
        if (i == lendata - 1):
            if (pix[-1] % 2 == 0):
                if(pix[-1] != 0):
                    pix[-1] -= 1
                else:
                    pix[-1] += 1
 
        else:
            if (pix[-1] % 2 != 0):
                pix[-1] -= 1
 
        pix = tuple(pix)
        yield pix[0:3]
        yield pix[3:6]
        yield pix[6:9]
 
def encode_enc(newimg, data):
    w = newimg.size[0]
    (x, y) = (0, 0)
 
    for pixel in modPix(newimg.getdata(), data):
 
        # Putting modified pixels in the new image
        newimg.putpixel((x, y), pixel)
        if (x == w - 1):
            x = 0
            y += 1
        else:
            x += 1
 
# Encode data into image
def encode():
    img = input("Enter image name(with extension) : ")
    image = Image.open(img, 'r')
 
    data = input("Enter data to be encoded : ")
    if (len(data) == 0):
        raise ValueError('Data is empty')
 
    newimg = image.copy()
    encode_enc(newimg, data)
 
    new_img_name = input("Enter the name of new image(with extension) : ")
    newimg.save(new_img_name, str(new_img_name.split(".")[1].upper()))
 
# Decode the data in the image
def decode():
    img = input("Enter image name(with extension) : ")
    image = Image.open(img, 'r')
 
    data = ''
    imgdata = iter(image.getdata())
 
    while (True):
        pixels = [value for value in imgdata.__next__()[:3] +
                                imgdata.__next__()[:3] +
                                imgdata.__next__()[:3]]
 
        # string of binary data
        binstr = ''
 
        for i in pixels[:8]:
            if (i % 2 == 0):
                binstr += '0'
            else:
                binstr += '1'
 
        data += chr(int(binstr, 2))
        if (pixels[-1] % 2 != 0):
            return data
 
# Main Function
def main():
    a = int(input(":: Welcome to Steganography ::\n"
                        "1. Encode\n2. Decode\n"))
    if (a == 1):
        encode()
 
    elif (a == 2):
        print("Decoded Word :  " + decode())
    else:
        raise Exception("Enter correct input")
 
# Driver Code
if __name__ == '__main__' :
 
    # Calling main function
    main()

Producción : 
 

Publicación traducida automáticamente

Artículo escrito por AshwinGoel y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *