Características
- Cifrado de flujo
- Criptosistema simétrico (ulitiliza la misma clave para cifrar y descifrar)
- Se utiliza en protocolos como TLS/SSL y WEP
- No está recomendado su uso en los nuevos sistemas
- Clave: de longitud 1 a 256 (Ejemplo: 2 5 )
Explicación
Este cifrado se divide en dos partes: la inicialización en la que se inicializa el vector S de una determinada manera y la generación de secuencia cifrante (PRGA) en la que se cifra el mensaje usando el vecotr S obtenido en la inicialización.
Inicialización (Key Scheduling Algorithm, KSA)
En primer lugar, se inicializa el verctor de estado o caja S de tamaño 8 x 8 con los valores de 0 a 255.
for i = 0 to 255 { S[i] = [i] }
En segundo lugar se escoge una clave con la que cifrar cuya longitud esté entre 1 y 256. Para este ejemplo usaremos como clave 2 5. La clave la almacenamos en un vector V de tamaño 256 repetida tantas veces como sea necesario para llenar el vector. En este caso tendremos que repetirla 128 veces para que se llene. (2 5 2 5 2 5 ...)
for i = 0 to 255 { K[i] = V[i % V.length] }
Nota: i % V.length impide que la posición a la que se acceda sea mayor o igual al tamaño de la clave. En este caso cuando i=2 i%2=0, cuando i=3 i%3=1 etc. De esta forma las posiciones a las que se accede siempre serán la posición 0 y la 1 (que son las únicas que tiene V ya que su longitud es 2)
En tercer lugar se mezcla el vector S de la siguiente manera:
j = 0
for i = 0 to 255 {
j = (j + S[i] + K[i]) mod 256;
intercambia S[i] y S[j];
}
De eta manera vamos cambiando los valores de S entre si y al final nos quedará un vector S con los números mezclados.
Generación de secuencia cifrante (PRGA)
En esta parte se inicializan dos variables a 0 (i = 0, j = 0), A continuación se generan tantos bits como tamaño tenga el mensaje siguiendo la siguiente fórmula:
- i = (i + 1) mod 256
- j = (j + S[i]) mod 256
Por último ciframos el mensaje generando un bit t (t = S[i] + S[j] mod 256 y es generado en cada iteracción) y haciendo una xor con el mensaje por orden (primero el elemento 0, despues el 1, etc) y el valor S[t].
for i = 0 to mensaje.length {
i = (i + 1) mod 256
j = (j + S[i]) mod 256;
intercambia S[i] y S[j];
t = S[i] + S[j] mod 256;
a = mensaje[i]; //vamos cogiendo cada elemento individualmente por orden
b = S [t];
cifrado[i] = a XOR b;
}