RC5 - RC5

RC5
RC5 InfoBox Diagram.svg
Una ronda (dos medias rondas) del cifrado de bloque RC5
General
Diseñadores Ron Rivest
Publicado por primera vez 1994
Sucesores RC6 , Akelarre
Detalle de cifrado
Tamaños de clave 0 a 2040 bits (128 sugeridos)
Tamaños de bloque 32, 64 o 128 bits (se sugieren 64)
Estructura Red similar a Feistel
Rondas 1-255 (12 sugeridos originalmente)
Mejor criptoanálisis público
RC5 de 12 rondas (con bloques de 64 bits) es susceptible de un ataque diferencial utilizando 2 44 textos planos elegidos.

En criptografía , RC5 es un cifrado de bloque de clave simétrica que se destaca por su simplicidad. Diseñado por Ronald Rivest en 1994, RC significa "Rivest Cipher", o alternativamente, "Ron's Code" (comparar RC2 y RC4 ). El candidato de Estándar de cifrado avanzado (AES) RC6 se basó en RC5.

Descripción

A diferencia de muchos esquemas, RC5 tiene un tamaño de bloque variable (32, 64 o 128 bits ), tamaño de clave (0 a 2040 bits) y número de rondas (0 a 255). La elección de parámetros sugerida originalmente era un tamaño de bloque de 64 bits, una clave de 128 bits y 12 rondas.

Una característica clave de RC5 es el uso de rotaciones dependientes de datos; Uno de los objetivos de RC5 era impulsar el estudio y la evaluación de tales operaciones como primitiva criptográfica . RC5 también consta de una serie de adiciones modulares y OR exclusivos (XOR) . La estructura general del algoritmo es una red similar a Feistel . Las rutinas de cifrado y descifrado se pueden especificar en unas pocas líneas de código. El programa de claves, sin embargo, es más complejo, expandiendo la clave utilizando una función esencialmente unidireccional con las expansiones binarias tanto de e como de la proporción áurea como fuentes de " números sin nada bajo mi manga ". La tentadora simplicidad del algoritmo junto con la novedad de las rotaciones dependientes de los datos ha convertido a RC5 en un atractivo objeto de estudio para los criptoanalistas. El RC5 se denota básicamente como RC5-w / r / b donde w = tamaño de palabra en bits, r = número de rondas, b = número de bytes de 8 bits en la clave.

Algoritmo

El cifrado y el descifrado RC5 expanden la clave aleatoria en 2 (r + 1) palabras que se usarán secuencialmente (y solo una vez cada una) durante los procesos de cifrado y descifrado. Todo lo siguiente proviene del artículo revisado de Rivest sobre RC5.

Expansión clave

El algoritmo de expansión de claves se ilustra a continuación, primero en pseudocódigo, luego en un ejemplo de código C copiado directamente del apéndice del documento de referencia.

Siguiendo el esquema de nomenclatura del trabajo, se utilizan los siguientes nombres de variables:

  • w: la longitud de una palabra en bits, normalmente 16, 32 o 64. El cifrado se realiza en bloques de 2 palabras.
  • u = w / 8: la longitud de una palabra en bytes.
  • b: la longitud de la clave en bytes.
  • K []: la clave, considerada como una matriz de bytes (usando indexación basada en 0).
  • c - La longitud de la clave en palabras (o 1, si b = 0).
  • L []: una matriz de trabajo temporal que se utiliza durante la programación de claves. inicializado a la clave en palabras.
  • r: el número de rondas que se utilizarán al cifrar datos.
  • t = 2 (r + 1) - el número de subclaves redondas requeridas.
  • S []: las palabras de subclave redondas.
  • P w - La primera constante mágica, definida como , donde Odd es el número entero impar más cercano a la entrada dada, e es la base del logaritmo natural y w se define arriba. Para valores comunes de w , los valores asociados de P w se dan aquí en hexadecimal:
    • Para w = 16: 0xB7E1
    • Para w = 32: 0xB7E15163
    • Para w = 64: 0xB7E151628AED2A6B
  • Q w - La segunda constante mágica, definida como , donde Odd es el número entero impar más cercano a la entrada dada, donde es la proporción áurea , y w se define arriba. Para valores comunes de w , los valores asociados de Q w se dan aquí en hexadecimal:
    • Para w = 16: 0x9E37
    • Para w = 32: 0x9E3779B9
    • Para w = 64: 0x9E3779B97F4A7C15
# Break K into words
# u = w / 8
c = ceiling(max(b, 1) / u)
# L is initially a c-length list of 0-valued w-length words
for i = b-1 down to 0 do:
    L[i / u] = (L[i / u] <<< 8) + K[i]
     
# Initialize key-independent pseudorandom S array
# S is initially a t=2(r+1) length list of undefined w-length words
S[0] = P_w
for i = 1 to t-1 do:
    S[i] = S[i - 1] + Q_w
    
# The main key scheduling loop
i = j = 0
A = B = 0
do 3 * max(t, c) times:
    A = S[i] = (S[i] + A + B) <<< 3
    B = L[j] = (L[j] + A + B) <<< (A + B)
    i = (i + 1) % t
    j = (j + 1) % c

# return S

El código fuente de ejemplo se proporciona en el apéndice del artículo de Rivest sobre RC5. La implementación está diseñada para trabajar con w = 32, r = 12 y b = 16.

void RC5_SETUP(unsigned char *K)
{
   // w = 32, r = 12, b = 16
   // c = max(1, ceil(8 * b/w))
   // t = 2 * (r+1)
   WORD i, j, k, u = w/8, A, B, L[c];
   
   for (i = b-1, L[c-1] = 0; i != -1; i--)
      L[i/u] = (L[i/u] << 8) + K[i];
   
   for (S[0] = P, i = 1; i < t; i++)
      S[i] = S[i-1] + Q;
   
   for (A = B = i = j = k = 0; k < 3 * t; k++, i = (i+1) % t, j = (j+1) % c)
   {
      A = S[i] = ROTL(S[i] + (A + B), 3);
      B = L[j] = ROTL(L[j] + (A + B), (A + B));
   }
}

Cifrado

El cifrado implicó varias rondas de una función simple. Parece que se recomiendan 12 o 20 rondas, según las necesidades de seguridad y las consideraciones de tiempo. Más allá de las variables utilizadas anteriormente, las siguientes variables se utilizan en este algoritmo:

  • A, B: las dos palabras que componen el bloque de texto sin formato que se va a cifrar.
A = A + S[0]
B = B + S[1]
for i = 1 to r do:
    A = ((A ^ B) <<< B) + S[2 * i]
    B = ((B ^ A) <<< A) + S[2 * i + 1]

# The ciphertext block consists of the two-word wide block composed of A and B, in that order.
return A, B

El ejemplo de código C proporcionado por Rivest es este.

void RC5_ENCRYPT(WORD *pt, WORD *ct)
{
   WORD i, A = pt[0] + S[0], B = pt[1] + S[1];
   
   for (i = 1; i <= r; i++)
   {
      A = ROTL(A ^ B, B) + S[2*i];
      B = ROTL(B ^ A, A) + S[2*i + 1];
   }
   ct[0] = A; ct[1] = B;
}

Descifrado

El descifrado es una inversión bastante sencilla del proceso de cifrado. El pseudocódigo siguiente muestra el proceso.

for i = r down to 1 do:
    B = ((B - S[2 * i + 1]) >>> A) ^ A
    A = ((A - S[2 * i]) >>> B) ^ B
B = B - S[1]
A = A - S[0]

return A, B

El ejemplo de código C proporcionado por Rivest es este.

void RC5_DECRYPT(WORD *ct, WORD *pt)
{
   WORD i, B=ct[1], A=ct[0];
   
   for (i = r; i > 0; i--)
   {
      B = ROTR(B - S[2*i + 1], A) ^ A;
      A = ROTR(A - S[2*i], B) ^ B;
   }
   
   pt[1] = B - S[1]; pt[0] = A - S[0];
}

Criptoanálisis

RC5 de 12 rondas (con bloques de 64 bits) es susceptible de un ataque diferencial utilizando 2 44 textos planos elegidos. Se sugieren 18-20 rondas como protección suficiente.

Varios de estos problemas se han abordado mediante la informática distribuida , organizada por Distributed.net . Distributed.net tiene mensajes RC5 de fuerza bruta cifrados con claves de 56 y 64 bits y ha estado trabajando para descifrar una clave de 72 bits desde el 3 de noviembre de 2002. Al 6 de agosto de 2021, el 7,900% del espacio de claves ha sido buscado y basado en la tasa registrada ese día, tomaría 127 años completar el 100% del espacio de claves. La tarea ha inspirado muchos desarrollos nuevos y novedosos en el campo de la computación en clúster.

RSA Security , que tenía una patente sobre el algoritmo, ofreció una serie de premios de US $ 10.000 por descifrar textos cifrados con RC5, pero estos concursos se suspendieron en mayo de 2007. Como resultado, distribution.net decidió financiar el premio monetario. La persona que descubra la clave ganadora recibirá US $ 1,000, su equipo (si corresponde) recibirá US $ 1,000 y la Free Software Foundation recibirá US $ 2,000.

Ver también

Referencias

enlaces externos