Planeo crear un programa de cifrado para un dispositivo integrado con las siguientes características:
- La CPU es compatible con Intel 80186 @ ~ 20 MHz
- 128 KB de RAM, de los cuales tengo ~ 20 KB a mi disposición para fines de cifrado
- el tamaño binario de la aplicación está limitado a 128 KB, pero me gustaría mantener la parte de cifrado < 16 KB
- almacenamiento persistente en la memoria Flash
Estos son los requisitos:
- cifrar archivos de texto pequeños y mapas de bits < 32 KB
- Siempre puedo descifrar todo el archivo a la memoria RAM, es decir, no necesito acceso aleatorio
- los archivos encriptados no están "bloqueados" por el hardware, es decir, se pueden transferir a una PC en cualquier momento, por lo que quiero protegerme contra alguien que roba el dispositivo e intenta descifrar los datos
- No me preocupan las vulnerabilidades de software, los registradores de teclado, etc. (suponga que nunca le presto el dispositivo a nadie y lo guardo debajo de mi almohada por la noche) y también asumo que la NSA no ingresa a mi casa para cloroformarme e instalar un exploit dirigido)
Estoy lejos de ser un experto en criptografía, pero pasé un tiempo leyendo Wikipedia en AES, bloqueando modos de cifrado y algoritmos de derivación de claves, y también leí " Si está escribiendo las letras AES en su código, lo está haciendo mal ". Todo esto me ha hecho dudar de si puedo tener éxito debido a las limitaciones del hardware y mi conocimiento superficial del tema, pero lo intentaré.
Los siguientes pasos alinean lo que planeo hacer:
- Planeo seguir el procedimiento básico que se describe en en esta respuesta , es decir: encriptación con AES en modo CBC, Derivación clave con PBKDF2, sal aleatoria, IV aleatoria.
- Como preferiría AES-256 en lugar de AES-128, usaría PBKDF2 con SHA-512 para poder obtener una clave de doble longitud.
- No hay una fuente confiable de números aleatorios en el dispositivo integrado, por lo que mi plan es que el usuario genere la clave aleatoria (k1) en una PC y la transfiera (probablemente al escribirla manualmente). Esto no debería ser un problema porque solo ocurre una vez, es decir, uso la misma clave (k1) para cifrar cualquier número de archivos.
- El juego / ensayo "Si estás escribiendo las letras AES en tu código, lo estás haciendo mal" señala los peligros de un atacante que tiene control sobre el proceso de encriptación, es decir, que puede suministrar texto simple arbitrario y tiene está encriptado, porque esto permite todo tipo de ataques de canal lateral como "error oracle". ¿Tengo razón al suponer que esto no es un problema para mí porque el atacante solo puede ver mis archivos cifrados?
- Entiendo que debo generar un IV y sal aleatorios para cada cifrado individual para evitar resultados idénticos para texto sin formato idéntico. Pero, ¿la IV y la sal tienen que ser criptográficamente fuertes números aleatorios? Lo mejor que puedo hacer sería un Mersenne Twister (o preferiblemente algo más eficiente) sembrado con hash (concat (tiempo, voltaje de batería)); ¿Pero es esto necesario en absoluto? De todos modos, almaceno IV y sal en texto simple, así que solo debo asegurarme de que sean diferentes cada vez, no de preocuparme por su capacidad de predicción.
- Planeo usar esta implementación o una de las implementaciones vinculadas aquí , por supuesto, después de verificarlas con los vectores de prueba NIST. ¿Hay algo más que deba verificar al elegir una implementación?
Estaré agradecido por los comentarios que me dicen qué partes están mal, no están seguras o deberían mejorarse. Además, si hay una implementación AES-256 confiable para Intel 80186, me encantaría saberlo. Y, por último, si crees que es inútil, no dudes en decírmelo.