import wave
from sys import argv
from random import uniform
class esteganografia:
def __init__(self, audio):
try:
self.original = wave.open(audio, 'r')
self.w = self.original.getnframes()
self.existeAudio = True
except:
print 'No se encontro la imagen en la ruta indicada'
self.existeAudio = 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)
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.wav'):
if self.existeAudio:
nuevo = wave.open(archivo, 'w')
nuevo.setnchannels(self.original.getnchannels())
nuevo.setsampwidth(self.original.getsampwidth())
nuevo.setframerate(self.original.getframerate())
nuevo.setnframes(self.original.getnframes())
nuevo.setcomptype(self.original.getcomptype(), 'NONE')
nuevo.tell()
contador = 0
for x in xrange(self.w):
frame = self.original.readframes(x)
for y in xrange(len(frame)):
num = ord(frame[y])
if len(mbit) > 0:
num = self.modCanal(num, mbit.pop(0))
nuevo.writeframes(chr(num))
nuevo.close()
self.original.rewind()
return
def recuperar(self):
if self.existeAudio:
mbits = []
bloques = 0
for x in xrange(self.w):
frame = self.original.readframes(x)
for y in xrange(len(frame)):
c = ord(frame[y])
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)
return mbits
def guardar(self, mensaje, salida):
ct = self.mensajeAbits(mensaje)
self.encriptar(ct, salida)
return
def leer(self):
bits = self.recuperar()
return self.bitsAmensaje(bits)
if __name__ == '__main__':
if len(argv) > 1:
fsalida = ''
fentrada = ''
mensaje = ''
tipo = ''
for i in xrange(1,len(argv), 2):
print argv[i]
if argv[i].lower() == '-s':
fsalida = argv[i+1]
elif argv[i].lower() == '-a':
fentrada = argv[i+1]
elif argv[i].lower() == '-m':
mensaje = argv[i+1]
elif argv[i].lower() == '-t':
tipo = argv[i+1]
else:
print '-.- mira la ayuda --help'
ext = fentrada[len(fentrada)-3:len(fentrada)]
print 'extension: %s' % ext
if ext == 'wav':
e = esteganografia(fentrada)
if tipo == 'o':
e.guardar(mensaje, fsalida)
elif tipo == 'r':
print e.leer()