daily pastebin goal
72%
SHARE
TWEET

esteganografia.py

alduncin Jul 9th, 2013 311 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. from PIL import Image
  2. from sys import argv
  3.  
  4. '''Convierte el Mensaje a binario'''
  5. ''' Convierte binario cada letra en el string,
  6.    omite los espacios 'b' y toma solo de 8-bits
  7.    para representar el valor de la letra en binario'''
  8. def strToNumToBin(string):
  9.     '''recorre el string y va convirtiendo caracter en caracter en numero y despues en binario'''
  10.     return [bin(ord(caracter))[2:].zfill(8) for caracter in string]  #devuelve el arreglo[]
  11.     '''URL:http://code.activestate.com/recipes/578291-string-to-binary/ @Shawn'''
  12.  
  13. '''Convierte Binario a String'''    
  14. def binToNumToStr(binario):
  15.     '''recorrre la cadena binaria bit por bit convirtiendo en numero y despues en string :3'''
  16.     return [chr(int(bit,2)) for bit in binario]                      #devuelve el arreglo[] :')
  17.     '''Ejemplo :B binario (oviusly base 2) a numero y de numero a caracter
  18.       probar en interprete de python :3
  19.       >>chr(int('10011010',2))'''
  20.  
  21. def main():
  22.     entrada= None
  23.     comando= None
  24.     try:
  25.         '''Intenta tomar los argumentos de entrada'''
  26.         imagen  = argv[1]
  27.         comando = argv[2]
  28.     except:
  29.         '''Si no los recibio correctamente los pregunta interactivamente'''
  30.         imagen  = raw_input('Archivo de Imagen: ')
  31.         comando = raw_input('-d para decifrar el mensaje oculto \t  -o para ocultar mensaje: ')
  32.  
  33.     data = Image.open(imagen).convert('RGB')               #abre imagen de acuerdo a la entrada
  34.  
  35.     '''Comando para Ocultar el mensaje dentro de la imagen'''
  36.     if comando == '-o':
  37.         (w, h) = data.size                                  #tamanio de imagen
  38.         resultado = Image.new('RGB', (w, h))                #asigna a resultado los  datos de la imagen original
  39.         nuevo = resultado.load()                            #carga resultado a nueva imagen que generamos
  40.         pixel = data.load()                                 #carga pixeles
  41.  
  42.         '''Entrada de Mensaje '''
  43.         mensaje = raw_input('Mensaje a Ocultar:')
  44.         bits=[]                            #cadenita de bits donde se alojara el numero en binario de el largo del mensaje
  45.        
  46.         for caracter in mensaje:           #checa cada caracter en el mensaje
  47.             bits+= strToNumToBin(caracter) # y acumula cuantos lleva
  48.         largo = len(bits)                  #con esto definimos el largo del mensaje
  49.         cosabin= strToNumToBin(mensaje)#convierte el mensaje en binario
  50.        
  51.         c = 0                         #contador
  52.         for x in xrange(w):           #recorre la imagen
  53.             for y in xrange(h):       # base por altura :3 (w,h) ,i think
  54.                 r, g, b = pixel[x, y]   #los pixeles adquieren coordenadas
  55.                 if c < largo:         #recorremos el num binario del largo del mensaje bit por bit
  56.                     if (int(bits[c]) % 2) == 0:  
  57.                         if b % 2 == 1:#IMPAR cuando es impar c:
  58.                             b = 0    #y si el canal azul es impar le asigna uno
  59.                             if b>254: #si se pasa de los 254 que es su color
  60.                                 b=253 #le restamos para que este dentro de los rangos #no estoy segura que funcione ._.
  61.                             elif b<0: #si no alcanza el minimo para ser un color
  62.                                 b=1   #se queda en 1 dentro de color azul
  63.                     else:
  64.                         if b % 2 == 0:#PAR
  65.                             b = 1    #y si el canal azul es impar se le asigna uno
  66.                             if b>254: #si se pasa de los 254 que es su color
  67.                                 b=253 #le restamos para que este dentro de los rangos #no estoy segura que funcione ._.
  68.                 nuevo[x, y] = r, g, b
  69.                 c += 1
  70.        
  71.         print bits#numero en binario del largo del mensaje
  72.         print largo#numero del largo en decimal ._.
  73.         #if cosabin == mensaje LOAD :D
  74.         print cosabin#imprime el mensaje en binario
  75.         print mensaje#imprime el mensaje original
  76.  
  77.         #procederiamos a ocultarlo :B
  78.         resultado.save(imagen[:imagen.index('.')]+'copy'+imagen[imagen.index('.'):],'PNG')
  79.         resultado.show()
  80.  
  81.     else:
  82.         if comando == '-d':
  83.             (w, h) = data.size                                  #tamanio de imagen
  84.             #aqui debe de hacer lo contrario convertir binario a string
  85.             #y luego comparar y Done... :3
  86.             #print binToNumToStr(cosabin)
  87.             #print "".join(binToNumToStr(cosabin))
  88.             #for x in xrange(w):
  89.             #for y in xrange(h):
  90.             #r, g, b = pixel[x, y]
  91.             #nuevo[x, y] = r, r, 0
  92.             #b=1#aqui aun no se que pedo
  93.             print 'ya'
  94.         else:
  95.             print 'comando no valido, empecemos de nuevo.'
  96.             main()
  97.            
  98. if __name__ == '__main__':
  99.     main()
  100.     ''' Al llamar a al programa la sintaxis para que funcione
  101.    a partir de argumentos de programa es la siguiente:
  102.    esteganografia.py imagen.extencion -comando
  103.    donde:
  104.    extencion = .png /.tiff /.bmp
  105.    y comando = -o / -d '''
RAW Paste Data
Top