Esteganografía en imagenes png

Ya había explicado previamente lo que es la esteganografía y sin duda existen muchas y diversas técnicas, como me estoy volviendo fanático de Python debido a su versatilidad y la facilidad que representa para mi el escribir programas en este lenguaje usando mi móvil, pues se me ocurrió hacer un pequeño script para incrustar y comprimir archivos en imágenes png, aprovechando la forma en la que se estructuran los chunks (trozos de información) en este tipo de archivos, en cuanto pueda optimizaré el código con la librería de Android, saluDoS!

#!/usr/bin/env python
""" stegozpng es una herramienta que permite comprimir y ocultar archivos en imagenes png """
__author__ = "Jesus Gomez (ZoSemU?)"
__email__  = "hack@zosemu.com"
sversion = "0.1"

import zlib

def str_hex(texto):
    t = ''
    for i in range(0, len(texto)):
        c = texto[i:i+1]
        h = hex(ord(c))
        b = h[2:len(h)]
        if len(b) == 1:
            t = t+'0'+b+' '
        else:
            t = t+b+' '
    return t

def suma(data):
    dtext = str_hex(data).replace(' ','')
    total = 0
    total = int(dtext,16)
    return total

def str_int(num):
    h = hex(abs(num))
    h = h[2:len(h)]
    if len(h) < 8:
        g = 8 - len(h)
        data = ''
        for i in range(0,g):
            data = data+'0'
        data = data + h
    texto = ''
    for i in range(0,4):
        n = i * 2
        sc = data[n:n+2]
        texto = texto+chr(int(sc,16))
    return texto

def insert(png, filex, esteg, chunk):
    if chunk == '':
        chunk = 'zOSE'
    x = open(png,'r')
    z = open(filex,'r')
    v = open(esteg,'w')
    archivo = x.read()
    m = len(archivo)
    i1 = archivo.find('IDAT') - 4
    head = archivo[0:i1]
    estegr = z.read()
    compac = zlib.compress(estegr,9)
    lcomp = len(compac) - 4
    lchunk = str_int(len(compac) - 4)
    final = archivo[i1:m]
    v.write(head+lchunk+chunk+compac+final)
    x.close()
    z.close()
    v.close()

def extract(chunk, esteg, salida):
    if chunk == '':
        chunk = 'zOSE'
    x = open(esteg,'r')
    v = open(salida,'w')
    archivo = x.read()
    i1 = archivo.find(chunk)
    lchunk = suma(archivo[i1-4:i1]) + i1 + 8
    data = archivo[i1+4:lchunk]
    file = zlib.decompress(data)
    v.write(file)
    x.close()
    v.close()

def main():
    print "\n=============================================================="
    print "==     stegozpng " + sversion + "  -  by ZoSemU?   hack@zosemu.com       =="
    print "=============================================================="
    accion = raw_input("Ocultar (O)/ Extraer (E)?: ")
    if accion == "O" or accion == "o":
        f = raw_input("Introduce el nombre de la imagen original: ")
        s = raw_input("Introduce el nombre del archivo a ocultar: ")
        o = raw_input("Introduce el nombre de la imagen final: ")
        chunk = raw_input("Introduce el nombre del chunk a construir: ")
        insert(f, s, o, chunk)
        print "\nSe ha creado el archivo: "+o
    if accion == "E" or accion == "e":
        f = raw_input("Introduce el nombre de la imagen que contiene los datos ocultos: ")
        e = raw_input("Introduce el nombre del archivo a extraer: ")
        chunk = raw_input("Introduce el nombre del chunk creado: ")
        extract(chunk, f, e)
        print "\nSe ha extraido el archivo: "+e
main()


Y aquí lo pueden descargar.

Comentarios

  1. disculpa pero para correr este scrip que debo tener instalado por ue solo tengo python pero no me funciona se tiene que descargar algun plugin mas o algo

    ResponderEliminar
  2. no hace falta nada, "python nombre_del_script.py" sólo eso, también funciona en Android mediante Sl4a.

    ResponderEliminar

Publicar un comentario

Tu opinión es importante compartela...

Entradas populares de este blog

Detener la sincronización de tiempo/fechas entre Host y Guest en Virtual Box

Extraer datos de un archivo.mdb (Access) con python

Solución al problema con odbc pgsql (postgresql) en Windows 7 de 64 bits