Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement