Pez globo (cifrado)

format_list_bulleted Contenido keyboard_arrow_down
ImprimirCitar
Cifra de bloques

Blowfish es un cifrado de bloque de clave simétrica, diseñado en 1993 por Bruce Schneier e incluido en muchos conjuntos de cifrado y productos de cifrado. Blowfish proporciona una buena tasa de cifrado en el software, y hasta la fecha no se ha encontrado ningún criptoanálisis eficaz. Sin embargo, el estándar de cifrado avanzado (AES) ahora recibe más atención y Schneier recomienda Twofish para aplicaciones modernas.

Schneier diseñó Blowfish como un algoritmo de propósito general, pensado como una alternativa al antiguo DES y libre de los problemas y restricciones asociados con otros algoritmos. En el momento en que se lanzó Blowfish, muchos otros diseños eran propietarios, estaban gravados por patentes o eran secretos comerciales o gubernamentales. Schneier ha declarado que "Blowfish no está patentado y seguirá siéndolo en todos los países. Por la presente, el algoritmo se coloca en el dominio público y cualquier persona puede utilizarlo libremente."

Las características notables del diseño incluyen S-boxes dependientes de llaves y un programa de llaves muy complejo.

El algoritmo

Blowfish tiene un tamaño de bloque de 64 bits y una longitud de clave variable desde 32 bits hasta 448 bits. Es un cifrado Feistel de 16 rondas y utiliza grandes S-boxes dependientes de claves. En estructura se parece a CAST-128, que utiliza cajas S fijas.

La estructura Feistel de Blowfish

El diagrama adyacente muestra la rutina de cifrado de Blowfish. Cada línea representa 32 bits. Hay cinco matrices de subclaves: una matriz P de 18 entradas (indicada como K en el diagrama, para evitar confusiones con el texto sin formato) y cuatro cajas S de 256 entradas (S0, S1, S2 y S3).

Cada ronda r consta de 4 acciones:

Medida 1XOR la mitad izquierda (L) de los datos con el r entrada de rayos
Medida 2Utilice los datos XORed como entrada para la función F de Blowfish
Medida 3XOR la salida de la función F con la mitad derecha (R) de los datos
Medida 4Swap L y R

La función F divide la entrada de 32 bits en cuatro cuartos de 8 bits y usa los cuartos como entrada para las cajas S. Las cajas S aceptan entradas de 8 bits y producen salidas de 32 bits. Las salidas se agregan módulo 232 y XORed para producir la salida final de 32 bits (ver imagen en la esquina superior derecha).

Después de la ronda 16, deshaga el último intercambio y XOR L con K18 y R con K17 (blanqueamiento de salida).

El descifrado es exactamente igual que el cifrado, excepto que P1, P2,..., P18 se usan en el orden inverso. Esto no es tan obvio porque xor es conmutativo y asociativo. Un concepto erróneo común es usar el orden inverso de cifrado como algoritmo de descifrado (es decir, primero XORing P17 y P18 al bloque de texto cifrado, luego usando las entradas P en orden inverso).

El programa clave de Blowfish comienza con la inicialización de la matriz P y las cajas S con valores derivados de los dígitos hexadecimales de pi, que no contienen un patrón obvio (no veo ningún número bajo la manga). Luego, la clave secreta, byte por byte, ciclando la clave si es necesario, se somete a XOR con todas las entradas P en orden. A continuación, se cifra un bloque de ceros de 64 bits con el algoritmo tal como está. El texto cifrado resultante reemplaza a P1 y P2. Luego, el mismo texto cifrado se cifra nuevamente con las nuevas subclaves, y el nuevo texto cifrado reemplaza a P3 y P4. Esto continúa, reemplazando toda la matriz P y todas las entradas de la caja S. En total, el algoritmo de cifrado de Blowfish se ejecutará 521 veces para generar todas las subclaves: se procesan alrededor de 4 KB de datos.

Debido a que la matriz P tiene una longitud de 576 bits y los bytes de clave se someten a XOR a través de todos estos 576 bits durante la inicialización, muchas implementaciones admiten tamaños de clave de hasta 576 bits. El motivo es una discrepancia entre la descripción original de Blowfish, que usa claves de 448 bits, y su implementación de referencia, que usa claves de 576 bits. Los vectores de prueba para verificar implementaciones de terceros también se produjeron con claves de 576 bits. Cuando se le preguntó qué versión de Blowfish es la correcta, Bruce Schneier respondió: "Los vectores de prueba deben usarse para determinar el verdadero Blowfish".

Otra opinión es que el límite de 448 bits está presente para garantizar que cada bit de cada subclave dependa de cada bit de la clave, ya que los últimos cuatro valores de la matriz P no afectan cada bit del texto cifrado.. Este punto debe tenerse en cuenta para implementaciones con diferente número de rondas, ya que si bien aumenta la seguridad frente a un ataque exhaustivo, debilita la seguridad garantizada por el algoritmo. Y dada la lenta inicialización del cifrado con cada cambio de clave, se le otorga una protección natural contra ataques de fuerza bruta, lo que realmente no justifica tamaños de clave superiores a 448 bits.

Blowfish en pseudocódigo

uint32_t P[18];uint32_t S[4[ ]256];uint32_t f ()uint32_t x) {} uint32_t h = S[0[ ]x > 24] + S[1[ ]x > 16 " 0xff]; retorno () h ^ S[2[ ]x > 8 " 0xff] ) + S[3[ ]x " 0xff];}vacío blowfish_encrypt()uint32_t *L, uint32_t *R) {} para ()corto r = 0; r . 16; r++) {}*L = *L ^ P[r];*R = f()*L) ^ *R;Swap()L, R);}Swap()L, R);*R = *R ^ P[16];*L = *L ^ P[17];}vacío blowfish_decrypt()uint32_t *L, uint32_t *R) {}para ()corto r = 17; r  1; r--) {}*L = *L ^ P[r];*R = f()*L) ^ *R;Swap()L, R);}Swap()L, R);*R = *R ^ P[1];*L = *L ^ P[0];} //... // inicialización de los P-array y S-boxes con valores derivados de pi; omitido en el ejemplo (puede encontrarlos abajo) //... {}/* inicializar la caja P w / llave*/uint32_t k;para ()corto i = 0, p = 0; i . 18; i++) {}k = 0x00;para ()corto j = 0; j . 4; j++) {}k = ()k .. 8) Silencio ()uint8_t) clave[p];p = ()p + 1) % key_len;}P[i] ^= k;} /* ampliación de la llave del pez globo (521 iteraciones) */uint32_t l = 0x00, r = 0x00;para ()corto i = 0; i . 18; i+=2) {}blowfish_encrypt()"l, "r);P[i] = l; P[i+1] = r;}para ()corto i = 0; i . 4; i++) {}para ()corto j = 0; j . 256; j+=2) {}blowfish_encrypt()"l, "r);S[i[ ]j] = l;S[i[ ]j+1] = r;}}}

Pez globo en la práctica

Blowfish es un cifrado de bloque rápido, excepto cuando se cambia de clave. Cada nueva clave requiere el preprocesamiento equivalente a cifrar unos 4 kilobytes de texto, lo que es muy lento en comparación con otros cifrados de bloque. Esto impide su uso en ciertas aplicaciones, pero no es un problema en otras.

En una aplicación, el cambio lento de clave de Blowfish es en realidad un beneficio: el método de hash de contraseña (crypt $2, es decir, bcrypt) utilizado en OpenBSD usa un algoritmo derivado de Blowfish que hace uso de la programación de clave lenta; la idea es que el esfuerzo computacional adicional requerido brinde protección contra ataques de diccionario. Ver ampliación de teclas.

Blowfish tiene una huella de memoria de poco más de 4 kilobytes de RAM. Esta restricción no es un problema ni siquiera para las computadoras de escritorio y portátiles más antiguas, aunque impide su uso en los sistemas integrados más pequeños, como las primeras tarjetas inteligentes.

Blowfish fue uno de los primeros cifrados de bloque seguros que no está sujeto a ninguna patente y, por lo tanto, está disponible gratuitamente para que cualquiera lo use. Este beneficio ha contribuido a su popularidad en el software criptográfico.

bcrypt es una función de hash de contraseñas que, combinada con un número variable de iteraciones ('costo' de trabajo), aprovecha la costosa fase de configuración de claves de Blowfish para aumentar la carga de trabajo y la duración de los cálculos de hash, reduciendo aún más amenazas de ataques de fuerza bruta.

bcrypt es también el nombre de una utilidad de cifrado de archivos multiplataforma desarrollada en 2002 que implementa Blowfish.

Debilidad y sucesores

El uso de Blowfish de un tamaño de bloque de 64 bits (a diferencia de, por ejemplo, el tamaño de bloque de 128 bits de AES) lo hace vulnerable a los ataques de cumpleaños, especialmente en contextos como HTTPS. En 2016, el ataque SWEET32 demostró cómo aprovechar los ataques de cumpleaños para realizar la recuperación de texto sin formato (es decir, descifrar texto cifrado) contra cifrados con un tamaño de bloque de 64 bits. El proyecto GnuPG recomienda que Blowfish no se utilice para cifrar archivos de más de 4 GB debido a su pequeño tamaño de bloque.

Se sabe que una variante de ronda reducida de Blowfish es susceptible a ataques de texto sin formato conocido en claves con reflejos débiles. Las implementaciones de Blowfish utilizan 16 rondas de cifrado y no son susceptibles a este ataque.

Bruce Schneier ha recomendado migrar a su sucesor de Blowfish, Twofish.

Contenido relacionado

Premio ig nobel

Richard Jordan Gatling

Richard Jordan Gatling fue un inventor estadounidense mejor conocido por su invención de la pistola Gatling, que se considera la primera ametralladora...

Futurama (Feria Mundial de Nueva York)

Más resultados...
Tamaño del texto:
undoredo
format_boldformat_italicformat_underlinedstrikethrough_ssuperscriptsubscriptlink
save