Cómo generar vectores de inicialización correctamente

1

Estoy trabajando en un proyecto que divide archivos grandes en varios bloques cifrados de tamaño fijo (por ejemplo, 4KiB). Esos bloques se utilizarán para ser almacenados de forma persistente en un dispositivo de almacenamiento.

Los bloques se cifran simétricamente y cada bloque tiene su propio vector de inicialización. Desafortunadamente, no estoy seguro de cómo "generar" esos vectores de inicialización correctamente:

Como se explica aquí y here hay varios algoritmos de generación de vectores de inicialización diferentes. Obviamente, debe distinguirse entre los privados (por ejemplo, ESSIV) y los públicos (por ejemplo, Plain). También leí que los algoritmos IV como Plain no deberían combinarse con el modo de operación CBC.

¿Qué algoritmo de generación IV debo usar? O en otras palabras: ¿Qué no debo hacer definitivamente?

No quiero usar nonces aleatorios para cada bloque, ya que esos nonces tendrían que ser almacenados en algún lugar, un algoritmo de generación IV sería mucho más cómodo para mí.

    
pregunta rralf 08.01.2014 - 22:43
fuente

1 respuesta

1

TL; DR, los requisitos particulares de las IV dependen del modo de cifrado que esté utilizando. El único atributo común es que todos los IVs deben ser únicos.

En modos como CTR y GCM, la unicidad es el único requisito. La IV en este caso también se conoce comúnmente como nonce (es decir, un "número usado una vez"). Incluso un simple contador sería suficiente, siempre y cuando se garantice que nunca generará un duplicado (incluso en varias máquinas, o en caso de falla del software).

En modos como CBC, el IV debe ser indistinguible del azar por un adversario.

Para IVs con un tamaño suficientemente grande (por ejemplo, al menos 128 bits), un generador de números aleatorios criptográficamente seguro (CSPRNG) generalmente se considera suficiente. Para los algoritmos que involucran IVs que son lo suficientemente pequeños como para que las colisiones aleatorias sean probables (por ejemplo, Salsa20 tiene un nonce de 64 bits), un CSPRNG no es apropiado ya que generaría colisiones. Otro escenario donde un CSPRNG podría no ser utilizable es en dispositivos integrados, que pueden no tener la capacidad de generar números suficientemente aleatorios en hardware.

    
respondido por el Stephen Touset 08.01.2014 - 23:03
fuente

Lea otras preguntas en las etiquetas