Para el propósito de la herramienta Estoy escribiendo actualmente , necesito realizar algún cifrado / descifrado AES en alguna entrada. Es como una tubería: usted alimenta sus datos, ejecuta el algoritmo y lo pasa al siguiente modificador.
Estoy acostumbrado a openssl enc -aes-256-cbc para cifrar y descifrar todo. Mi comprensión de esto es que primero deriva la clave que ingresa usando algún tipo de pbkdf-sha1 con unos 8 bytes generados salt , luego derive el iv del derived key + salt .
Obviamente, solo funciona con OpenSSL ya que no pude encontrar ningún estándar sobre cómo comunicar, o escribir en un archivo, los parámetros iv y salt . Esperaba algún tipo de RFC (como para los parámetros de curva elíptica) pero no hubo suerte.
Mi idea es tener un encabezado de 64 bytes: salt + iv primero en el archivo, luego va seguido por los datos cifrados. Usaré salt con pbkdf2-sha256 para derivar la clave.
Los encabezados no tienen una longitud fija, al ajustar los parámetros correctos al iniciar el programa, se establecerán salt y iv en los valores correctos.
No quiero cometer ningún error. Me sorprendió cómo podría ser el enlace más débil y lo fácil que es recuperar una contraseña de una derivación de clave errónea y / o generación IV.
Estoy bastante seguro de que cada implementación de aes hace rodar su propio protocolo sobre parámetros. Y creo que es triste.
Por supuesto, usaré crypto/aes de Go y su pbkdf2 , tomando siempre la fuente aleatoria de crypto/rand y no math/rand .
Para resumir:
-
¿Hay algún estándar para tener parámetros AES como
saltyiv? -
¿Debo generar el
ivo derivarlo delsalt || dk?
EDIT
Olvidé mencionar que iba a utilizar PKCS 5#2.0 que especifica cómo derivar la clave, pero esta pregunta fue más hacia las mejores prácticas en el almacenamiento de iv y salt para una compatibilidad más amplia.