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] RC significa "Rivest Cipher" o, alternativamente, "Ron's Code" (compare RC2 y RC4 ). El candidato RC6 al Estándar de cifrado avanzado (AES) se basó en RC5.
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 evaluación de dichas operaciones como una primitiva criptográfica . [ cita necesaria ] RC5 también consta de una serie de adiciones modulares y OR eXclusive (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. El programa clave, sin embargo, es más complejo, expandiendo la clave usando una función esencialmente unidireccional con las expansiones binarias de e y la proporción áurea como fuentes de " números de nada bajo la manga ". La tentadora simplicidad del algoritmo junto con la novedad de las rotaciones dependientes de los datos han convertido a RC5 en un objeto de estudio atractivo para los criptoanalistas. [¿ según quién? ] 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.
Tanto el cifrado como el descifrado RC5 expanden la clave aleatoria en 2 (r+1) palabras que se utilizarán secuencialmente (y solo una vez cada una) durante los procesos de cifrado y descifrado. Todo lo que aparece a continuación proviene del artículo revisado de Rivest sobre RC5. [3]
El algoritmo de expansión clave se ilustra a continuación, primero en pseudocódigo y luego en código C de ejemplo 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:
# Dividir K en palabras # u = w / 8 c = techo ( max ( 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 matriz S pseudoaleatoria independiente de clave # S está inicialmente en=2(r+1) lista de longitud de palabras de longitud w indefinidas S [ 0 ] = P_w para i = 1 a t - 1 do : S [ i ] = S [ yo - 1 ] + Q_w # El ciclo de programación de claves principales 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# devoluciones
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 funcionar con w = 32, r = 12 y b = 16.
void RC5_SETUP ( char unsigned * K ) { // w = 32, r = 12, b = 16 // c = max(1, ceil(8 * b/w)) // t = 2 * (r+1) PALABRA i , j , k , u = w / 8 , A , B , L [ c ]; para ( i = b -1 , L [ c -1 ] = 0 ; i != -1 ; i -- ) L [ i / u ] = ( L [ i / u ] << 8 ) + K [ i ] ; para ( 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 )); } }
El cifrado implicaba varias rondas de una función sencilla; aparentemente se recomiendan 12 o 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 variables:
A = A + S [ 0 ] B = B + S [ 1 ] para i = 1 para r hacer : A = (( A ^ B ) <<< B ) + S [ 2 * i ] B = (( B ^ A ) <<< A ) + S [ 2 * i + 1 ]# El bloque de texto cifrado consta de un bloque de dos palabras de ancho compuesto por A y B, en ese orden. devolver A , B
El código C de ejemplo proporcionado por Rivest es este.
void RC5_ENCRYPT ( PALABRA * pt , PALABRA * ct ) { PALABRA i , A = pt [ 0 ] + S [ 0 ], B = pt [ 1 ] + S [ 1 ]; para ( 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 ; }
El descifrado es una inversión bastante sencilla del proceso de cifrado. El siguiente pseudocódigo muestra el proceso.
para i = r hasta 1 haga : 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 , B
El código C de ejemplo proporcionado por Rivest es este.
vacío RC5_DECRYPT ( PALABRA * ct , PALABRA * pt ) { PALABRA i , B = ct [ 1 ], A = ct [ 0 ]; para ( i = r ; i > 0 ; i - ) { B = ROTR ( B - S [ 2 * i + 1 ], A ) ^ A ; A = ROTR ( A - S [ 2 * i ], B ) ^ B ; } puntos [ 1 ] = B - S [ 1 ]; pt [ 0 ] = A - S [ 0 ]; }
El 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 disparos como protección suficiente.
Varios de estos desafíos se han abordado utilizando 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. [4] Al 26 de julio de 2023, el 10,409% de los Se ha buscado el espacio de claves y, según la tasa registrada ese día, se necesitarían un poco más de 59 años para completar el 100% del espacio de claves. [5] La tarea ha inspirado muchos desarrollos nuevos y novedosos en el campo de la computación en clúster. [6]
RSA Security , que tenía una patente (ahora vencida) sobre el algoritmo, [7] 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. [4] Como resultado, se distribuyeron .net decidió financiar el premio monetario. La persona que descubra la clave ganadora recibirá 1.000 dólares estadounidenses, su equipo (si corresponde) recibirá 1.000 dólares estadounidenses y la Fundación para el Software Libre recibirá 2.000 dólares estadounidenses. [8]