Thursday 13 November 2014

Esteganografía

La esteganografía "es la ciencia o arte de ocultar un mensaje". El mensaje  puede ser escondido en:
  • Imagen
  • Audio
  • Video

Como última tarea, la actividad solicitada fue: ocultar un mensaje en un archivo de audio.

Explicación
El mensaje que oculté es un texto. Para hacer esto utilizo el bit menos significativo de cada byte, para empezar a ocultar utiliza el byte que es proporcionado por el usuario como clave secreta. A partir de el número dado como clave busca el bit menos significativo de ese byte y lo sustituye por 1 o 0 dependiendo del bit que tenga el primer bit de el carácter que ocultara primero.Y así sucesivamente cambia al siguiente byte.



Funciones
Esconder el mensaje. Requiere como datos de entrada el archivo de audio y un número que es secreto ya que es requerido para poder recuperar el mensaje.

def hideTextInAudio(fileName, message,number):
 original = wave.open(fileName,'r')
 binData = original.readframes(original.getnframes())
 cambios = len(message)

 crear = wave.open('escondido.wav','w')
 crear.setparams(original.getparams())
 original.close()

 audioModificado = ""
 cont = 0
 j = 0

 for i in binData:
  if cont >= **** and j < ****:
   parte = str(bin(ord(i))[2:].zfill(8))
   parte = **** + message[j]
   crear.writeframes(****(****(****,****)))
   j = j + 1
   cont = cont + 1
  else:
   crear.writeframes(i)
   cont = cont + 1
 crear.close()



Para recuperar el mensaje, igualmente se requiere el número y el archivo de audio modificado, en mi caso el archivo que tiene el texto oculto siempre se llama "escondido.wav".

def findTextInAudio(fileName, number):
 copia = wave.open(fileName,'r')
 binarios = copia.readframes(copia.getnframes())
 cont = 0
 caracter = ''
 msjRecuperado = ''
 j = 0
 for i in binarios:
  if cont >= ****:
   parte = str(bin(ord(i))[2:].zfill(8))
   caracter = caracter + ****[****]
   if j == 7:
    **** = ****(****,****)
    msjRecuperado = msjRecuperado + ****(****)
    caracter = ""
    if **** < **** or **** > ****:
     if **** != ****:
      break
    j = -1
   j = j + 1
   cont = cont + 1
  else:
   cont = cont + 1

 copia.close()
 print "El mensaje es: " ,msjRecuperado


Nota: el programa por el momento solo recupera texto en minúsculas y espacios en blanco, de allí en fuera no podrá recuperar el mensaje completo.



Desempeño

Esconder mensaje

Tamaño de audio(bytes) Tamaño de mensaje(bytes) Tiempo necesario(segundos)
1 244 238 bytes                         560 bytes                              12.27


Recuperar mensaje
Tamaño de audio(bytes) Tamaño de mensaje(bytes) Tiempo necesario(segundos) 
 1 244 238 bytes                         560 bytes                              0.047


Propiedad estadística
Para analizar los dos archivos de audio (uno con mensaje escondido y otro original) utilice Audacity, el cual tiene una herramienta para ver un análisis de frecuencias.

Escondiendo un mensaje de longitud de 36 caracteres, iniciando en el  byte 78,965, el audio original contiene 387,150 bytes.

Cuando se compara de esta forma, se puede decir que el audio es el mismo.

Pero cuando se analizan sus frecuencias, es más que obvio que uno fue modificado.

Longitud

No se valida de que tamaño puede ser el mensaje al ocultarlo, usualmente si se empiza con un número secreto no muy grande se oculta bien en un mensaje de unos 30 caracteres.

Seguridad
Para recuperar el mensaje de forma rápida el programa necesita un número secreto que es proporcionado por el usuario, la desventaja en mi programa es que si no se tiene el número se tendrá que analizar los últimos bits de cada byte para poder recuperar el mensaje. Por lo que no es muy seguro en este caso, si no que facilita la forma de recuperar el mensaje, además de que ese número es el byte en donde se empieza a ocultar la información.

Ejemplos proporcionados (3+3)
De los siguientes archivos de audio, 3 tienen un mensaje oculto:


Casos de uso
Esconder un mensaje. 
ludim@ludim-salo:~/crypto/steganography$ python esconder.py
Hide plain text in audio file .wav
Audio pacman.wav
Input a number, > 50, this number is your key 789632
What do you want hide or find plain text? [H/F] h
Message to hide
> a ver cuanto tarda en esconder este mensaje en un audio no muy extenso
Hide. Execution time:  12.2722439766
 

Para recuperar el mensaje se necesita el número proporcionado al esconder el mensaje.
ludim@ludim-salo:~/crypto/steganography$ python esconder.py
Hide plain text in audio file .wav
Audio escondido.wav
Input a number, > 50, this number is your key 789632
What do you want hide or find plain text? [H/F] f
Find. Execution time:  0.0471239089966
El mensaje es:  a ver cuanto tarda en esconder este mensaje en un audio no muy extenso
 

Si se le da un número diferente, no devuelve el mensaje.

ludim@ludim-salo:~/crypto/steganography$ python esconder.py
Hide plain text in audio file .wav
Audio escondido.wav
Input a number, > 50, this number is your key 789633
What do you want hide or find plain text? [H/F] f
Find. Execution time:  0.0464928150177
El mensaje es: 
 


Deficiencia
Al no haber investigado al fondo como ocultar de una forma segura y que pase desapercibida, el algoritmo es muy deficiente, la verdad solo me quedé con la idea del bit menos significativo y fue lo que fui haciendo, es por eso que mi código es fácil de romper.


Referencias


Código y audio están en esta carpeta encriptada. (falta añadir el audioPrueba a la carpeta).

1. Bit menos significativo. (s.f.). En Wikipedia. Recuperado el 19 de noviembre de 2014 de http://es.wikipedia.org/wiki/Bit_menos_significativo

2 Read and Write WAV files — Python 2.7.8 documentation 


1 comment:

  1. Solamente cambiar el byte de inicio no otorga mucha seguridad.
    Quizá brincar bytes en un orden pseudoaleatoria que se determine con
    una clave como semilla…

    + explicación de cómo funciona todo
    + ocultación exitosa de mensajes recuperables
    + eval. de desempeño
    + study of statistical properties of the files
    + files provided for the detection challenge
    + método eficiente de procesamiento
    + security measures (el punto no es por ser seguro sino por discutirlo)

    Cuida la ortografía.

    7 de 10 pts.

    ReplyDelete