jueves, 1 de noviembre de 2012

Steganography Challenge (part 2)

Continuing with the part 2 of this homework, here i will show the code used for hide the messages of the last entry and how it works.

Searching info about how achive this homework, i find the LSB(Least Significant Bit) algorithm and image manipulates could works. The part of the image are relacionaded with:
  • Some images has three colors for each pixel (RGB images).
  • The color of the pixel are composing of three values, one for each color (red, green, blue).
  • This pixels has 3 bytes of length, each byte has 8bits (necesary for store one number from 0 to 255).

The algorithm basically do this:
  • Modifies the least significant bit of each color of each pixel, resulting in a number wich changes only one unit, positive or negative, for example: from 120 to 119 or 121.
  • This is very useful, because the human eye can´t find the difference between one color with value(120, 130, 140) and other color with value(121, 129, 141).
The values that replace the original values of each pixel of the image come from the ASCII code of each character in the message to hide. But as each character uses 7 or 8 bits, are required at least three pixels for store the code of one character.

All this is explained in the next example(taken from wikipedia ):

Hiding the letter "A". If one part of one images with pixels in RGB format (3 bytes), the original representation could be the following (3 pixels, 9 bytes):

(1 1 0 1 1 0 1 0) (0 1 0 0 1 0 0 1) (0 1 0 0 0 0 1 1)

(0 0 0 1 1 1 1 0) (0 1 0 1 1 0 1 1) (1 1 0 1 1 1 1 1)

(0 0 0 0 1 1 1 0) (0 1 0 0 0 1 1 1) (0 0 0 0 0 1 1 1)

The message to encrypt is 'A' whose ASCII code is (1 0 0 1 0 1 1 1), then the new values of the pixels are:

(1 1 0 1 1 0 1 1) (0 1 0 0 1 0 0 0) (0 1 0 0 0 0 1 0)

(0 0 0 1 1 1 1 1) (0 1 0 1 1 0 1 0) (1 1 0 1 1 1 1 1)

(0 0 0 0 1 1 1 1) (0 1 0 0 0 1 1 1) (0 0 0 0 0 1 1 1)

It took 8 bytes for change, one for each bit of the letter A, the ninth byte of color was not used, but is part of the third pixel (its third color component).

Everything was fine, until the time of implementation.... :/
After several attempts, i could not continue with the implementation of this in python, i stuck with this.

For this reason i decided continue with something very similar, more caveman, but useful.

This is basically the same that LSB, but with the difference that I change all the value of one color of one RGB pixel and not only the least significant bit, the result of this is an image with minimal differences in their colors but perceptible by human eye.

I decided change the red value of each pixel for store de message, so i needed images with a lot of red colors for hide better the message. (This is the explanation of the use of red images in the last entry. :P)

The limitations of doing this is that the message length is reduced and then longer messages are more visible in the images.

Here is the code:

Basically all the modifications in the image are made with the PIL library. All the important parts of the code are commented.



import sys
import Image
import os

def escribir(image, x, y, val): #funcion para escribir los valores en la imagen
 pixels = image.load() #carga los valores RGB de todos los pixeles
 color = pixels[x, y]  #obtiene los valores RGB de un pixel en x,y
        pixels[x, y] = (val, color[1], color[2]) #escribe el nuevo valor del rojo

def leer(image, x, y): #funcion para leer valores en la imagen
 pixels = image.load() 
 color = pixels[x, y]  
 return color[0]  #regresa el valor almacenado en el color rojo del pixel

def esconder(message, image):
 escribir(image, 0, 0, len(message)) #la longitud el mensaje en el pixel 0,0
 i = 1
 for c in message:
  escribir(image, 0, i, ord(c)) #escribe el valor ascii de las letras
  i += 1

def desesconder(image):
 num_chars = leer(image, 0, 0) #obtiene la longitud del mensaje escondido
 message = " "
 for i in range(1, num_chars+1):
  message += chr(leer(image, 0, i)) #recupera el mensaje
 return message

def main():
 if (sys.argv[1] == "-e"):
  message = sys.argv[2]
  image = Image.open(sys.argv[3])
  esconder(message, image)
  image.save(sys.argv[4]) 

 elif (sys.argv[1] == "-d"):
  image = Image.open(sys.argv[2])
  message = desesconder(image)
  print message

main()


The program, for hide the message do this:
  • Write in the red value of the first pixel of the image (0, 0), the lenght of the message.
  • Then uses the ord() function for obtain the ascii value of each character then write this in the red value of each pixel.
for unhide the message, the program do this:
  • Read the red value of the first pixel(0, 0) of the image for obtain the lenght of the message.
  • Then read the red values of each pixel (according to the lenght obtained) and uses the chr() function for obtain the character from the ascii code.
Here one capture when i hide the message and when i recover the message:



For hide one message in the image(only png and bmp), uses:
o_red.py  -e  message_to_hide  imge_for_hide_the_message   result_image_name

For recover the message, uses:
o_red.py -d  image_with_hide_message

The three hidden messages were:
  • mensaje_1_escondido_para_probar_si_funciona_bien_el_programa in the image 1 (rare girl)
  • mensaje_2_escondido_para_probar_si_funciona_bien_el_programa in the image 2 (football)
  • mensaje_3_escondido_para_probar_si_funciona_bien_el_programa in the image 4 (rare dogs)
That´s all....
__________________________________________________________________________________
References:
http://es.wikipedia.org/wiki/Esteganograf%C3%ADa

jueves, 25 de octubre de 2012

MUGI - Stream Cipher

MUGI is a pseudorandom number generator  designed for use as a stream cipher. Was designed by Dai Watanabe, Soichi Furuya, Kazuo Takaragi, Bart Preneel, Hirotaka Yoshida, basing in Panama algorithm which can be used both as a hash function and a stream cipher and is aimed to be suitable for both of software and hardware. Was published in 2002 and has the standard ISO/IEC 18033-4 achieved in 2005.

MUGI is a PRNG with an128-bit secret key K (secret parameter) and an 128-bit initial vector I (public  parameter). It generates 64-bit length random bit string for each round.

The process for encrypt a plaintext using MUGI is:

1.- Divide the plaintext data into 64-bit blocks. 
2.- XOR to the output units generated by the secret key K and the initial vector I for each round.

The process for decrypt a plaintext using MUGI is:

The decryption can be implemented in the same manner.

The outline of the algorithm is as follows:

Input: Secret key K, Initial vector I, Output size n (units)
Output: Random number sequence Out[i] (0 ≤ i < n)
  
Algorithm 

Initialization
1. First input the secret key K into state a. Then initialize buffer b with running ρ.
2. Add the initial vector I into state a and initialize state a with running ρ.
3. Mix whole internal state with running the update function of MUGI for bringing to completion.

Random number generation
4. Run n rounds update function and output a part of the internal state (64-bit) for each round.

Here the explanation of some of this points/steps:

Input
MUGI has two input as a parameter, one is an 128-bit secret key K and the other is an128-bit initial vector I and is a public parameter. The higher and lower units of K are denoted by K0 and K1 respectively. In the same manner I0 and I1 are used.

State
State a consists of 3 units. Each of them is denoted by a0, a1, a2 inrotation , i.e.
                                      a = [Higher] a0||a1||a2 [Lower]
Buffer
Buffer n consists of 16 units. Each of them is denoted by b0, . . . , b15 inrotation in the same manner as state a.

Random Number Generation
After the initialization of MUGI generates 64-bit random number and transform the internal state at all round. Denote the output at round t as Out[t], thenthe output is given as below:
                                       Out[t] = a(t)

Rhoρ is the update function of state a. It is a kind of target heavy Feistel structure with two F-functions and uses buffer b as a parameter. The function ρ is described as follows:


C1, C2 in the equations above are constants. The F-function of MUGI reuses the components of AES.

Security and Attacks

MUGI is not yet broken.

The security was evaluated according to re-synchronization attack, related-key attack, and linear correlation of an output sequence.

  • Randomness: An attacker fixes a secret key and an initial vector, and then he observes the relation in the output sequence.
  • Re-synchronization attack: An attacker fixes a secret key, and then he observes the relation between initial vectors and output sequences.
  • Related-key: An attacker fixes an initial vector, and then he observes the relation between keys and output sequences. The related-key attack includes observing the relation between keys and initial vectors.

An exhaustive key search require 2127 computations on average to find correct key. So an attack is efficient when it costs less than 2127 encryptions on average to find the correct key.

In the article, "Analysis of the Non-linear Part of Mugi" by Alex Biryukov and Adi Shamir, they say:
"We study the nonlinear component of this cipher and identify several potential weaknesses in its design. While we can not break the full Mugi design, we show that it is extremely sensitive to small variations."

"For example, it is possible to recover the full 1216-bit state of the cipher and the original 128-bit secret key using just 56 words of known stream and in 214 steps of analysis if the cipher outputs any state word which is different than the one used in the actual design."
 
___________________________________________________________________________________
Enlaces:


jueves, 18 de octubre de 2012

FEAL ( Fast data Encipherment ALgorithm)

Para esta estrada vamos a explicar algunos datos acerca del algoritmo de bloques FEAL (fast data encipherment algorithm).

Historia
Al parecer fue publicado por primera vez en 1987 (la versión FEAL-4) por Akihiro Shimizu y Shoji Miyaguchi, los dos son japonéses, en la Eurocrypt 87.
FEAL-8, se concibió como software para microprocesadores de 8 bits en las tarjetas IC (“Tarjetas con chip”) , el principal impulso de desarrollado de FEAL-8 es que era más rápido que el DES.

Ha habido varias revisiones diferentes de FEAL, aunque todas en cifras de Feistel  y hacen uso de la misma función de redondeo base y operan en bloques de 64-bits. Uno de los primeros diseños actualmente se denomina FEAL-4, tiene cuatro rondas y una clave de 64 bits.

Posteriormente se publicó lo que hoy se conoce como FEAL-8 en 1988 por los mismos autores de FEAL-4, esto debido a que la primera versión mostró debilidades, que se mencionan mas adelante en el apartado de ataques/vulnerabilidades.

Posteriormente debido a la mismas situaciones de vulnerabilidad se vieron en la necesidad de publicar FEAL-N donde N era el numero de rondas y lo elegía el usuario.

Después publicaron tambien FEAL-NX que prácticamente era lo mismo que FEAL-N, solo que eran diferentes en el tamaño de sus llaves/keys/claves, FEAL-N manejaba llaves de 64bits y FEAL-NX llaves de 128bits.

La versión más reciente es FEAL-32X.

¿Cómo funciona?
Como ya se había mencionado, este algoritmo se basa en el tipo de Feistel. 
El inventor de este algoritmo fue Horst Feistel. Feistel usó este método para su algoritmo LUCIFER, en 1970. En 1974 se propone a la NSA (Agencia de la Seguridad Nacional). Como resultado nació DES.

Los principales pasos del funcionamiento de un algoritmo tipo Feistel:
  • Dado un mensaje de una longitud N, típicamente 64 bits, 128 bits, etc., se divide en dos bloques de tamaño N/2, A y B.
  • El bloque A es una de las entradas de la función F, la otra entrada es una sub clave Ki.
  • La función F es una serie de operaciones, lo cual la vuelve una función difícil de modificar.
  • El bloque B es una de las entradas de la función XOR, la otra entrada es la salida de la función F.
  • Se realizan una serie operaciones con la función F y la clave solo con una de mitades del mensaje A o B, en cada iteración se permuta la mitad usada. Este proceso es repetido n-veces.
  • Finalmente se combinan los bloques A y B para producir el texto cifrado. 
Una red de Feistel es un método general de transformación de cualquier función (usualmente llamada función F) dentro de una permutación.


FEAL al basarse en el tipo Feistel, es muy parecido y en lo unico que difieren es en la cantidad de rounds en los que se realizará el proceso. En la imagen se muestra el proceso para la implementacion del FEAL-N.

 
Actualmente se usa FEAL-32X, que como su nombre lo indica se maneja con 32 rounds y llave de 128 bits, además de 64 bits de plaintexts.
 Su esquema general:
 
El generador de claves de este algoritmo crea 40 subclaves, las cuales son separadas en tres grupos.
Para el cifrador las claves desde K0 a K31 alimentan cada una de las rondas en forma ascendente. Las claves K32 a K35 son concatenadas para realizar una operación XOR con el texto plano. Luego de realizar cada una de las rondas las claves K36 a la K39 son concatenadas para realizar una operación XOR con el texto saliente de la última ronda, el resultado de esta operación es el texto cifrado. 

Para el descifrador las claves desde K0 a K31 alimentan cada una de las rondas en orden descendente. Las claves K36 a K39 son concatenadas para realizar una operación XOR con el texto cifrado. Luego de realizar cada una de las rondas las claves K32 a la K35 son concatenadas para realizar una operación XOR con el texto que saliente de la última ronda, el resultado de esta operación es el texto plano.

La función f es equivalente a f (α , β). Donde α y β son entradas y se dividen de la siguiente manera (αi y βi son de 8-bits de longitud). 

S0 y S1 se definen como:
S0 (X1, X2) = Rot2 ((X1 + X2) mod 256)
S1 (X1, X2) = Rot2 ((X1 + X2 + 1) mod 256)

Donde X1 y X2 son bloques de 8 bits y Rot2 (T) es el resultado de un 2-bits izquierda.
α = (α0,α1,α2,α3)     β = (β0,β1)
f = (α0,α1,α2,α3), se calculan en secuencia.
f1= α1 ⊕ β0
f2= α2 ⊕ β1
f1= f1 ⊕ α0
f2= f2 ⊕ α3
f1= S1 (f1 , f2)
f2= S0 (f1 , f2)
f0= S0 (α0 , f1)
f3= S1 (α3 , f2)


Ejemplo:

El algoritmo usará bloques de tamaño 8 caracteres. Tendrá dos vueltas y en cada vuelta realizará una operación de sustitución S y una permutación P sobre la 1ª mitad.
Sustitución: Ci = (Mi +1 ) mod 27
Permutación: Ci = Π3241 (el carácter 1º pasa a la 4ª posición en el criptograma, el 4º a la 3ª, el 2º a la 2ª y el 3º a la 1ª)
Mensaje: M = STAR WARS LA MISION CONTINUA
 n = 27

C = SBTX BUST PJÑT NBJM VÑBJ ÑPUD

Para obtener el plaintext de nuevo, se hace prácticamente lo mismo, a diferencia que ahora el mensaje que se usaría el inicio sería el ciphertext obtenido.


Ataques/Vulnerabilidades
  • En artículo, den Boer en  1988 describe un ataque que requiere 100-10000 plaintexts y lo publica en la Eurocrypt 88.
  • Sean Murphy en 1990 realizó una mejora al ataque publicado por den Boer y en esta ocasión solo se necesitan 20 plaintext.
  • Un criptoanálisis lineal puede romper FEAL-4 con 5 plaintexts (conocidos) y esta vulnerabilidade fue encontrada por Matsui y Yamagishi en 1992.  Estos mismos tipos publicaron vulnerabilidades para FEAL-6 con 100 plaintexts y para FEAL-8 con 215 plaintexts.
  • Un ataque diferencial puede romper FEAL-N/NX con menos de 31 rondas y fue descubierto por Biham y Shamir en 1991.
  • En 1994, Ohta y Aoki presentaron un ataque criptoanalítico lineal para FEAL-8 que usaba 212 plaintexts.
--------------------------------------------------------------------------------------------------------------
Enlaces: