En criptografía , RC5 es un cifrado de bloques de clave simétrica que destaca por su simplicidad. Diseñado por Ronald Rivest en 1994, [ 2 ] según Ron Rivest, RC significa "Ron's Code" [ 3 ] pero su documentación solo lo denomina RC5. [ 2 ] El candidato al Estándar de Cifrado Avanzado (AES), RC6 , se basó en RC5.
Descripción
A diferencia de muchos otros sistemas, RC5 tiene un tamaño de bloque variable (32, 64 o 128 bits ), un tamaño de clave (de 0 a 2040 bits) y un número de rondas (de 0 a 255). La configuración original sugerida para estos parámetros 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 dichas operaciones como una primitiva criptográfica . RC5 también consta de varias sumas modulares y OR exclusivo (XOR) . La estructura general del algoritmo es una red tipo Feistel , similar a RC2. Las rutinas de cifrado y descifrado se pueden especificar en unas pocas líneas de código. Sin embargo, la planificación de la clave es más compleja, expandiendo la clave mediante una función esencialmente unidireccional con las expansiones binarias tanto de e como de la proporción áurea como fuentes de " números ocultos ". La tentadora simplicidad del algoritmo, junto con la novedad de las rotaciones dependientes de datos, ha convertido a RC5 en un objeto de estudio atractivo para los criptoanalistas. 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 en la clave.
Algoritmo
Tanto el cifrado como 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 que sigue proviene del artículo revisado de Rivest sobre RC5. [ 4 ]
Expansión clave
El algoritmo de expansión de claves se ilustra a continuación, primero en pseudocódigo y luego con un ejemplo de código C copiado directamente del apéndice del artículo de referencia.
Siguiendo el esquema de nomenclatura del artículo, 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 (utilizando indexación basada en 0).
- c – La longitud de la clave en palabras (o 1, si b = 0).
- L[] – Un arreglo de trabajo temporal utilizado durante la programación de claves, inicializado con la clave en palabras.
- r – El número de rondas que se utilizarán al cifrar los datos.
- t = 2( r +1) – el número de subclaves de ronda requeridas.
- S[] – Las palabras clave subcentrales redondas.
- P w – La primera constante mágica, definida como Odd(( e − 2) × 2 w ) , donde Odd es el entero impar más cercano a la entrada dada, e es la base del logaritmo natural y w se define anteriormente. 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 Odd((𝜙 − 1) × 2 w ) , donde Odd es el entero impar más cercano a la entrada dada, donde 𝜙 es la proporción áurea y w se define anteriormente. 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
# Dividir K en palabras # u = w / 8 c = techo ( máx ( b , 1 ) / u ) # L es inicialmente una lista de longitud c de palabras de longitud w con valor 0 para i = b - 1 hasta 0 hacer : L [ i / u ] = ( L [ i / u ] <<< 8 ) + K [ i ]# Inicializar un array pseudoaleatorio S independiente de la clave # S es inicialmente una lista de longitud 2(r+1) de palabras de longitud w indefinida S [ 0 ] = P_w para i = 1 a t - 1 hacer : S [ i ] = S [ i - 1 ] + Q_w# El bucle principal de programación de claves i = j = 0 A = B = 0 hacer 3 * max ( t , c ) veces : 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# devolver SEl 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 funcionar 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 ; para ( 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 implicaba varias rondas de una función simple, recomendándose aparentemente entre 12 y 20 rondas, dependiendo de las necesidades de seguridad y las consideraciones de tiempo. Además de las variables utilizadas anteriormente, en este algoritmo se utilizan las siguientes:
- A, B - Las dos palabras que componen el bloque de texto plano que se va a cifrar.
A = A + S [ 0 ] B = B + S [ 1 ] para i = 1 a r hacer : A = (( A ^ B ) <<< B ) + S [ 2 * i ] B = (( B ^ A ) <<< A ) + S [ 2 * i + 1 ]# El bloque de texto cifrado consta del bloque de dos palabras de ancho compuesto por A y B, en ese orden. Devuelve A , BEl código C de ejemplo 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 un proceso bastante sencillo que revierte el cifrado. El siguiente pseudocódigo muestra el proceso.
para i = r hasta 1 hacer : B = (( B - S [ 2 * i + 1 ] ) >>> A ) ^ A A = (( A - S [ 2 * i ]) >>> B ) ^ B B = B - S [ 1 ] A = A - S [ 0 ]devolver A , BEl código C de ejemplo 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 doce rondas (con bloques de 64 bits) es susceptible a un ataque diferencial utilizando 2 44 textos planos elegidos. [ 1 ] Se sugieren entre 18 y 20 rondas como protección suficiente.
Varios de estos problemas desafiantes se han abordado utilizando computación distribuida , organizada por Distributed.net . Distributed.net ha realizado ataques de fuerza bruta a mensajes RC5 cifrados con claves de 56 y 64 bits y ha estado trabajando en el descifrado de una clave de 72 bits desde el 3 de noviembre de 2002. [ 5 ] Al 26 de noviembre de 2025, se había explorado el 14,971% del espacio de claves y, según la tasa registrada ese día, se tardaría un poco más de 43 años en completar el 100% del espacio de claves. [ 6 ] La tarea ha inspirado muchos desarrollos nuevos e innovadores en el campo de la computación en clúster. [ 7 ]
RSA Security , que poseía una patente (ya caducada) sobre el algoritmo, [ 8 ] ofreció una serie de premios de 10 000 dólares estadounidenses por descifrar textos cifrados con RC5, pero estos concursos se suspendieron en mayo de 2007. [ 5 ] Como resultado, distributed.net decidió financiar el premio monetario. La persona que descubra la clave ganadora recibirá 1000 dólares estadounidenses, su equipo (si corresponde) recibirá 1000 dólares estadounidenses y la Free Software Foundation recibirá 2000 dólares estadounidenses. [ 9 ]
Véase también
Referencias
- 1 2 Biryukov, Alex ; Kushilevitz, Eyal (31 de mayo de 1998). Criptoanálisis mejorado de RC5 (PDF) . EUROCRYPT 1998. doi : 10.1007/BFb0054119 .
- 1 2 Rivest, RL (1994). "El algoritmo de cifrado RC5" (PDF) . Actas del Segundo Taller Internacional sobre Cifrado Rápido de Software (FSE) 1994e . págs. 86–96 . Archivado del original (PDF) el 17 de abril de 2007. Recuperado el 18 de diciembre de 2004 .
- ↑ "Preguntas frecuentes sobre Rivest en csail.mit.edu" .
- ↑ "El algoritmo de cifrado RC5" (PDF) . people.csail.mit.edu . Archivado del original (PDF) el 21 de septiembre de 2018.
- 1 2 "distributed.net: Proyecto RC5" . www.distributed.net . Consultado el 14 de diciembre de 2019 .
- ↑ "stats.distributed.net - Estadísticas generales del proyecto RC5-72" . stats.distributed.net .
- ↑"PlayStation 3 supercomputer places UMass Dartmouth #1 in the world in code cracking challenge list" (Press release). University of Massachusetts Dartmouth. 24 September 2014. Archived from the original on 2022-06-29. Retrieved 2024-01-24.
- ↑Rivest, R. L, "Block Encryption Algorithm With Data Dependent Rotation", U.S. patent 5,724,428, issued on 3 March 1998, expired 1 November 2015.
- ↑"distributed.net: staff blogs – 2008 – September – 08". Retrieved 15 December 2019.
External links
- Rivests's revised paper describing the cipher
- Rivest's original paper
- SCAN's entry for the cipher
- RSA Laboratories FAQ — What are RC5 and RC6?
- Helger Lipmaa's links on RC5
- Cifrados de bloques
- Cifrados de bloques rotos