RC4 para niños
En el mundo de la criptografía, que es el arte de escribir mensajes secretos, RC4 o ARC4 es un sistema de cifrado de flujo muy conocido. Se usó en protocolos importantes como Transport Layer Security (TLS/SSL), que ayuda a proteger la información que viaja por Internet, y Wired Equivalent Privacy (WEP), que añadía seguridad a las redes inalámbricas. Aunque RC4 fue muy usado, los expertos en seguridad descubrieron que algunas formas de usarlo, especialmente con WEP, no eran tan seguras. Por eso, hoy en día no se recomienda usar RC4 para proyectos nuevos, aunque algunas de sus aplicaciones aún son seguras para el uso diario.
Contenido
Historia de RC4: ¿Cómo surgió este sistema de cifrado?
El sistema de cifrado RC4 fue creado por Ronald Rivest, de la empresa RSA Security, en el año 1987. Su nombre completo es Rivest Cipher 4. Las letras "RC" también se usaron para otros sistemas de cifrado de Rivest, como RC2, RC5 y RC6.
¿Cómo se hizo público el secreto de RC4?
Al principio, el algoritmo de RC4 era un secreto de la empresa. Pero en septiembre de 1994, una descripción de cómo funcionaba se compartió de forma anónima en una lista de correos. Rápidamente, se difundió por Internet y dejó de ser un secreto. Aunque ya no era secreto, RC4 sigue siendo una marca registrada. Por eso, las versiones no oficiales de RC4 a menudo se llaman ARCFOUR o ARC4, para evitar problemas legales. RSA Security nunca ha hecho público el algoritmo de forma oficial.
¿Por qué RC4 fue tan popular?
RC4 se convirtió en parte de muchos protocolos de seguridad, como WEP, TLS y WPA, que se usan en las tarjetas de red inalámbricas. Las razones principales de su éxito fueron su gran velocidad y su sencillez. Era muy fácil de implementar tanto en programas de computadora (software) como en dispositivos electrónicos (hardware).
¿Cómo funciona RC4? Una explicación sencilla
RC4 es un sistema bastante simple que usa dos partes principales:
- El Algoritmo de Programación de Claves (KSA, por sus siglas en inglés).
- El Algoritmo de Generación Pseudoaleatoria (PRGA, por sus siglas en inglés).
Ambos usan un "estado interno secreto", que es como una caja especial llamada S-box. Esta S-box es una lista de 256 números (bytes) que están mezclados, y también usa dos contadores de 8 bits, llamados "i" y "j". El KSA se encarga de mezclar los números en la S-box usando una clave secreta que puede tener diferentes longitudes.
Pasos del Algoritmo de Programación de Claves (KSA)
Primero, la S-box se llena con los números del 0 al 255 en orden. Luego, se procesa 256 veces para mezclarlos, usando partes de la clave secreta. Imagina que es como barajar una baraja de cartas, pero de una manera muy específica.
Aquí te mostramos cómo se vería en un lenguaje de programación sencillo:
Para cada número desde 0 hasta 255:
Pon ese número en la posición actual de la S-box.
Pon el contador 'j' en 0.
Para cada número desde 0 hasta 255:
Calcula 'j' usando el valor actual de 'j', el número en la S-box y un pedazo de la clave secreta.
Intercambia los números en la S-box en las posiciones 'i' y 'j'.
Una vez que esto se hace, la S-box queda mezclada según la clave secreta.
Pasos del Algoritmo de Generación Pseudoaleatoria (PRGA)
Cuando se necesita generar la secuencia de números aleatorios para cifrar o descifrar, se usa el PRGA. Este algoritmo también tiene dos contadores, 'i' y 'j', que empiezan en 0. Luego, para cada número que se necesita, se siguen estos pasos:
Aumenta 'i' en 1.
Calcula 'j' usando el valor actual de 'j' y el número en la S-box en la posición 'i'.
Intercambia los números en la S-box en las posiciones 'i' y 'j'.
Calcula 't' sumando los números en la S-box en las posiciones 'i' y 'j'.
El número en la S-box en la posición 't' es el siguiente número de la secuencia aleatoria.
Este proceso se repite para obtener más números de la secuencia.
RC4 es lo suficientemente simple como para ser usado rápidamente. Sin embargo, su seguridad depende mucho de cómo se implemente y se use. Por ejemplo, se descubrieron problemas importantes en cómo se usaba RC4 en el sistema WEP para redes inalámbricas.
Ejemplos de prueba de RC4
Estos ejemplos no son oficiales, pero sirven para probar si un programa que implementa RC4 funciona correctamente. Las claves y los mensajes originales están en texto normal (ASCII), y el resultado cifrado (texto cifrado) está en números hexadecimales. La "Keystream" es la secuencia de números aleatorios que genera RC4.
Clave | Keystream | Mensaje | Texto cifrado |
---|---|---|---|
Key |
eb9f7781b734ca72a7 |
Plaintext |
BBF316E8D940AF0AD3 |
Wiki |
6044db6d41 |
pedia |
1021BF0420 |
Secret |
04d46b053ca87b594172302aec9b |
Attack at dawn |
45A01F645FC35B383552544B9BF5 |
Cervantes |
287fdbeef86ccd89b1e1d7acd118e2664927f97d6f9aafc2 |
En un lugar de la mancha |
6D11FB9B964CA1FCD680A58CB57DC20A2807941C01F9C7A3 |
unsigned char S[256];
unsigned int i, j;
void swap(unsigned char *s, unsigned int i, unsigned int j) {
unsigned char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
/* KSA */
void rc4_init(unsigned char *key, unsigned int key_length) {
for (i = 0; i < 256; i++)
S[i] = i;
for (i = j = 0; i < 256; i++) {
j = (j + key[i % key_length] + S[i]) & 255;
swap(S, i, j);
}
i = j = 0;
}
/* PRGA */
unsigned char rc4_output() {
i = (i + 1) & 255;
j = (j + S[i]) & 255;
swap(S, i, j);
return S[(S[i] + S[j]) & 255];
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))
int main() {
unsigned char *test_vectors[][2] =
{
{"Key", "Plaintext"},
{"Wiki", "pedia"},
{"Secret", "Attack at dawn"}
};
int x;
for (x = 0; x < ARRAY_SIZE(test_vectors); x++) {
int y;
rc4_init(test_vectors[x][0], strlen((char*)test_vectors[x][0]));
for (y = 0; y < strlen((char*)test_vectors[x][1]); y++)
printf("%02X", test_vectors[x][1][y] ^ rc4_output());
printf("\n");
}
getch();
return 0;
}
Véase también
En inglés: RC4 Facts for Kids