GCM (Galois / Counter Mode), en particular en combinación con AES, ha sido un estándar de oro de facto durante años. Cifrar y autenticar en un solo paso, eso es demasiado asombroso, y términos como AEAD funcionan bien para impresionar a una chica, por lo que sería beneficioso para ambas partes. Pero, broma aparte …
He Siempre me pregunté qué lo hace tan especial, y cuanto más lo pienso, menos lo entiendo. Si lo miras, entonces la magia general no es tan asombrosa en absoluto. O tal vez, tal vez soy demasiado estúpido para asimilarlo (de ahí mi pregunta).
Mis pensamientos:
En primer lugar, GCM es una forma de modo contador . Lo que significa que, a diferencia de p. Ej. encadenamiento de bloques de cifrado, la salida de un bloque depende exactamente de un bloque de entrada. Peor aún: puede modificar un solo bit y el resultado descifrado diferirá exactamente en ese bit. Porque si eres honesto, un cifrado de bloque en modo contador no es un » cifrado de bloque » en absoluto, sino un PRNG (con clave) seguido de una operación XOR. Básicamente, un cifrado de flujo » bloque «. No se necesita mucho para imaginar un escenario en el que alguien pueda abusar de esto para cambiar los mensajes de una manera dañina (por ejemplo, cambiar la transacción «: +5,000 \ $ » a » transacción: -5,000 \ $ «). Los cifrados en bloque normalmente tienen la propiedad innata de convertirse en un galimatías completo al voltear un solo bit (más, con el encadenamiento, todo el resto del mensaje). Esa es en realidad una propiedad bastante agradable y deseable, que acabamos de tirar por la borda sin una buena razón.
Claro, con el autenticador , el ataque anterior es difícil de lograr ya que se descubrirá la manipulación. Pero básicamente, el autenticador solo soluciona el problema que la elección del modo de operación introdujo .
GHASH es una MAC que admite datos autenticados adicionales. Por lo que puedo decir, eso es una mentira total. O llámelo » exageración optimista » si lo desea. Es solo una función de compresión con matemáticas no intuitivas (para no matemáticos) detrás, pero al final no hace más que una simple multiplicación y tira la mitad de los bits de entrada con el equivalente de » desbordamiento «. Que es exactamente lo que, con matemáticas más mundanas, se puede hacer en dos líneas de código C por bloque dentro de una docena de ciclos (o si está de acuerdo con el uso de multiplicaciones de 32 bits en lugar de 64, se puede hacer en paralelo, por ejemplo, con AVX2 » s vpmulld para dos bloques completos en ~ 4 ciclos).
Aquellos que todavía recuerdan IDEA recordarán que usaron el mod 2 de suma 16 y el mod de multiplicación 2 16 + 1 como S-boxes que tenían la agradable propiedad de ser reversibles (algo necesario si desea descifrar). Desafortunadamente, esto no se pudo extender a 32 bits porque 2 32 +1 no es número primo, por lo que no se garantiza que todas las entradas sean relativamente primos y, por lo tanto, tiene problemas para invertir la operación. Pero … eso está muy bien en nuestro caso, no queremos ¡Nuestra función de compresión sea invertible! Entonces, » simple «, ¿la multiplicación ordinaria también debería funcionar?
Entonces, esa compresión simple, no especial ni mágica la función pasa a ser inicializada con la clave y el IV, lo que incidentalmente hace que la salida final dependa de la clave de una forma u otra, por lo que esa función ordinaria se convierte efectivamente en un MAC. Si tiene » datos adicionales «, simplemente introdúzcalos en el hash antes de cifrar sus datos, listo. Nuevamente, eso no es algo súper especial.
En general, no es nada que no puedas lograr con casi cualquier otra función hash también.
Ahora, Galois / counter supone que se debe usar el modo de contador. El modo de contador (y sus derivados), así como GHASH, tienen la ventaja de que puede cifrar / descifrar bloques en paralelo. Además, GHASH es trivialmente paralelizable.
Sí, rendimiento ! Pero seamos honestos, ¿es esto realmente una ventaja, o más bien una gran desventaja ?
¿Importa cuánto tiempo lleva descifrar un gigabyte o un terabyte mensaje, y qué tan bien puede paralelizar ese trabajo? ¿O aplicaciones en las que absolutamente desea poder » buscar » en posiciones aleatorias? Bueno, hay aplicaciones en las que eso puede importar, seguro. Me viene a la mente el cifrado de disco completo. Pero no querrá usar GCM en ese caso, ya que desea que el tamaño de entrada y el tamaño de salida sean idénticos.
Para un servidor ocupado (o VPN), importará, o eso parece , pero estos pueden procesar cualquier cosa en paralelo de todos modos, ya que tienen muchas conexiones simultáneas.Por lo tanto, si puede o no paralelizar una secuencia, realmente no hace ninguna diferencia en general. ¿Qué pasa con las aplicaciones donde hay pocas conexiones? Bueno, normalmente no transmite terabytes de datos a través de una terminal de inicio de sesión y, si lo hace, su conexión a Internet probablemente sea el factor limitante de todos modos, ya que el rendimiento de un solo núcleo supera fácilmente al ancho de banda GbE incluso en procesadores de escritorio de 7-8 años .
Muy bien, es posible que tenga que esperar 2-3 segundos más cuando extraiga un archivo 7z cifrado de 2TB en su disco duro (si crear miles de entradas de directorio no es realmente el cuello de botella, que me inclino a creo que será el caso). ¿Con qué frecuencia lo ha hecho durante el último año? Yo: cero veces.
Los únicos para quienes realmente hace una diferencia es el » malos «, es decir, exactamente aquellos a quienes no quieres que tengan una vida fácil. Efectivamente, si puede paralelizar trivialmente, los ataques se vuelven mucho más fáciles. Lanza una sala llena de hardware dedicado (GPU, FPGA, lo que sea) al problema y déjalo desaparecer. ¿No se necesita comunicación entre los nodos? Bueno, perfecto, no puede ser mejor.
¿Es esto realmente una ventaja? No lo sé, para mí parece una gran desventaja. En todo caso, me gustaría hacer que la paralelización sea lo más difícil posible, no tan fácil como sea posible.
Así que … suficiente reflexión, y a la pregunta:
¿Cuál es el algo fundamental que me falta de GCM que lo hace tan increíble que debería usarlo absolutamente?
Comentarios
- Pero, ¿quiénes son los » malos » es imposible de definir. Y eso tiene un impacto ENORME en las recomendaciones gubernamentales y las respuestas en este foro.
Responder
TL; DR: GCM proporciona un rendimiento excelente con las mejores propiedades de seguridad que esperamos de los cifrados actuales (AEAD).
GCM usa CTR para construir un cifrado de flujo. Este es un método bien estudiado, que tiene solo un inconveniente: absolutamente necesita algo de autenticación para evitar el cambio de bits. Antes de GCM, CTR-then-MAC era la solución. Una de las principales ventajas de los cifrados de flujo es la ausencia de ataques de relleno (porque no hay necesidad de relleno). Otra ventaja es que AES-CTR puede beneficiarse de las instrucciones AES-NI.
GCM es CTR-then-MAC con mejor rendimiento . Una mejora clave sobre CRT-then-MAC es la capacidad de superponer la ejecución del cifrado y la autenticación. Además, se ha demostrado que es seguro en el modelo de seguridad concreto y no está gravado por patentes, por lo que es una obviedad usarlo.
Tiene algunos inconvenientes: no es eficiente en hardware integrado y es difícil de implementar de manera eficiente. El último punto se contrarresta mediante el uso de bibliotecas escritas por otros. Sin embargo, esas son las razones por las que xchacha20-poly1305 se hizo popular sobre GCM.
Comentarios
- Yo diría que otra razón por la que ChaCha20 ha ganado popularidad es porque no AES. No ‘ no me malinterpretes, AES es un gran algoritmo, pero poner literalmente todos nuestros huevos en una canasta quizás no sea la más inteligente de todas las ideas. Y tener otro algoritmo bien probado además de AES es bastante valioso
- @ MechMK1 Estoy de acuerdo con usted , pero no escribí que son todas las razones de la popularidad de ChaCha20 ‘, porque eso ‘ No es la pregunta que se hace aquí. Mi punto era t hat GCM no se considera » impresionante » como piensa el OP.
- Absolutamente cierto. ‘ no es un ganso de oro, pero nadie fue despedido por usar AES-GCM, por así decirlo.
- Y ‘ no está gravado por patentes.
- @StephenTouset Gracias, edité mi publicación para incluir su comentario.
Respuesta
En primer lugar, GCM es una forma de modo contador. Lo que significa que, a diferencia de p. Ej. encadenamiento de bloques de cifrado, la salida de un bloque depende exactamente de un bloque de entrada. Peor aún: puede modificar un solo bit y el resultado descifrado diferirá exactamente en ese bit. Porque si eres honesto, un cifrado de bloque en modo contador no es un «cifrado de bloque» en absoluto, sino un PRNG (con clave) seguido de una operación XOR. Básicamente, un cifrado de flujo «en bloques». No se necesita mucho para imaginar un escenario en el que alguien pueda abusar de esto para cambiar los mensajes de una manera dañina (por ejemplo, cambiar «transacción: +5,000 \ $» por «transacción: -5,000 \ $»).
La autenticación de mensajes que GCM pone encima de CTR hace que su maleabilidad sea intrascendente.
Los cifrados de bloque normalmente tienen la propiedad innata de convertirse en un galimatías completo al voltear un solo bit (más, con el encadenamiento, el resto completo del mensaje) . Esa es en realidad una propiedad muy agradable y deseable, que acabamos de tirar por la borda sin una buena razón.
Esto es muy, muy incorrecto. En primer lugar , El modo CBC también adolece de una especie de debilidad de maleabilidad; si inviertes un poco del texto cifrado, solo codificas un bloque y voltea el bit correspondiente del bloque de red. Y hay otros ataques de maleabilidad contra CBC; ver, por ejemplo, el ataque EFail .
De manera más general, su idea informal de que los mensajes «se conviertan en un galimatías completo» no es lo suficientemente buena. Es absolutamente necesario que las computadoras detecten mecánicamente, con una respuesta definitiva de «sí / no», cuando se ha falsificado un mensaje encriptado. Confiar en que un humano estará en el bucle lo suficientemente temprano para detectar «galimatías» no es suficiente.
GHASH es una MAC que admite datos autenticados adicionales. Por lo que puedo decir, es una mentira absoluta. O llámelo «exageración optimista» si lo desea. Es sólo una función de compresión con matemáticas no intuitivas (para no matemáticos) detrás, pero al final no hace nada más que una simple multiplicación y tira la mitad de los bits de entrada con el equivalente de «desbordamiento».
El MAC no deja de funcionar porque los usuarios no entienden las matemáticas. Eso es como decir que la gente no puede ver televisión por satélite porque no «No sé cálculo. Los MAC de campo finito son una construcción estándar, conocida desde hace décadas.
Que es exactamente lo que, con matemáticas más mundanas, se puede hacer en dos líneas de C código por bloque dentro de una docena de ciclos (o si está de acuerdo con el uso de multiplicaciones de 32 bits en lugar de 64, se puede hacer en paralelo, por ejemplo, con vpmulld de AVX2 para dos bloques completos en ~ 4 ciclos).
Existe un debate real sobre si los MAC basados en campos de Galois como GHASH, o los MAC basados en campos principales como Poly1305, son una opción más práctica. Mucho de esto depende de las compensaciones entre diseñar MAC para enfatizar las implementaciones de software y hardware; por ejemplo, las multiplicaciones de campo de Galois son una pesadilla en el software, pero mucho más simples que las multiplicaciones aritméticas en el hardware. Una buena parte de las compensaciones también depende de la vulnerabilidad a los ataques de canal lateral, por ejemplo, análisis de potencia .
Pero no hay un debate sobre si los campos de Galois o los campos principales son fundamentalmente insospechados. Dakota del Norte. Las matemáticas se verifican en ambos.
¡Sí, rendimiento! Pero seamos honestos, ¿es esto realmente una ventaja, o más bien una gran desventaja?
Dígaselo a los interminables desfiles de ingenieros a lo largo de las décadas que se han resistido a agregar cifrado a los productos debido al rendimiento. Y no piense simplemente en PC potentes; piense en dispositivos integrados y tenga mucho miedo del Internet de las cosas.
Quiero decir, este no es un problema muerto en absoluto. Durante los últimos dos años hubo un intenso debate y el desarrollo de una nueva construcción criptográfica para admitir el cifrado de disco completo en dispositivos Android de gama baja que fueron evaluados no lo suficientemente potente para los algoritmos basados en AES que Android ofrecía antes.
Los únicos para quienes [el rendimiento] realmente marca la diferencia son los «chicos malos», es decir, exactamente aquellos a los que no quieres tener vida fácil. Efectivamente, si puedes paralelizar trivialmente, los ataques se vuelven mucho más fáciles. Lanza una sala llena de hardware dedicado (GPU, FPGA, lo que sea) al problema y deja que se resuelva.
Los cifrados resuelven esto utilizando tamaños de clave suficientemente grandes, no haciendo que los cifrados se ralenticen. La preocupación que está planteando surge en la criptografía basada en contraseñas donde no «No tengo claves secretas suficientemente entrópicas. Las claves simétricas de 256 bits siempre serán lo suficientemente grandes como para derrotar cualquier ataque de fuerza bruta en nuestro universo.
¿Qué es ¿Qué es lo fundamental que me falta de GCM que lo hace tan increíble que deberías usarlo?
No tienes que usar GCM en absoluto . Es al mismo tiempo:
- Fundamentall y sonido y muy ampliamente soportado en hardware;
- Abrumado por una serie de inconvenientes que no mencionó, como un rendimiento deficiente del software y una falla catastrófica de autenticidad en la reutilización de nonce, que a menudo lo descalifican en algunos contextos prácticos .
Si tiene hardware que tiene soporte nativo AES-GCM y software bien auditado que lo aprovecha, sería imprudente no tenerlo entre sus principales candidatos.