jueves, 25 de octubre de 2012

[CRIPTOGRAFÍA] Stream Cipher - HC-128/HC-256


Cifrado de flujo

Esta semana investigamos sobre cifras de flujo. A diferencia de el cifrado por bloques que utiliza bloques de información de tamaño constante, el cifrado de flujo utiliza un generador de flujo de clave para operar con cada bit o cada caracter del texto plano.

Generalmente el generador es un algoritmo que recibe una entrada aleatoria (una clave) y a partir de esta genera una salida datos continua pseudoaleatoria.

Para generar esta salida, se aplica un algoritmo hash a la contraseña de longitud variable y se obtiene una contraseña de longitud fija.

Se puede utilizar una contraseña tan larga como la cantidad de datos que se cifran, lo cual es una de las fortalezas de los sistemas de cifrado.
HC-256

Escogí un algoritmo llamado HC-256. HC-256 es un cifrado de flujo diseñado para proporcionar cifrado masivo de software a gran velocidad mientras que permite una gran confianza en su seguridad. Su variante HC-128 fue presentado como un candidato eSTREAM y fue uno de los 4 finalistas en el perfil de software.

HC-128 y HC-256 son algoritmos adecuados para microprocesadores superescalares modernos y futuros. Sus pasos se pueden calcular en paralelo tanto de entrada como salida.

La velocidad de codificación de HC-128 llega a 3,05 ciclos / byte en un procesador Intel Pentium
M mientras que HC-256 llega a los 4.2 ciclos / byte en un procesador Intel Pentium 4.

Algoritmo

El proceso de cifrado para HC-256 consiste en lo siguiente:
  • Inicialmente se necesita una clave (K) de 256 bits y un vector de inicialización (IV) de 256 bits.
  • Internamente, consiste en dos tablas secretas (P y Q), cada una contiene 1024 palabras de 32 bits.
  • EL flujo de clave (s) es generado del mismo algoritmo. La salida de 32 bits del paso i es denotada como si. Así que s = s0 || s1 || s2...
Hay 6 funciones en el algoritmo. Para g1(x) y h1(x) la tabla Q es usada como S-box y para g2(x) y h2(x) la tabla P es al S-box.
donde x = x3 || x2 || x1 || x0, x es una palabra de 32 bits, x0, x1, x2 y x3 son 4 bytes, x3 y x0 son los bytes mas y menos significativos respectivamente.

El código en python de estas formulas es como sigue:
Con respecto al proceso de inicialización, serán 4096 pasos antes de generar alguna salida, se expande K y IV dentro de un vector W, esto para actualizar las S-box P y Q.



El código en python para esta parte: En la ultima parte generaremos el flujo de clave s y se generará por cada paso una salida de 32 bits. También se actualiza cada tabla P o Q dependiendo de los datos que se operan. El código de esta parte es: Y de esta manera con la salida s generamos el flujo de clave que al final solo se aplicara XOR a el mensaje. La cantidad de pasos en el código es fija, pero lo recomendable es que sea indeterminada o bien de largo del mensaje.

El código completo es:

La captura de pantalla mostrando el resultado de s:

Seguridad

El cifrado es seguro y casi impenetrable, se han probado con ataques algebraicos sin resultados positivos para el atacante. La salida de el cifrado es proveniente de una función no lineal por lo que recuperar la contraseña es casi imposible.

Sin embargo al conocer parte del texto plano surge el problema, ya que en base a otros ataques de diccionario en combinacion con álgebra se puede recuperar parte de la clave y el vector de inicialización.

Lo que hace seguro el sistema es el uso de claves aleatorias de largo igual que el mensaje y de cifrados múltiples, pero eso es aplicando en todos los algoritmos en general. Lo que le da la seguridad extra es el uso de las tablas S-box P y Q que reciben cambios casi en cada paso, lo que la vuelve difícil de decifrar sin la clave.

Fuentes:

Wikipedia
Link 1
Link 2
PDF oficial
PDF de HC-128

1 comentario:

  1. Un ejemplito de pocos datos paso por paso hubiera sido aclarativo. Van 6 pts.

    ResponderEliminar