Pez globo (cifrado)
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.
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 1 | XOR la mitad izquierda (L) de los datos con el r entrada de rayos |
Medida 2 | Utilice los datos XORed como entrada para la función F de Blowfish |
Medida 3 | XOR la salida de la función F con la mitad derecha (R) de los datos |
Medida 4 | Swap 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
Futurama (Feria Mundial de Nueva York)