jueves, 1 de noviembre de 2012

Result Steganography

The images that have information are:

code


letter 


url


The content of each one are: a letter, an url and the code of my program.


code:
from sys import argv
from PIL import Image

def openFile(fileName):
    f = open(fileName, 'r')
    mensaje = list()
    for line in f:
        mensaje.append(line)
    f.close()
    return "".join(mensaje)

def setMsn(mensaje):
    m2 = list()
    mensaje = list(mensaje)
    
    for i in mensaje:
        u = bin(ord(i))[2:].zfill(8)
        for j in u:
            m2.append(j)
    return m2

def getMsn(mensaje):
    m2 = list()
    a = 1
    b = ''
    for i in mensaje:
        b = b+i
        if(a%8 == 0):
            m2.append(chr(int(b,2)))
            b = ''
                       
        a = a + 1
    return "".join(m2)

def pixelF(m2, v, count):
    if(v[7:8] != m2[count]):
        v = v[:7]+m2[count]
    else:
        v = v
    return int(v, 2)
            
def openImage(fileName, m2):
    im = Image.open(fileName)
    rgb = im.convert('RGB')
    c = 0

    while c != len(m2)-1:
        for i in range(0, im.size[0], 3):
            for j in range(im.size[1]):
                b = rgb.getpixel((i, j))[2]
                v = bin(b)[2:].zfill(8)

                w = pixelF(m2, v, c)

                r = rgb.getpixel((i, j))[0]
                g = rgb.getpixel((i, j))[1]

                d = tuple([r,g,w])
                im.putpixel((i,j),d)
                if(c == len(m2)-1): break
                c = c+1
    im.save(str(2)+fileName, "PNG")

def decodeM(fileName):
    im = Image.open(fileName)
    rgb = im.convert('RGB')
    arrayRGB = list()

    for i in range(0, im.size[0], 3):
        for j in range(im.size[1]):
            b = rgb.getpixel((i, j))[2]
            v = bin(b)[2:].zfill(8)
            arrayRGB.append(v[7:8])
    return arrayRGB

def main():

    mensaje = openFile(argv[1])
    mensaje = setMsn(mensaje)
   
    imagen = argv[2]
    print imagen
    w = openImage(imagen, mensaje)

    m2 = decodeM(str(2)+imagen)
    print getMsn(m2)
    
main()


The code take 2 parameters, the name of the file that contains the information and the name of the image to save.
> criptoImage.py fileInformation.txt image.png > dInformation.txt

To decrypt we can use the next code:
 
from sys import argv
from PIL import Image

def getMsn(mensaje):
    m2 = list()
    a = 1
    b = ''
    for i in mensaje:
        b = b+i
        if(a%8 == 0):
            m2.append(chr(int(b,2)))
            b = ''
                       
        a = a + 1
    return "".join(m2)

def decodeM(fileName):
    im = Image.open(fileName)
    rgb = im.convert('RGB')
    arrayRGB = list()

    for i in range(0, im.size[0], 3):
        for j in range(im.size[1]):
            b = rgb.getpixel((i, j))[2]
            v = bin(b)[2:].zfill(8)
            arrayRGB.append(v[7:8])
    return arrayRGB

def main():

    m2 = decodeM(str(1)+imagen)
    print getMsn(m2)
    
main()

This code only takes the name of the image

2 comentarios:

  1. Tu programa no se puede usar para decifrar tus imágenes desde el png tal cual, ya que siempre pide que pase el mensaje también. Tampoco documenta cómo uno debería usarlo cuando lo corro. Van 9 puntos.

    ResponderEliminar