¿Existe un esquema de cifrado preferido para cifrar las compilaciones de firmware en una memoria flash externa?

3

Tengo un producto que se va a implementar en grandes cantidades, y quiero maximizar el problema que alguien va a pasar para realizar una ingeniería inversa (un alto nivel de seguridad). Es un producto conectado a Internet basado en un microcontrolador STM32 que se conecta a un servidor para recuperar sus blobs de actualización de firmware y lo almacena en una memoria flash externa.

Aquí hay algunos datos sobre la situación:

  • ~ 1 tamaño de compilación del firmware de Megabyte
  • No hay acelerador de hardware de cifrado en el chip
  • Dado que el proceso DFU se está bloqueando (el sistema deja de funcionar), necesitamos que el proceso de descifrado sea lo más rápido posible

Dado que hay una gran variedad de esquemas de encriptación implementados en biblioteca de criptografía STM32 , ¿hay un esquema de encriptación preferido entre todos estos ¿Qué debo usar para cifrar / descifrar los datos almacenados en la memoria flash externa?

    
pregunta Alex C

1 respuesta

1

No sé si realmente hay alguna métrica que haga que cualquier algoritmo sea "preferido" sobre cualquier otro en lo que respecta a flash, pero sugeriría hacer lo que hacen las unidades flash encriptadas por hardware, y simplemente usar AES-128 / 256 CBC o CTR.

CTR solo usa un contador como fuente, lo que lo hace un poco más rápido y elimina la necesidad de almacenar cada clave individual para cada bloque de 16 bytes en la cadena en la memoria (lo que equivaldría a requerir la misma cantidad de RAM que hay) firmware). En realidad, el CTR convierte un cifrado de bloque en un cifrado de flujo, por lo que es relativamente sencillo escribir cada bloque para destellar a medida que se descifra, lo que minimiza el tiempo empleado en la RAM (y, por lo tanto, el tiempo empleado en ser vulnerable a los ataques de arranque en frío). Se adapta bien al cifrado flash incorporado, y de hecho, el modo CTR es a menudo el esquema de cifrado más fuertemente optimizado en las bibliotecas integradas.

En general, descifrar AES-256 es un 40% más lento que AES-128. Por lo tanto, en mi opinión, hay pocas ventajas de usar AES-128 sobre 256.

En cuanto al tiempo de descifrado real, creo que puede estar sobreestimando enormemente lo difícil que es esto realmente.

Por un lado, los aceleradores de AES realmente solo rinden alrededor de una velocidad 8 veces mayor en el STM32, por lo que hacerlo en software no es incluso mucho más lento.

Para AES-256, la mayoría de las bibliotecas que encontré tardaron alrededor de 1600-2000 ciclos por bloque descifrado. No sé cuál es la velocidad de su reloj, pero suponiendo que en el peor de los casos, para 1 MB, serían 131,072,000 ciclos de reloj. Dependiendo de su STM32 exacto, eso podría ser desde 2 segundos hasta 500 ms. Pero, para ser claros, en general, incluso el software AES-256 aún se mide en MB / s en la plataforma STM32. Probablemente no sea mucho más que 1-1.5MB / s, pero aún así es MB / s.

Y, puede obtener bibliotecas solo para ensamblaje capaces de realizar AES-128 (lo cual, en mi opinión, también es lo suficientemente bueno, si realmente desea hasta el último bit de velocidad) en menos de 700 ciclos por bloque. Consulte enlace

Pero, independientemente, no es un sumidero masivo de tiempo para descifrar 1 MB de bloques AES. AES es probablemente lo más cercano a un algoritmo de encriptación "preferido" que obtendrá, principalmente porque uno de los criterios principales que se usó para elegir qué algoritmo se usaría para AES (por parte del Ejército de los EE. UU.) Fue el rendimiento. Por lo tanto, es poco probable que otros esquemas de encriptación sean más rápidos que AES, a menos que ofrezcan una seguridad significativamente menor como compensación.

    
respondido por el metacollin

Lea otras preguntas en las etiquetas