Implementación de algoritmo AES estandarizado

Sep 29 2020

- Ojalá esta pregunta encaje aquí -

Una y otra vez, siempre hay una persona que preguntó sobre la creación de su propio estándar / cifrado de cifrado, y todos acordamos detenerlos desde el principio porque todos estamos de acuerdo en que es muy imprudente hacerlo (como prevenir debilidades desconocidas o invisibles en su estándar, etc.).

Mi pregunta curiosa es: ¿Qué hay de programar su propia biblioteca de, digamos, cifrado AES, en el idioma que elija? No está creando un nuevo cifrado (todavía se adhiere estrictamente al cifrado / algoritmo AES), sino simplemente escribiendo ese algoritmo en el lenguaje de programación de su elección (tal vez haga el cifrado AES de nuevo en C / C ++ para que podamos usar una nueva función incorporada en el nuevo gen CPU y hacerlo más rápido -> SOLO EJEMPLO) o alguien construyó un nuevo lenguaje de programación que aún no tiene biblioteca AES (y desea contribuir con una). ¿Sigue siendo prudente hacerlo?

Respuestas

8 SEJPM Sep 29 2020 at 18:55

¿Qué hay de programar su propia biblioteca de, digamos, cifrado AES, en el idioma que elija?

Implementar AES usted mismo de manera correcta no es demasiado difícil. La especificación está bien redactada, contiene ilustraciones y vectores de prueba intermedios para que prácticamente cualquiera pueda hacer eso.

Lo que es complicado para AES y la razón por la que generalmente no es aconsejable escribir una implementación lista para producción es escribir una implementación que sea razonablemente rápida y (/ o) resistente a los canales laterales de la CPU de software común.

Si aún desea que su idioma tenga una implementación AES, la forma habitual de hacerlo sería usar la interfaz de función externa para llamar a una biblioteca AES basada en C.

En cuanto a la implementación de AES usted mismo, si su lenguaje se compila en código de máquina, generalmente hay una forma de acceder a los intrínsecos para AES y, por lo general, hay poco que se pueda hacer mal, aparte de no permitir que la CPU canalice las instrucciones correctamente.

Si no tiene un lenguaje compilado con código de máquina y / o su CPU de destino no tiene instrucciones de hardware AES, las cosas se complican más. Debe asegurarse de que todo lo que escriba en su idioma no haga cosas extrañas durante la interpretación / compilación justo a tiempo para introducir accidentalmente instrucciones adicionales. Debe asegurarse de que la implementación siempre lleve la misma cantidad de tiempo, independientemente de la clave y los datos utilizados. Debe asegurarse de que el intérprete / compilador JIT / CPU no arruine el paso anterior. También debe asegurarse de que sus patrones de acceso a la memoria no dependan de datos secretos. La mayoría de estos puntos se pueden arreglar, por ejemplo, utilizando implementaciones de AES divididas en bits, pero esto, por supuesto, está lejos de ser una tarea trivial, especialmente si desea que la implementación sea razonablemente rápida.