Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from PIL import Image
- from sys import argv
- from random import uniform
- class esteganografia:
- def __init__(self, img):
- try:
- self.original = Image.open('./'+img).convert('RGB')
- (self.w, self.h) = self.original.size
- self.existeImg = True
- except:
- print 'No se encontro la imagen en la ruta indicada'
- self.existeImg = False
- def charBinario(self, char):
- num = ord(char)
- return self.binario(num, 8)
- def binario(self, num, cantidad):
- bits = []
- for i in range(cantidad):
- bits.insert(0, num % 2)
- num >>= 1
- return bits
- def binVal(self, nb):
- m = ''.join(nb)
- return int(m, 2)
- def mensajeAbits(self, mensaje):
- lista = self.binario(len(mensaje), 12)
- for i in mensaje:
- lista += self.charBinario(i)
- print len(lista)
- print lista
- return lista
- def bitsAmensaje(self, bits):
- bloques = self.binVal(bits[0:12])
- mensaje = ''
- c = ''
- for i in xrange(12, len(bits)):
- c += bits[i]
- if len(c) == 8:
- mensaje += chr(int(c, 2))
- c = ''
- return mensaje
- def variableAditiva(self):
- num = 1 if uniform(0,1) > 0.5 else -1
- return num
- def modCanal(self, c, bit):
- m = c % 2
- va = self.variableAditiva()
- if bit == 1:
- if not(m == 0) and not(c == 0):
- c += va
- elif bit == 0:
- if m == 0:
- c += va
- if c > 255:
- c = 254
- elif c < 0:
- c = 1
- return c
- def encriptar(self, mbit, archivo='output.png'):
- if self.existeImg:
- pixel = self.original.load()
- destino = Image.new('RGB', (self.w, self.h))
- lienzo = destino.load()
- contador = 0
- for x in xrange(self.w):
- for y in xrange(self.h):
- rgb = list(pixel[x, y])
- for i in xrange(len(rgb)):
- if len(mbit) > 0:
- rgb[i] = self.modCanal(rgb[i], mbit.pop(0))
- lienzo[x, y] = tuple(rgb)
- destino.save(archivo)
- return
- def recuperar(self):
- if self.existeImg:
- pixel = self.original.load()
- mbits = []
- bloques = 0
- for x in xrange(self.w):
- for y in xrange(self.h):
- rgb = pixel[x, y]
- for c in rgb:
- if c % 2 == 0:
- mbits.append('1')
- else:
- mbits.append('0')
- if ((len(mbits)-12)/8) >= bloques and not(bloques == 0):
- return mbits
- if len(mbits) >= 12:
- if bloques == 0:
- bloques = int(''.join(mbits[0:12]),2)
- # bloques = self.binVal(mbits[0:12])
- return mbits
- if __name__ == '__main__':
- m = raw_input('mensaje > ')
- e = esteganografia('mario.png')
- ct = e.mensajeAbits(m)
- e.encriptar(ct)
- r = esteganografia('output.png')
- bits = r.recuperar()
- print len(bits)
- print bits
- print r.bitsAmensaje(bits)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement