Advertisement
nac13k

esteganografia en archivo wav

Jul 8th, 2013
2,104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.38 KB | None | 0 0
  1. import wave
  2. from sys import argv
  3. from random import uniform
  4.  
  5. class esteganografia:
  6.  
  7.     def __init__(self, audio):
  8.         try:
  9.             self.original = wave.open(audio, 'r')
  10.             self.w = self.original.getnframes()
  11.             self.existeAudio = True
  12.         except:
  13.             print 'No se encontro la imagen en la ruta indicada'
  14.             self.existeAudio = False
  15.  
  16.     def charBinario(self, char):
  17.         num = ord(char)
  18.         return self.binario(num, 8)
  19.  
  20.     def binario(self, num, cantidad):
  21.         bits = []
  22.         for i in range(cantidad):
  23.             bits.insert(0, num % 2)
  24.             num >>= 1
  25.         return bits
  26.    
  27.     def binVal(self, nb):
  28.         m = ''.join(nb)
  29.         return int(m, 2)
  30.    
  31.     def mensajeAbits(self, mensaje):
  32.         lista = self.binario(len(mensaje), 12)
  33.         for i in mensaje:
  34.             lista += self.charBinario(i)
  35.         return lista
  36.  
  37.     def bitsAmensaje(self, bits):
  38.         bloques = self.binVal(bits[0:12])
  39.         mensaje = ''
  40.         c = ''
  41.         for i in xrange(12, len(bits)):
  42.             c += bits[i]
  43.             if len(c) == 8:
  44.                 mensaje += chr(int(c, 2))
  45.                 c = ''
  46.         return mensaje
  47.            
  48.     def variableAditiva(self):
  49.         num = 1 if uniform(0,1) > 0.5 else -1
  50.         return num
  51.            
  52.     def modCanal(self, c, bit):
  53.         m = c % 2
  54.         va = self.variableAditiva()
  55.         if bit == 1:
  56.             if not(m == 0) and not(c == 0):
  57.                 c += va
  58.         elif bit == 0:
  59.             if m == 0:
  60.                 c += va
  61.         if c > 255:
  62.             c = 254
  63.         elif c < 0:
  64.             c = 1
  65.         return c
  66.    
  67.     def encriptar(self, mbit, archivo='output.wav'):
  68.         if self.existeAudio:
  69.             nuevo = wave.open(archivo, 'w')
  70.             nuevo.setnchannels(self.original.getnchannels())
  71.             nuevo.setsampwidth(self.original.getsampwidth())
  72.             nuevo.setframerate(self.original.getframerate())
  73.             nuevo.setnframes(self.original.getnframes())
  74.             nuevo.setcomptype(self.original.getcomptype(), 'NONE')
  75.             nuevo.tell()
  76.             contador = 0
  77.             for x in xrange(self.w):
  78.                 frame = self.original.readframes(x)
  79.                 for y in xrange(len(frame)):
  80.                     num = ord(frame[y])
  81.                     if len(mbit) > 0:
  82.                         num = self.modCanal(num, mbit.pop(0))
  83.                     nuevo.writeframes(chr(num))
  84.             nuevo.close()
  85.             self.original.rewind()
  86.         return
  87.  
  88.     def recuperar(self):
  89.         if self.existeAudio:
  90.             mbits = []
  91.             bloques = 0
  92.             for x in xrange(self.w):
  93.                 frame = self.original.readframes(x)
  94.                 for y in xrange(len(frame)):
  95.                     c = ord(frame[y])
  96.                     if c % 2 == 0:
  97.                         mbits.append('1')
  98.                     else:
  99.                         mbits.append('0')
  100.                     if ((len(mbits)-12)/8) >= bloques and not(bloques == 0):
  101.                         return mbits
  102.                     if len(mbits) >= 12:
  103.                         if bloques == 0:
  104.                             bloques = int(''.join(mbits[0:12]),2)
  105.         return mbits
  106.  
  107.     def guardar(self, mensaje, salida):
  108.         ct = self.mensajeAbits(mensaje)
  109.         self.encriptar(ct, salida)
  110.         return
  111.  
  112.     def leer(self):
  113.         bits = self.recuperar()
  114.         return self.bitsAmensaje(bits)
  115.        
  116. if __name__ == '__main__':
  117.     if len(argv) > 1:
  118.         fsalida = ''
  119.         fentrada = ''
  120.         mensaje = ''
  121.         tipo = ''
  122.         for i in xrange(1,len(argv), 2):
  123.             print argv[i]
  124.             if argv[i].lower() == '-s':
  125.                 fsalida = argv[i+1]
  126.             elif argv[i].lower() == '-a':
  127.                 fentrada = argv[i+1]
  128.             elif argv[i].lower() == '-m':
  129.                 mensaje = argv[i+1]
  130.             elif argv[i].lower() == '-t':
  131.                 tipo = argv[i+1]
  132.             else:
  133.                 print '-.- mira la ayuda --help'
  134.         ext = fentrada[len(fentrada)-3:len(fentrada)]
  135.         print 'extension: %s' % ext
  136.         if  ext == 'wav':
  137.             e = esteganografia(fentrada)
  138.             if tipo == 'o':
  139.                 e.guardar(mensaje, fsalida)
  140.             elif tipo == 'r':
  141.                 print e.leer()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement